From 4558110dfbd43e716050e06ef526849dcf217dfd Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 11 Mar 2019 18:21:09 +0000 Subject: [PATCH 001/608] aaaa what did I doooo Github pains me greatly --- code/__DEFINES/reagents.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index f8f59a367f..ccfbd1a627 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -2,6 +2,11 @@ #define LIQUID 2 #define GAS 3 +#define REAGENT_NORMAL_PH 7.000 +#define REAGENT_PH_ACCURACY 0.001 +#define REAGENT_PURITY_ACCURACY 0.001 +#define DEFAULT_SPECIFIC_HEAT 200 + // container_type defines #define INJECTABLE (1<<0) // Makes it possible to add reagents through droppers and syringes. #define DRAWABLE (1<<1) // Makes it possible to remove reagents through syringes. From 8e2775bbe3baec8092790892f75b1bdfdf446c65 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 14 Mar 2019 03:27:25 +0000 Subject: [PATCH 002/608] A few changes (mix edit for Neko) MeowMeowMeowMeowMeowMeowMeow --- .../chemistry/Fermi_Chemistry_notes.txt | 54 +++++++++ code/modules/reagents/chemistry/holder.dm | 106 ++++++++++-------- .../reagents/chemistry/recipes/medicine.dm | 13 +++ tgstation.dme | 7 +- 4 files changed, 130 insertions(+), 50 deletions(-) create mode 100644 code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt diff --git a/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt b/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt new file mode 100644 index 0000000000..36b4d169aa --- /dev/null +++ b/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt @@ -0,0 +1,54 @@ +Cit/main/Chemistry notes + +SEE README.MD FOR FUNCTIONS + +~Main folder: \ss13\Citadel-Station-13\code\modules\reagents\chemistry~ + +~Recipies: \ss13\Citadel-Station-13\code\modules\reagents\chemistry\recipes~ +This contains the reaction recipies and thats it. +name, id, results, required_reagents, required_catalysts, mix_message, required_temp +To add: a lot + +eg:{ + /datum/chemical_reaction/charcoal + name = "Charcoal" + id = "charcoal" + results = list("charcoal" = 2) + required_reagents = list("ash" = 1, "sodiumchloride" = 1) + mix_message = "The mixture yields a fine black powder." + required_temp = 380 + required_catalysts = list("plasma" = 5) + } + +How the end state should look:{ + /datum/chemical_reaction/bicaridine + name = "Bicaridine" + id = "bicaridine" + results = list("bicaridine" = 3) + required_reagents = list("carbon" = 1, "oxygen" = 1, "sugar" = 1) + OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reations + OptimalTempMax = 500 // Upper end for above + ExplodeTemp = 550 //Temperature at which reaction explodes + OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reations (Plateu phase) + OptimalpHMax = 9.5 // Higest value for above + ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) + CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + CurveSharp = 4 // How sharp the exponential curve is (to the power of value) + ThermicConstant = -2.5 //Temperature change per 1u produced + HIonRelease = 0.01 //pH change per 1u reaction + RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect + optional: + mix_message = "The mixture yields a fine black powder." + required_catalysts = list("plasma" = 5) + + edit: + required_temp = 380 +} + +~\ss13\Citadel-Station-13\code/modules/reagents/chemistry/holder.dm~ +Where the actual reaction takes place, main edit location. +About half way where I've commented (WHY IS THERE NO LINE NUMBERS?!) + + +~\ss13\Citadel-Station-13\tgui\src\interfaces~ +This contains the 4 scripts for generation of the UI for operation of the various chemical equipments. diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 252d0d0dc3..baf1df7788 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -48,6 +48,7 @@ var/maximum_volume = 100 var/atom/my_atom = null var/chem_temp = 150 + var/pH = REAGENT_NORMAL_PH var/last_tick = 1 var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() @@ -182,7 +183,9 @@ var/transfer_amount = T.volume * part if(preserve_data) trans_data = copy_data(T) - R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, no_react = 1) //we only handle reaction after every reagent has been transfered. + + //fermichem Added ph and T.purity + R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. remove_reagent(T.id, transfer_amount) update_total() @@ -242,7 +245,7 @@ if(current_reagent.id == reagent) if(preserve_data) trans_data = current_reagent.data - R.add_reagent(current_reagent.id, amount, trans_data, src.chem_temp) + R.add_reagent(current_reagent.id, amount, trans_data, src.chem_temp, pH, current_reagent.purity, no_react = TRUE) //Fermichem edit remove_reagent(current_reagent.id, amount, 1) break @@ -332,19 +335,19 @@ R.on_update (A) update_total() -/datum/reagents/proc/handle_reactions() - var/list/cached_reagents = reagent_list - var/list/cached_reactions = GLOB.chemical_reactions_list - var/datum/cached_my_atom = my_atom - if(reagents_holder_flags & REAGENT_NOREACT) +/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar + var/list/cached_reagents = reagent_list //a list of the reagents? + var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? + var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! + if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. return //Yup, no reactions here. No siree. - var/reaction_occurred = 0 - do - var/list/possible_reactions = list() - reaction_occurred = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent + var/reaction_occurred = 0 // checks if reaction, binary variable + do //What does do do in byond? It sounds very redundant? is it a while loop? + var/list/possible_reactions = list() //init list + reaction_occurred = 0 // sets it back to 0? + for(var/reagent in cached_reagents) //for reagent in beaker/holder + var/datum/reagent/R = reagent //check to make sure that reagent is there for the reaction list for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id if(!reaction) continue @@ -377,26 +380,30 @@ matching_container = 1 else - if(cached_my_atom.type == C.required_container) + if(cached_my_atom.type == C.required_container)//if the container requires a certain type, and if it equals what it needs? matching_container = 1 if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs return - if(!C.required_other) - matching_other = 1 + if(!C.required_other)//Checks for other things required + matching_other = 1//binary check passes - else if(istype(cached_my_atom, /obj/item/slime_extract)) + else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem var/obj/item/slime_extract/M = cached_my_atom if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this matching_other = 1 else - if(!C.required_container) + if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? matching_container = 1 if(!C.required_other) matching_other = 1 - if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp)) - meets_temp_requirement = 1 + //FermiChem + if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! + //explode function!! + + if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! + meets_temp_requirement = 1//binary pass if(!has_special_react || C.check_special_react(src)) can_special_react = 1 @@ -404,33 +411,44 @@ if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react) possible_reactions += C - if(possible_reactions.len) + if(possible_reactions.len)//does list exist? var/datum/chemical_reaction/selected_reaction = possible_reactions[1] //select the reaction with the most extreme temperature requirements - for(var/V in possible_reactions) - var/datum/chemical_reaction/competitor = V + for(var/V in possible_reactions)//why V, surely that would indicate volume? V is the reaction potential. + var/datum/chemical_reaction/competitor = V //competitor? I think this is theres two of them. Troubling..! if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. - if(competitor.required_temp <= selected_reaction.required_temp) + if(competitor.required_temp <= selected_reaction.required_temp)//only returns with lower if reaction "is cold" var. selected_reaction = competitor else - if(competitor.required_temp >= selected_reaction.required_temp) + if(competitor.required_temp >= selected_reaction.required_temp) //will return with the hotter reacting first. selected_reaction = competitor - var/list/cached_required_reagents = selected_reaction.required_reagents - var/list/cached_results = selected_reaction.results - var/special_react_result = selected_reaction.check_special_react(src) - var/list/multiplier = INFINITY - for(var/B in cached_required_reagents) - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) + var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list + var/list/cached_results = selected_reaction.results//resultant chemical list + var/list/multiplier = INFINITY //Wat + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + + //FermiChem + if (purity != 1)//if purity of reaction isn't 1 + multiplierProd = multiplier * purity //adjusts multiplier to be in line with purity + multiplierTox = multiplier - multiplierProd // + for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1) + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - for(var/P in selected_reaction.results) + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P) - add_reagent(P, cached_results[P]*multiplier, null, chem_temp) + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log + //add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: + //FermiChem + if (purity != 1)//if purity of reaction isn't 1 + add_reagent(P, cached_results[P]*multiplierProd, null, chem_temp)//add reagent function for product + add_reagent(P, cached_results[P]*multiplierTox, null, chem_temp)//add reagent function for product + else + add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! - var/list/seen = viewers(4, get_turf(my_atom)) + var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers var/iconhtml = icon2html(cached_my_atom, seen) if(cached_my_atom) if(!ismob(cached_my_atom)) // No bubbling mobs @@ -440,7 +458,7 @@ for(var/mob/M in seen) to_chat(M, "[iconhtml] [selected_reaction.mix_message]") - if(istype(cached_my_atom, /obj/item/slime_extract)) + if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. var/obj/item/slime_extract/ME2 = my_atom ME2.Uses-- if(ME2.Uses <= 0) // give the notification that the slime core is dead @@ -452,9 +470,9 @@ selected_reaction.on_reaction(src, multiplier, special_react_result) reaction_occurred = 1 - while(reaction_occurred) - update_total() - return 0 + while(reaction_occurred)//while do nothing? + update_total()//Don't know waht this does. + return 0//end! /datum/reagents/proc/isolate_reagent(reagent) var/list/cached_reagents = reagent_list @@ -544,7 +562,7 @@ var/S = specific_heat() chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0) +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ if(!isnum(amount) || !amount) return FALSE @@ -555,7 +573,7 @@ if(!D) WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") return FALSE - + update_total() var/cached_total = total_volume if(cached_total + amount > maximum_volume) @@ -599,9 +617,9 @@ if(data) R.data = data R.on_new(data) - + if(isliving(my_atom)) - R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete + R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete update_total() if(my_atom) my_atom.on_reagent_change(ADD_REAGENT) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index dc7c32d925..deccc47768 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -208,6 +208,19 @@ id = "bicaridine" results = list("bicaridine" = 3) required_reagents = list("carbon" = 1, "oxygen" = 1, "sugar" = 1) + //FermiChem vars: + OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions + OptimalTempMax = 500 // Upper end for above + ExplodeTemp = 550 //Temperature at which reaction explodes + OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 9.5 // Higest value for above + ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) + CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + CurveSharp = 4 // How sharp the exponential curve is (to the power of value) + ThermicConstant = -2.5 //Temperature change per 1u produced + HIonRelease = 0.01 //pH change per 1u reaction + RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect + FermiChem = 1 /datum/chemical_reaction/kelotane name = "Kelotane" diff --git a/tgstation.dme b/tgstation.dme index c43b1a7019..268d4f1ff9 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2528,15 +2528,10 @@ #include "code\modules\research\techweb\all_nodes.dm" #include "code\modules\research\xenobiology\xenobio_camera.dm" #include "code\modules\research\xenobiology\xenobiology.dm" -#include "code\modules\research\xenobiology\crossbreeding\__corecross.dm" -#include "code\modules\research\xenobiology\crossbreeding\_clothing.dm" -#include "code\modules\research\xenobiology\crossbreeding\_misc.dm" -#include "code\modules\research\xenobiology\crossbreeding\_mobs.dm" +#include "code\modules\research\xenobiology\crossbreeding\_corecross.dm" #include "code\modules\research\xenobiology\crossbreeding\_status_effects.dm" -#include "code\modules\research\xenobiology\crossbreeding\_weapons.dm" #include "code\modules\research\xenobiology\crossbreeding\burning.dm" #include "code\modules\research\xenobiology\crossbreeding\charged.dm" -#include "code\modules\research\xenobiology\crossbreeding\chilling.dm" #include "code\modules\research\xenobiology\crossbreeding\consuming.dm" #include "code\modules\research\xenobiology\crossbreeding\industrial.dm" #include "code\modules\research\xenobiology\crossbreeding\prismatic.dm" From 1d9bf5b3b42e0e0a8e60dfccbcd21a0666a24107 Mon Sep 17 00:00:00 2001 From: JMFrench Date: Mon, 1 Apr 2019 18:01:39 +0100 Subject: [PATCH 003/608] Moonsugar Added Moonsugar effects --- code/modules/reagents/chemistry/reagents/other_reagents.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 4b4f118a9c..bb049e74d8 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1251,7 +1251,7 @@ L.remove_trait(TRAIT_SLEEPIMMUNE, id) ..() -/datum/reagent/stimulum/on_mob_life(mob/living/carbon/M) +/datum/reagent/stimulum/on_mob_life(mob/living/carbon/M) M.adjustStaminaLoss(-2*REM, 0) current_cycle++ holder.remove_reagent(id, 0.99) //Gives time for the next tick of life(). @@ -1863,3 +1863,8 @@ description = "The primary precursor for an ancient feline delicacy known as skooma. While it has no notable effects on it's own, mixing it with morphine in a chilled container may yield interesting results." color = "#FAEAFF" taste_description = "synthetic catnip" + +/datum/reagent/moonsugar/on_mob_life(mob/living/carbon/M) + if(prob(20)) + to_chat(M, "You find yourself unable to supress the desire to meow!") + M.emote("nya") From 5113b3aabc9af7f1801b9f324f699a59f809840b Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 12 Apr 2019 00:42:01 +0100 Subject: [PATCH 004/608] Added eigenstate chem effects, need to add reaction vars. --- .../chemistry/reagents/fermi_reagents.dm | 101 ++++++++++++++++++ .../reagents/chemistry/recipes/fermi.dm | 18 ++++ .../code/datums/mood_events/chem_events.dm | 3 + .../chemistry/reagents/fermi_reagents.dm | 101 ++++++++++++++++++ .../reagents/chemistry/recipes/fermi.dm | 0 tgstation.dme | 4 +- 6 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 code/modules/reagents/chemistry/reagents/fermi_reagents.dm create mode 100644 code/modules/reagents/chemistry/recipes/fermi.dm create mode 100644 modular_citadel/code/datums/mood_events/chem_events.dm create mode 100644 modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm create mode 100644 modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm diff --git a/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/code/modules/reagents/chemistry/reagents/fermi_reagents.dm new file mode 100644 index 0000000000..dcf933c183 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -0,0 +1,101 @@ +//Fermichem!! +//Fun chems for all the family + +//MCchem +//BE PE chemical +//Angel/astral chemical + +//eigenstate Chem +//Teleports you to chemistry and back +//OD teleports you randomly around the Station +//Addiction send you on a wild ride and replaces you with an alternative reality version of yourself. + +/datum/reagent/fermi/eigenstate + name = "Eigenstasium" + id = "eigenstate" + description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" + color = "#60A584" // rgb: 96, 0, 255 + overdose_threshold = 20 + addiction_threshold = 30 + metabolization_rate = 0.5 * REAGENTS_METABOLISM + addiction_stage3_end = 40 + addiction_stage4_end = 55 //Incase it's too long + +/obj/item/reagent/fermi/eigenstate/Initialize() + //. = ..() Unneeded? + var/turf/open/T = get_turf(src)//Sets up coordinate of where it was created + +/datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! + if(holder.!has_reagent("eigenstate")) + var/turf/open/T2 = get_turf(src) //sets up return point + to_chat(M, "You feel your wavefunction split!") + do_sparks(5,FALSE,src) + src.forceMove(T) //Teleports to creation location + do_sparks(5,FALSE,src) + +/datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location + do_sparks(5,FALSE,src) + to_chat(M, "You feel your wavefunction collapse!") + src.forceMove(T2) //Teleports home + do_sparks(5,FALSE,src) + +/datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly + if(10) + to_chat(M, "Oh god, you feel like your wavefunction is about to hurl.") + M.Jitter(10) + + if(15 to INFINITY) + do_sparks(5,FALSE,src) + do_teleport(src, get_turf(src), 50, asoundin = 'sound/effects/phasein.ogg') + do_sparks(5,FALSE,src) + M.reagents.remove_reagent("eigenstate",1)//So you're not stuck for 10 minutes teleporting + + + //..() //loop function + + +/datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride. + to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") + M.Jitter(10) + M.nutrition = M.nutrition - (M.nutrition/10) + +/datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M) + to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") + M.Jitter(50) + M.AdjustKnockdown(-40, 0) + for(var/obj/item/I in mob.get_contents()); do_teleport(I, get_turf(I), 5, no_effects=TRUE); + +/datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! + M.Jitter(100) + M.AdjustKnockdown(-40, 0) + to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the eigenstate event horizon.") + + //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in + if(1) + var/typepath = owner.type + clone = new typepath(owner.loc) + var/mob/living/carbon/O = owner + var/mob/living/carbon/C = clone + if(istype(C) && istype(O)) + C.real_name = O.real_name + O.dna.transfer_identity(C) + C.updateappearance(mutcolor_update=1) + visible_message("[M] collapses in from an alternative reality!") + if(2) + do_teleport(C, get_turf(C), 3, no_effects=TRUE) //teleports clone so it's hard to find the real one! + if(3) + qdel(C) //Deletes CLONE, or at least I hope it is. + visible_message("[M] is snapped across to a different alternative reality!") + .=1 //counter + + do_teleport(src, get_turf(src), 3, no_effects=TRUE) //Teleports player randomly + //..() //loop function + +/datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. + M.Jitter(50) + M.AdjustKnockdown(0, 0) + to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your pervious self, sent to god knows what universe.") + mob.emote("me",1,"gasps and gazes around in a bewildered and highly confused fashion!",TRUE) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) + +//eigenstate END diff --git a/code/modules/reagents/chemistry/recipes/fermi.dm b/code/modules/reagents/chemistry/recipes/fermi.dm new file mode 100644 index 0000000000..cc9b5b1915 --- /dev/null +++ b/code/modules/reagents/chemistry/recipes/fermi.dm @@ -0,0 +1,18 @@ +/datum/chemical_reaction/eigenstate + name = "Eigenstasium" + id = "eigenstate" + results = list("Eigenstasium" = ``) + required_reagents = list("bluespace_" = 1, "oxygen" = 1, "sugar" = 1) + //FermiChem vars: + OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions + OptimalTempMax = 500 // Upper end for above + ExplodeTemp = 550 //Temperature at which reaction explodes + OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 9.5 // Higest value for above + ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) + CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + CurveSharp = 4 // How sharp the exponential curve is (to the power of value) + ThermicConstant = -2.5 //Temperature change per 1u produced + HIonRelease = 0.01 //pH change per 1u reaction + RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect + FermiChem = 1 diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm new file mode 100644 index 0000000000..6748838f2f --- /dev/null +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -0,0 +1,3 @@ +/datum/mood_event/eigenstate + mood_change = -1 + description = "Where the hell am I? Is this an alternative reality?\n" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm new file mode 100644 index 0000000000..dcf933c183 --- /dev/null +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -0,0 +1,101 @@ +//Fermichem!! +//Fun chems for all the family + +//MCchem +//BE PE chemical +//Angel/astral chemical + +//eigenstate Chem +//Teleports you to chemistry and back +//OD teleports you randomly around the Station +//Addiction send you on a wild ride and replaces you with an alternative reality version of yourself. + +/datum/reagent/fermi/eigenstate + name = "Eigenstasium" + id = "eigenstate" + description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" + color = "#60A584" // rgb: 96, 0, 255 + overdose_threshold = 20 + addiction_threshold = 30 + metabolization_rate = 0.5 * REAGENTS_METABOLISM + addiction_stage3_end = 40 + addiction_stage4_end = 55 //Incase it's too long + +/obj/item/reagent/fermi/eigenstate/Initialize() + //. = ..() Unneeded? + var/turf/open/T = get_turf(src)//Sets up coordinate of where it was created + +/datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! + if(holder.!has_reagent("eigenstate")) + var/turf/open/T2 = get_turf(src) //sets up return point + to_chat(M, "You feel your wavefunction split!") + do_sparks(5,FALSE,src) + src.forceMove(T) //Teleports to creation location + do_sparks(5,FALSE,src) + +/datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location + do_sparks(5,FALSE,src) + to_chat(M, "You feel your wavefunction collapse!") + src.forceMove(T2) //Teleports home + do_sparks(5,FALSE,src) + +/datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly + if(10) + to_chat(M, "Oh god, you feel like your wavefunction is about to hurl.") + M.Jitter(10) + + if(15 to INFINITY) + do_sparks(5,FALSE,src) + do_teleport(src, get_turf(src), 50, asoundin = 'sound/effects/phasein.ogg') + do_sparks(5,FALSE,src) + M.reagents.remove_reagent("eigenstate",1)//So you're not stuck for 10 minutes teleporting + + + //..() //loop function + + +/datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride. + to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") + M.Jitter(10) + M.nutrition = M.nutrition - (M.nutrition/10) + +/datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M) + to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") + M.Jitter(50) + M.AdjustKnockdown(-40, 0) + for(var/obj/item/I in mob.get_contents()); do_teleport(I, get_turf(I), 5, no_effects=TRUE); + +/datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! + M.Jitter(100) + M.AdjustKnockdown(-40, 0) + to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the eigenstate event horizon.") + + //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in + if(1) + var/typepath = owner.type + clone = new typepath(owner.loc) + var/mob/living/carbon/O = owner + var/mob/living/carbon/C = clone + if(istype(C) && istype(O)) + C.real_name = O.real_name + O.dna.transfer_identity(C) + C.updateappearance(mutcolor_update=1) + visible_message("[M] collapses in from an alternative reality!") + if(2) + do_teleport(C, get_turf(C), 3, no_effects=TRUE) //teleports clone so it's hard to find the real one! + if(3) + qdel(C) //Deletes CLONE, or at least I hope it is. + visible_message("[M] is snapped across to a different alternative reality!") + .=1 //counter + + do_teleport(src, get_turf(src), 3, no_effects=TRUE) //Teleports player randomly + //..() //loop function + +/datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. + M.Jitter(50) + M.AdjustKnockdown(0, 0) + to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your pervious self, sent to god knows what universe.") + mob.emote("me",1,"gasps and gazes around in a bewildered and highly confused fashion!",TRUE) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) + +//eigenstate END diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tgstation.dme b/tgstation.dme index 268d4f1ff9..b14ffbc44c 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2528,7 +2528,6 @@ #include "code\modules\research\techweb\all_nodes.dm" #include "code\modules\research\xenobiology\xenobio_camera.dm" #include "code\modules\research\xenobiology\xenobiology.dm" -#include "code\modules\research\xenobiology\crossbreeding\_corecross.dm" #include "code\modules\research\xenobiology\crossbreeding\_status_effects.dm" #include "code\modules\research\xenobiology\crossbreeding\burning.dm" #include "code\modules\research\xenobiology\crossbreeding\charged.dm" @@ -2773,6 +2772,7 @@ #include "modular_citadel\code\datums\components\material_container.dm" #include "modular_citadel\code\datums\components\phantomthief.dm" #include "modular_citadel\code\datums\components\souldeath.dm" +#include "modular_citadel\code\datums\mood_events\chem_events.dm" #include "modular_citadel\code\datums\mood_events\generic_negative_events.dm" #include "modular_citadel\code\datums\mood_events\generic_positive_events.dm" #include "modular_citadel\code\datums\mood_events\moodular.dm" @@ -2954,7 +2954,9 @@ #include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm" #include "modular_citadel\code\modules\projectiles\projectile\energy.dm" #include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm" +#include "modular_citadel\code\modules\reagents\chemistry\recipies\fermi.dm" #include "modular_citadel\code\modules\reagents\reagent container\cit_kegs.dm" #include "modular_citadel\code\modules\reagents\reagent container\hypospraymkii.dm" #include "modular_citadel\code\modules\reagents\reagent container\hypovial.dm" From f059a19d8bcb91473b115239daa5c788195de41d Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 12 Apr 2019 00:44:54 +0100 Subject: [PATCH 005/608] Made plastic&metamaterial beakers slightly larger cause no one uses them --- .../chemistry/reagents/fermi_reagents.dm | 101 ------------------ .../reagents/chemistry/recipes/fermi.dm | 18 ---- .../reagents/reagent_containers/glass.dm | 12 +-- 3 files changed, 6 insertions(+), 125 deletions(-) delete mode 100644 code/modules/reagents/chemistry/reagents/fermi_reagents.dm delete mode 100644 code/modules/reagents/chemistry/recipes/fermi.dm diff --git a/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/code/modules/reagents/chemistry/reagents/fermi_reagents.dm deleted file mode 100644 index dcf933c183..0000000000 --- a/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ /dev/null @@ -1,101 +0,0 @@ -//Fermichem!! -//Fun chems for all the family - -//MCchem -//BE PE chemical -//Angel/astral chemical - -//eigenstate Chem -//Teleports you to chemistry and back -//OD teleports you randomly around the Station -//Addiction send you on a wild ride and replaces you with an alternative reality version of yourself. - -/datum/reagent/fermi/eigenstate - name = "Eigenstasium" - id = "eigenstate" - description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" - color = "#60A584" // rgb: 96, 0, 255 - overdose_threshold = 20 - addiction_threshold = 30 - metabolization_rate = 0.5 * REAGENTS_METABOLISM - addiction_stage3_end = 40 - addiction_stage4_end = 55 //Incase it's too long - -/obj/item/reagent/fermi/eigenstate/Initialize() - //. = ..() Unneeded? - var/turf/open/T = get_turf(src)//Sets up coordinate of where it was created - -/datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! - if(holder.!has_reagent("eigenstate")) - var/turf/open/T2 = get_turf(src) //sets up return point - to_chat(M, "You feel your wavefunction split!") - do_sparks(5,FALSE,src) - src.forceMove(T) //Teleports to creation location - do_sparks(5,FALSE,src) - -/datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location - do_sparks(5,FALSE,src) - to_chat(M, "You feel your wavefunction collapse!") - src.forceMove(T2) //Teleports home - do_sparks(5,FALSE,src) - -/datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly - if(10) - to_chat(M, "Oh god, you feel like your wavefunction is about to hurl.") - M.Jitter(10) - - if(15 to INFINITY) - do_sparks(5,FALSE,src) - do_teleport(src, get_turf(src), 50, asoundin = 'sound/effects/phasein.ogg') - do_sparks(5,FALSE,src) - M.reagents.remove_reagent("eigenstate",1)//So you're not stuck for 10 minutes teleporting - - - //..() //loop function - - -/datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride. - to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") - M.Jitter(10) - M.nutrition = M.nutrition - (M.nutrition/10) - -/datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M) - to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") - M.Jitter(50) - M.AdjustKnockdown(-40, 0) - for(var/obj/item/I in mob.get_contents()); do_teleport(I, get_turf(I), 5, no_effects=TRUE); - -/datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! - M.Jitter(100) - M.AdjustKnockdown(-40, 0) - to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the eigenstate event horizon.") - - //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in - if(1) - var/typepath = owner.type - clone = new typepath(owner.loc) - var/mob/living/carbon/O = owner - var/mob/living/carbon/C = clone - if(istype(C) && istype(O)) - C.real_name = O.real_name - O.dna.transfer_identity(C) - C.updateappearance(mutcolor_update=1) - visible_message("[M] collapses in from an alternative reality!") - if(2) - do_teleport(C, get_turf(C), 3, no_effects=TRUE) //teleports clone so it's hard to find the real one! - if(3) - qdel(C) //Deletes CLONE, or at least I hope it is. - visible_message("[M] is snapped across to a different alternative reality!") - .=1 //counter - - do_teleport(src, get_turf(src), 3, no_effects=TRUE) //Teleports player randomly - //..() //loop function - -/datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. - M.Jitter(50) - M.AdjustKnockdown(0, 0) - to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your pervious self, sent to god knows what universe.") - mob.emote("me",1,"gasps and gazes around in a bewildered and highly confused fashion!",TRUE) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) - -//eigenstate END diff --git a/code/modules/reagents/chemistry/recipes/fermi.dm b/code/modules/reagents/chemistry/recipes/fermi.dm deleted file mode 100644 index cc9b5b1915..0000000000 --- a/code/modules/reagents/chemistry/recipes/fermi.dm +++ /dev/null @@ -1,18 +0,0 @@ -/datum/chemical_reaction/eigenstate - name = "Eigenstasium" - id = "eigenstate" - results = list("Eigenstasium" = ``) - required_reagents = list("bluespace_" = 1, "oxygen" = 1, "sugar" = 1) - //FermiChem vars: - OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions - OptimalTempMax = 500 // Upper end for above - ExplodeTemp = 550 //Temperature at which reaction explodes - OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) - OptimalpHMax = 9.5 // Higest value for above - ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) - CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharp = 4 // How sharp the exponential curve is (to the power of value) - ThermicConstant = -2.5 //Temperature change per 1u produced - HIonRelease = 0.01 //pH change per 1u reaction - RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect - FermiChem = 1 diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 1912e9fe9d..2dc5059eb2 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -167,12 +167,12 @@ /obj/item/reagent_containers/glass/beaker/plastic name = "x-large beaker" - desc = "An extra-large beaker. Can hold up to 120 units." + desc = "An extra-large beaker. Can hold up to 150 units." icon_state = "beakerwhite" materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000) - volume = 120 + volume = 150 amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,60,120) + possible_transfer_amounts = list(5,10,15,20,25,30,60,120, 150) /obj/item/reagent_containers/glass/beaker/plastic/update_icon() icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states @@ -181,12 +181,12 @@ /obj/item/reagent_containers/glass/beaker/meta name = "metamaterial beaker" - desc = "A large beaker. Can hold up to 180 units." + desc = "A large beaker. Can hold up to 200 units." icon_state = "beakergold" materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000, MAT_GOLD=1000, MAT_TITANIUM=1000) - volume = 180 + volume = 200 amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,60,120,180) + possible_transfer_amounts = list(5,10,15,20,25,30,60,120,150,200) /obj/item/reagent_containers/glass/beaker/noreact name = "cryostasis beaker" From 28ffc996f72c4b9a68a07fbdc068df7cd6146233 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 12 Apr 2019 05:10:00 +0100 Subject: [PATCH 006/608] Added synthetic-derived growth factor amonst some bugfixes. --- .../chemistry/Fermi_Chemistry_notes.txt | 4 + .../reagents/reagent_containers/glass.dm | 2 +- .../code/datums/mood_events/chem_events.dm | 2 +- .../code/datums/status_effects/chems.dm | 25 ++++++ .../chemistry/reagents/fermi_reagents.dm | 84 +++++++++++++++++-- .../reagents/chemistry/recipes/fermi.dm | 46 ++++++++++ tgstation.dme | 1 + 7 files changed, 153 insertions(+), 11 deletions(-) create mode 100644 modular_citadel/code/datums/status_effects/chems.dm diff --git a/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt b/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt index 36b4d169aa..ac40b9ddd9 100644 --- a/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt +++ b/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt @@ -3,6 +3,7 @@ Cit/main/Chemistry notes SEE README.MD FOR FUNCTIONS ~Main folder: \ss13\Citadel-Station-13\code\modules\reagents\chemistry~ +~ADD NEW FILES TO tgstation.dme~ ~Recipies: \ss13\Citadel-Station-13\code\modules\reagents\chemistry\recipes~ This contains the reaction recipies and thats it. @@ -49,6 +50,9 @@ How the end state should look:{ Where the actual reaction takes place, main edit location. About half way where I've commented (WHY IS THERE NO LINE NUMBERS?!) +~\ss13\Citadel-Station-13\code/modules/reagents/chemistry/reagents~ +Where what the reactions do, the code that sets what they do. + ~\ss13\Citadel-Station-13\tgui\src\interfaces~ This contains the 4 scripts for generation of the UI for operation of the various chemical equipments. diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 2dc5059eb2..58085f3497 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -172,7 +172,7 @@ materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000) volume = 150 amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,60,120, 150) + possible_transfer_amounts = list(5,10,15,20,25,30,60,120,150) /obj/item/reagent_containers/glass/beaker/plastic/update_icon() icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index 6748838f2f..b1280c3559 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -1,3 +1,3 @@ /datum/mood_event/eigenstate mood_change = -1 - description = "Where the hell am I? Is this an alternative reality?\n" + description = "Where the hell am I? Is this an alternative dimension ?\n" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm new file mode 100644 index 0000000000..8a7222d352 --- /dev/null +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -0,0 +1,25 @@ +/datum/status_effect/chem/SGDF + id = "SGDF" + var/mob/living/clone + +/datum/status_effect/chem/SGDF/on_apply() + var/typepath = owner.type + clone = new typepath(owner.loc) + var/mob/living/carbon/O = owner + var/mob/living/carbon/C = clone + if(istype(C) && istype(O)) + C.real_name = O.real_name + O.dna.transfer_identity(C) + C.updateappearance(mutcolor_update=1) + return ..() + +/datum/status_effect/chem/SGDF/tick() + if(owner.stat == DEAD) + if(clone && clone.stat != DEAD) + if(owner.mind) + owner.mind.transfer_to(clone) + owner.visible_message("Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") + clone = null + if(!clone || clone.stat == DEAD) + to_chat(owner, "[linked_extract] desperately tries to move your soul to a living body, but can't find one!") + ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index dcf933c183..269bd86009 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -24,6 +24,7 @@ /obj/item/reagent/fermi/eigenstate/Initialize() //. = ..() Unneeded? var/turf/open/T = get_turf(src)//Sets up coordinate of where it was created + ..() /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! if(holder.!has_reagent("eigenstate")) @@ -32,12 +33,14 @@ do_sparks(5,FALSE,src) src.forceMove(T) //Teleports to creation location do_sparks(5,FALSE,src) + ..() /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location do_sparks(5,FALSE,src) to_chat(M, "You feel your wavefunction collapse!") src.forceMove(T2) //Teleports home do_sparks(5,FALSE,src) + ..() /datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly if(10) @@ -49,6 +52,7 @@ do_teleport(src, get_turf(src), 50, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) M.reagents.remove_reagent("eigenstate",1)//So you're not stuck for 10 minutes teleporting + ..() //..() //loop function @@ -58,12 +62,14 @@ to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") M.Jitter(10) M.nutrition = M.nutrition - (M.nutrition/10) + ..() /datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M) to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") M.Jitter(50) M.AdjustKnockdown(-40, 0) for(var/obj/item/I in mob.get_contents()); do_teleport(I, get_turf(I), 5, no_effects=TRUE); + ..() /datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! M.Jitter(100) @@ -72,15 +78,19 @@ //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in if(1) - var/typepath = owner.type - clone = new typepath(owner.loc) - var/mob/living/carbon/O = owner + var/typepath = M.type + clone = new typepath(M.loc) + //var/mob/living/carbon/O = M var/mob/living/carbon/C = clone - if(istype(C) && istype(O)) - C.real_name = O.real_name - O.dna.transfer_identity(C) - C.updateappearance(mutcolor_update=1) - visible_message("[M] collapses in from an alternative reality!") + C.appearance = M.appearance + + //Incase Kevin breaks my code: + //if(istype(C) && istype(O)) + // C.real_name = O.real_name + // O.dna.transfer_identity(C) + // C.updateappearance(mutcolor_update=1) + + visible_message("[M] collapses in from an alternative reality!") if(2) do_teleport(C, get_turf(C), 3, no_effects=TRUE) //teleports clone so it's hard to find the real one! if(3) @@ -89,7 +99,7 @@ .=1 //counter do_teleport(src, get_turf(src), 3, no_effects=TRUE) //Teleports player randomly - //..() //loop function + ..() //loop function /datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. M.Jitter(50) @@ -97,5 +107,61 @@ to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your pervious self, sent to god knows what universe.") mob.emote("me",1,"gasps and gazes around in a bewildered and highly confused fashion!",TRUE) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) + ..() //eigenstate END + +//Clone serum #chemClone +/datum/reagent/fermi/SGDF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. + //Setup clone + + + var/list/candidates = pollCandidatesForMob("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, SM, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies + if(LAZYLEN(candidates)) + + //var/typepath = owner.type + //clone = new typepath(owner.loc) + var/typepath = M.type + clone = new typepath(M.loc) + //var/mob/living/carbon/O = owner + var/mob/living/carbon/O = M + var/mob/living/carbon/SM = clone + if(istype(SM) && istype(O)) + SM.real_name = O.real_name + O.dna.transfer_identity(SM) + SM.updateappearance(mutcolor_update=1) + + var/mob/dead/observer/C = pick(candidates) + SM.key = C.key + SM.mind.enslave_mind_to_creator(user) + SM.sentience_act() + to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") + to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independance, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") + to_chat(O, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") + visible_message("[O] suddenly shudders, and splits into two identical twins!") + SM.copy_known_languages_from(user, FALSE) + //after_success(user, SM) + //qdel(src) + else + if(20) + O.apply_status_effect(var/datum/status_effect/chem/SGDF) + + ..() + + +//Breast englargement +/datum/reagent/fermi/BElarger + name = "Eigenstasium" + id = "eigenstate" + description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." + color = "#60A584" // rgb: 96, 0, 255 + overdose_threshold = 12 + +/datum/reagent/fermi/BElarger/overdose_start(mob/living/M) //Turns you into a female if male and ODing + if(M.gender == MALE) + M.gender = FEMALE + M.visible_message("[user] suddenly looks more feminine!", "You suddenly feel more feminine!") + + if(M.gender == FEMALE) + M.gender = FEMALE + M.visible_message("[user] suddenly looks more masculine!", "You suddenly feel more masculine!") diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index e69de29bb2..fbfb09b355 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -0,0 +1,46 @@ +//TO TWEAK: + +/datum/chemical_reaction/eigenstate + name = "Eigenstasium" + id = "eigenstate" + results = list("eigenstate" = `1`) + required_reagents = list("bluespace" = 1, "stable_plasma" = 1, "sugar" = 1) + //FermiChem vars: + OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions + OptimalTempMax = 500 // Upper end for above + ExplodeTemp = 550 //Temperature at which reaction explodes + OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 9.5 // Higest value for above + ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) + CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + CurveSharp = 4 // How sharp the exponential curve is (to the power of value) + ThermicConstant = -2.5 //Temperature change per 1u produced + HIonRelease = 0.01 //pH change per 1u reaction + RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect + FermiChem = 1 + +//serum +/datum/chemical_reaction/SDGF + name = "synthetic-derived growth factor" + id = "SDGF" + results = list("SDGF" = `3`) + required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) + +/datum/chemical_reaction/BElarger + name = "" + id = "e" + results = list("Eigenstasium" = `6`) + required_reagents = list("salglu_solution" = 1, "milk" = 5, "synthflesh" = 2, "silicon" = 2, "crocin" = 2) + //FermiChem vars: + OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions + OptimalTempMax = 500 // Upper end for above + ExplodeTemp = 550 //Temperature at which reaction explodes + OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 9.5 // Higest value for above + ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) + CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + CurveSharp = 4 // How sharp the exponential curve is (to the power of value) + ThermicConstant = -2.5 //Temperature change per 1u produced + HIonRelease = 0.01 //pH change per 1u reaction + RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect + FermiChem = 1 diff --git a/tgstation.dme b/tgstation.dme index b14ffbc44c..107d86627a 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2777,6 +2777,7 @@ #include "modular_citadel\code\datums\mood_events\generic_positive_events.dm" #include "modular_citadel\code\datums\mood_events\moodular.dm" #include "modular_citadel\code\datums\mutations\hulk.dm" +#include "modular_citadel\code\datums\status_effects\chems.dm" #include "modular_citadel\code\datums\status_effects\debuffs.dm" #include "modular_citadel\code\datums\traits\neutral.dm" #include "modular_citadel\code\datums\wires\airlock.dm" From a86ef643b40f514916e3b3c4cc1e8c36f6faae42 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Fri, 12 Apr 2019 17:18:23 +0100 Subject: [PATCH 007/608] Mid progress through reaction mechanics. --- code/modules/reagents/chemistry/holder.dm | 11 ++++++----- code/modules/reagents/chemistry/recipes.dm | 6 ++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index baf1df7788..2efc135542 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -380,7 +380,7 @@ matching_container = 1 else - if(cached_my_atom.type == C.required_container)//if the container requires a certain type, and if it equals what it needs? + if(cached_my_atom.type == C.required_container)//if the suspected container is a container matching_container = 1 if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs return @@ -393,7 +393,7 @@ if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this matching_other = 1 else - if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? + if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? Oh, cyro. matching_container = 1 if(!C.required_other) matching_other = 1 @@ -429,9 +429,10 @@ multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) //FermiChem - if (purity != 1)//if purity of reaction isn't 1 - multiplierProd = multiplier * purity //adjusts multiplier to be in line with purity - multiplierTox = multiplier - multiplierProd // + + //if (purity != 1)//if purity of reaction isn't 1 + // multiplierProd = multiplier * purity //adjusts multiplier to be in line with purity + // multiplierTox = multiplier - multiplierProd // for(var/B in cached_required_reagents) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 50006eef62..dba07ed875 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -17,6 +17,12 @@ var/mix_message = "The solution begins to bubble." //The message shown to nearby people upon mixing, if applicable var/mix_sound = 'sound/effects/bubbles.ogg' //The sound played upon mixing, if applicable + //FermiChem! + var/FermiChem = FALSE //If the chemical uses the Fermichem reaction mechanics + var/FermiExplode = FALSE //If the chemical explodes in a special way as a result of + var/ExplodeTemp = 900 //If any reaction is this hot, it explodes! + var/ImpureChem = "toxin" //What chemical is produced with an inpure reaction + /datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, specialreact) return //I recommend you set the result amount to the total volume of all components. From 8e9ea0b506bf63ab9f018e82a2c736549533301c Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 14 Apr 2019 05:31:04 +0100 Subject: [PATCH 008/608] Main reaction loop set up!! (I hope!!) --- .../chemistry/Fermi_Chemistry_notes.txt | 2 +- code/modules/reagents/chemistry/holder.dm | 125 +++++++++++++++--- .../chemistry/reagents/fermi_reagents.dm | 6 +- .../reagents/chemistry/recipes/fermi.dm | 9 +- 4 files changed, 121 insertions(+), 21 deletions(-) diff --git a/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt b/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt index ac40b9ddd9..541c3e71b3 100644 --- a/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt +++ b/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt @@ -33,7 +33,7 @@ How the end state should look:{ OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reations (Plateu phase) OptimalpHMax = 9.5 // Higest value for above ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) - CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + //CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) CurveSharp = 4 // How sharp the exponential curve is (to the power of value) ThermicConstant = -2.5 //Temperature change per 1u produced HIonRelease = 0.01 //pH change per 1u reaction diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 2efc135542..c58030797a 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -53,6 +53,9 @@ var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() var/reagents_holder_flags + //FermiChem + var/purity = 1 + var/ammoReacted = 0 /datum/reagents/New(maximum=100) maximum_volume = maximum @@ -367,6 +370,11 @@ var/has_special_react = C.special_react var/can_special_react = 0 + //FermiChem + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmmount = 0 + for(var/B in cached_required_reagents) if(!has_reagent(B, cached_required_reagents[B])) break @@ -400,6 +408,10 @@ //FermiChem if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! + if (C.FermiExplode == TRUE) + //To be added! + else + FermiExplode() //explode function!! if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! @@ -425,29 +437,104 @@ var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list var/list/cached_results = selected_reaction.results//resultant chemical list var/list/multiplier = INFINITY //Wat + for(var/B in cached_required_reagents) // multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - //FermiChem + //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. + //FermiChem relies on two additional properties; pH and impurity + //Temperature plays into a larger role too. + if (C.FermiChem == TRUE) + message_admins("Hee!!!! Someone is doing a Fermi reaction!!! I'm so excited!!") + //FermiReact(C) + //B is Beaker + //P is product + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - //if (purity != 1)//if purity of reaction isn't 1 - // multiplierProd = multiplier * purity //adjusts multiplier to be in line with purity - // multiplierTox = multiplier - multiplierProd // + while (ammoReacted < multiplier) + //Begin Parse + + //Check extremes first + if (chem_temp > C.ExplodeTemp) + //go to explode proc + ChemExplosion() + + if (pH > 14) OR (pH < 0) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + pHExplosion() + + //For now, purity is handled elsewhere + + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < C.OptimalTempMax) + deltaT = ((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMax)**C.CurveSharpT) + else if + (chem_temp >= C.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < C.OptimalpHMin) + if (pH < (C.OptimalpHMin - C.ReactpHLim)) + deltapH = 0 + else + deltapH = ((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharp)/(C.ReactpHLim**C.CurveSharppH) + //Upper range + else if (pH > C.OptimalpHMin) + if (pH > (C.OptimalpHMin + C.ReactpHLim)) + deltapH = 0 + else + deltapH = (C.ReactpHLim -((pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH) + + //Within mid range + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + deltapH = 0 + + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + //TODO Add CatalystFact + + stepChemAmmount = multiplier * deltaT + P.purity = (P.purity + deltapH) /2 //This should add the purity to the product + + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) + + // End + + selected_reaction.on_reaction(src, multiplier, special_react_result) + + for(var/B in cached_required_reagents) + remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: - for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + ammoReacted = ammoReacted + stepChemAmmount + + reaction_occurred = 1 + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", cached_results[P]*ammoReacted, P)//log + //Standard reaction mechanics: + else: + + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + + for(var/B in cached_required_reagents) + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log + add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log - //add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: - //FermiChem - if (purity != 1)//if purity of reaction isn't 1 - add_reagent(P, cached_results[P]*multiplierProd, null, chem_temp)//add reagent function for product - add_reagent(P, cached_results[P]*multiplierTox, null, chem_temp)//add reagent function for product - else - add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers var/iconhtml = icon2html(cached_my_atom, seen) @@ -475,6 +562,12 @@ update_total()//Don't know waht this does. return 0//end! +/datum/reagents/proc/FermiReact() + return + +/datum/reagents/proc/FermiExplode() + return + /datum/reagents/proc/isolate_reagent(reagent) var/list/cached_reagents = reagent_list for(var/_reagent in cached_reagents) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 269bd86009..9392e56d71 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -4,6 +4,8 @@ //MCchem //BE PE chemical //Angel/astral chemical +//And tips their hat +//Naninte chem //eigenstate Chem //Teleports you to chemistry and back @@ -109,6 +111,8 @@ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) ..() +/datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) + //eigenstate END //Clone serum #chemClone @@ -136,7 +140,7 @@ SM.mind.enslave_mind_to_creator(user) SM.sentience_act() to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") - to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independance, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") + to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") to_chat(O, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") visible_message("[O] suddenly shudders, and splits into two identical twins!") SM.copy_known_languages_from(user, FALSE) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index fbfb09b355..bab77de811 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -13,11 +13,14 @@ OptimalpHMax = 9.5 // Higest value for above ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharp = 4 // How sharp the exponential curve is (to the power of value) + CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) + CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = -2.5 //Temperature change per 1u produced HIonRelease = 0.01 //pH change per 1u reaction RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect - FermiChem = 1 + FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics + var/FermiExplode = FALSE //If the chemical explodes in a special way + var/ImpureChem = "toxin" //What chemical is produced with an inpure reaction //serum /datum/chemical_reaction/SDGF @@ -43,4 +46,4 @@ ThermicConstant = -2.5 //Temperature change per 1u produced HIonRelease = 0.01 //pH change per 1u reaction RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect - FermiChem = 1 + FermiChem = TRUE From ed27c5dfe4e4a476a2320da52b6982d20c6c512b Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 14 Apr 2019 05:31:04 +0100 Subject: [PATCH 009/608] Main reaction loop set up!! (I hope!!) --- .../chemistry/Fermi_Chemistry_notes.txt | 2 +- code/modules/reagents/chemistry/holder.dm | 125 +++++++++++++++--- .../chemistry/reagents/fermi_reagents.dm | 6 +- .../reagents/chemistry/recipes/fermi.dm | 9 +- 4 files changed, 121 insertions(+), 21 deletions(-) diff --git a/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt b/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt index ac40b9ddd9..541c3e71b3 100644 --- a/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt +++ b/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt @@ -33,7 +33,7 @@ How the end state should look:{ OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reations (Plateu phase) OptimalpHMax = 9.5 // Higest value for above ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) - CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + //CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) CurveSharp = 4 // How sharp the exponential curve is (to the power of value) ThermicConstant = -2.5 //Temperature change per 1u produced HIonRelease = 0.01 //pH change per 1u reaction diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 2efc135542..c58030797a 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -53,6 +53,9 @@ var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() var/reagents_holder_flags + //FermiChem + var/purity = 1 + var/ammoReacted = 0 /datum/reagents/New(maximum=100) maximum_volume = maximum @@ -367,6 +370,11 @@ var/has_special_react = C.special_react var/can_special_react = 0 + //FermiChem + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmmount = 0 + for(var/B in cached_required_reagents) if(!has_reagent(B, cached_required_reagents[B])) break @@ -400,6 +408,10 @@ //FermiChem if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! + if (C.FermiExplode == TRUE) + //To be added! + else + FermiExplode() //explode function!! if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! @@ -425,29 +437,104 @@ var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list var/list/cached_results = selected_reaction.results//resultant chemical list var/list/multiplier = INFINITY //Wat + for(var/B in cached_required_reagents) // multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - //FermiChem + //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. + //FermiChem relies on two additional properties; pH and impurity + //Temperature plays into a larger role too. + if (C.FermiChem == TRUE) + message_admins("Hee!!!! Someone is doing a Fermi reaction!!! I'm so excited!!") + //FermiReact(C) + //B is Beaker + //P is product + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - //if (purity != 1)//if purity of reaction isn't 1 - // multiplierProd = multiplier * purity //adjusts multiplier to be in line with purity - // multiplierTox = multiplier - multiplierProd // + while (ammoReacted < multiplier) + //Begin Parse + + //Check extremes first + if (chem_temp > C.ExplodeTemp) + //go to explode proc + ChemExplosion() + + if (pH > 14) OR (pH < 0) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + pHExplosion() + + //For now, purity is handled elsewhere + + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < C.OptimalTempMax) + deltaT = ((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMax)**C.CurveSharpT) + else if + (chem_temp >= C.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < C.OptimalpHMin) + if (pH < (C.OptimalpHMin - C.ReactpHLim)) + deltapH = 0 + else + deltapH = ((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharp)/(C.ReactpHLim**C.CurveSharppH) + //Upper range + else if (pH > C.OptimalpHMin) + if (pH > (C.OptimalpHMin + C.ReactpHLim)) + deltapH = 0 + else + deltapH = (C.ReactpHLim -((pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH) + + //Within mid range + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + deltapH = 0 + + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + //TODO Add CatalystFact + + stepChemAmmount = multiplier * deltaT + P.purity = (P.purity + deltapH) /2 //This should add the purity to the product + + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) + + // End + + selected_reaction.on_reaction(src, multiplier, special_react_result) + + for(var/B in cached_required_reagents) + remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: - for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + ammoReacted = ammoReacted + stepChemAmmount + + reaction_occurred = 1 + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", cached_results[P]*ammoReacted, P)//log + //Standard reaction mechanics: + else: + + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + + for(var/B in cached_required_reagents) + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log + add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log - //add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: - //FermiChem - if (purity != 1)//if purity of reaction isn't 1 - add_reagent(P, cached_results[P]*multiplierProd, null, chem_temp)//add reagent function for product - add_reagent(P, cached_results[P]*multiplierTox, null, chem_temp)//add reagent function for product - else - add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers var/iconhtml = icon2html(cached_my_atom, seen) @@ -475,6 +562,12 @@ update_total()//Don't know waht this does. return 0//end! +/datum/reagents/proc/FermiReact() + return + +/datum/reagents/proc/FermiExplode() + return + /datum/reagents/proc/isolate_reagent(reagent) var/list/cached_reagents = reagent_list for(var/_reagent in cached_reagents) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 269bd86009..9392e56d71 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -4,6 +4,8 @@ //MCchem //BE PE chemical //Angel/astral chemical +//And tips their hat +//Naninte chem //eigenstate Chem //Teleports you to chemistry and back @@ -109,6 +111,8 @@ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) ..() +/datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) + //eigenstate END //Clone serum #chemClone @@ -136,7 +140,7 @@ SM.mind.enslave_mind_to_creator(user) SM.sentience_act() to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") - to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independance, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") + to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") to_chat(O, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") visible_message("[O] suddenly shudders, and splits into two identical twins!") SM.copy_known_languages_from(user, FALSE) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index fbfb09b355..bab77de811 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -13,11 +13,14 @@ OptimalpHMax = 9.5 // Higest value for above ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharp = 4 // How sharp the exponential curve is (to the power of value) + CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) + CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = -2.5 //Temperature change per 1u produced HIonRelease = 0.01 //pH change per 1u reaction RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect - FermiChem = 1 + FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics + var/FermiExplode = FALSE //If the chemical explodes in a special way + var/ImpureChem = "toxin" //What chemical is produced with an inpure reaction //serum /datum/chemical_reaction/SDGF @@ -43,4 +46,4 @@ ThermicConstant = -2.5 //Temperature change per 1u produced HIonRelease = 0.01 //pH change per 1u reaction RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect - FermiChem = 1 + FermiChem = TRUE From a082b3c532491d3d71686935aded6014d6e0c087 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 14 Apr 2019 05:56:38 +0100 Subject: [PATCH 010/608] Fixed purity calculation issue --- code/modules/reagents/chemistry/holder.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index c58030797a..5ede4924dc 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -498,8 +498,10 @@ //TODO Add CatalystFact stepChemAmmount = multiplier * deltaT - P.purity = (P.purity + deltapH) /2 //This should add the purity to the product - + if (ammoReacted > 0) + P.purity = ((P.purity * ammoReacted) + (deltapH * stepChemAmmount)) /(2 * (ammoReacted + stepChemAmmount)) //This should add the purity to the product + else + P.purity = deltapH //Apply pH changes and thermal output of reaction to beaker chem_temp += (C.ThermicConstant * stepChemAmmount) pH += (C.HIonRelease * stepChemAmmount) From eac84788125480861bb5b3c69436f5464e79af0c Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 14 Apr 2019 06:02:35 +0100 Subject: [PATCH 011/608] Minor deltapH tweaks --- code/modules/reagents/chemistry/holder.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 5ede4924dc..716d56d89c 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -488,13 +488,13 @@ deltapH = 0 else deltapH = (C.ReactpHLim -((pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH) - //Within mid range else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) - deltapH = 0 - + deltapH = 1 + //This should never proc: else message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[reagent]' which broke for some reason! ([usr])") //TODO Add CatalystFact stepChemAmmount = multiplier * deltaT From 38aecfadd0c91ecc67dd5b288835fa7fd6c0c516 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 14 Apr 2019 15:58:07 +0100 Subject: [PATCH 012/608] Fixed dme pointer --- tgstation.dme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgstation.dme b/tgstation.dme index 107d86627a..3e6b10e9c2 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2957,7 +2957,7 @@ #include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm" -#include "modular_citadel\code\modules\reagents\chemistry\recipies\fermi.dm" +#include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm" #include "modular_citadel\code\modules\reagents\reagent container\cit_kegs.dm" #include "modular_citadel\code\modules\reagents\reagent container\hypospraymkii.dm" #include "modular_citadel\code\modules\reagents\reagent container\hypovial.dm" From ccdd077a4c4926d4ad8691a6eef3ca12c384855e Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 14 Apr 2019 16:31:26 +0100 Subject: [PATCH 013/608] Bugfixes --- code/modules/reagents/chemistry/holder.dm | 13 ++++--- .../code/datums/status_effects/chems.dm | 36 +++++++++---------- .../chemistry/reagents/fermi_reagents.dm | 12 +++---- tgstation.dme | 1 - 4 files changed, 30 insertions(+), 32 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 716d56d89c..b398c6ae18 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -457,20 +457,19 @@ //Check extremes first if (chem_temp > C.ExplodeTemp) //go to explode proc - ChemExplosion() + FermiExplode() if (pH > 14) OR (pH < 0) //Create chemical sludge eventually(for now just destroy the beaker I guess?) //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - pHExplosion() + FermiExplode() //For now, purity is handled elsewhere //Calculate DeltaT (Deviation of T from optimal) if (chem_temp < C.OptimalTempMax) - deltaT = ((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMax)**C.CurveSharpT) - else if - (chem_temp >= C.OptimalTempMax) + deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMax)**C.CurveSharpT)) + else if (chem_temp >= C.OptimalTempMax) deltaT = 1 else deltaT = 0 @@ -481,13 +480,13 @@ if (pH < (C.OptimalpHMin - C.ReactpHLim)) deltapH = 0 else - deltapH = ((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharp)/(C.ReactpHLim**C.CurveSharppH) + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharp)/(C.ReactpHLim**C.CurveSharppH)) //Upper range else if (pH > C.OptimalpHMin) if (pH > (C.OptimalpHMin + C.ReactpHLim)) deltapH = 0 else - deltapH = (C.ReactpHLim -((pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH) + deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) //Within mid range else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) deltapH = 1 diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 8a7222d352..a42f5db07a 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -3,23 +3,23 @@ var/mob/living/clone /datum/status_effect/chem/SGDF/on_apply() - var/typepath = owner.type - clone = new typepath(owner.loc) - var/mob/living/carbon/O = owner - var/mob/living/carbon/C = clone - if(istype(C) && istype(O)) - C.real_name = O.real_name - O.dna.transfer_identity(C) - C.updateappearance(mutcolor_update=1) - return ..() + var/typepath = owner.type + clone = new typepath(owner.loc) + var/mob/living/carbon/O = owner + var/mob/living/carbon/C = clone + if(istype(C) && istype(O)) + C.real_name = O.real_name + O.dna.transfer_identity(C) + C.updateappearance(mutcolor_update=1) + return ..() /datum/status_effect/chem/SGDF/tick() - if(owner.stat == DEAD) - if(clone && clone.stat != DEAD) - if(owner.mind) - owner.mind.transfer_to(clone) - owner.visible_message("Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") - clone = null - if(!clone || clone.stat == DEAD) - to_chat(owner, "[linked_extract] desperately tries to move your soul to a living body, but can't find one!") - ..() + if(owner.stat == DEAD) + if(clone && clone.stat != DEAD) + if(owner.mind) + owner.mind.transfer_to(clone) + owner.visible_message("Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") + clone = null + if(!clone || clone.stat == DEAD) + to_chat(owner, "[linked_extract] desperately tries to move your soul to a living body, but can't find one!") + ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 9392e56d71..3d19514334 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -29,12 +29,12 @@ ..() /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! - if(holder.!has_reagent("eigenstate")) - var/turf/open/T2 = get_turf(src) //sets up return point - to_chat(M, "You feel your wavefunction split!") - do_sparks(5,FALSE,src) - src.forceMove(T) //Teleports to creation location - do_sparks(5,FALSE,src) + if (holder.!has_reagent("eigenstate")) + var/turf/open/T2 = get_turf(src) //sets up return point + to_chat(M, "You feel your wavefunction split!") + do_sparks(5,FALSE,src) + src.forceMove(T) //Teleports to creation location + do_sparks(5,FALSE,src) ..() /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location diff --git a/tgstation.dme b/tgstation.dme index 3e6b10e9c2..d7df01ed59 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2957,7 +2957,6 @@ #include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm" -#include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm" #include "modular_citadel\code\modules\reagents\reagent container\cit_kegs.dm" #include "modular_citadel\code\modules\reagents\reagent container\hypospraymkii.dm" #include "modular_citadel\code\modules\reagents\reagent container\hypovial.dm" From bf647c38e8177a87d2185cbe364faed90b7dd548 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 14 Apr 2019 19:52:23 +0100 Subject: [PATCH 014/608] Variables don't work as I thought and it makes me sad. --- code/modules/reagents/chemistry/holder.dm | 25 ++++++++++++++++--- .../reagents/chemistry/recipes/medicine.dm | 13 ---------- .../chemistry/reagents/fermi_reagents.dm | 4 ++- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index d5c44315c5..dd519c638f 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -53,9 +53,6 @@ var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() var/reagents_holder_flags - //FermiChem - var/purity = 1 - var/ammoReacted = 0 /datum/reagents/New(maximum=100) maximum_volume = maximum @@ -369,8 +366,28 @@ var/meets_temp_requirement = 0 var/has_special_react = C.special_react var/can_special_react = 0 + //FermiChem WHY ARE VARIBLES SO ESTRANGED it makes me sad + var/OptimalTempMin = C.OptimalTempMin // Lower area of bell curve for determining heat based rate reactions + var/OptimalTempMax = C.OptimalTempMax + var/ExplodeTemp = C.ExplodeTemp + var/OptimalpHMin = C.OptimalpHMin + var/OptimalpHMax = C.OptimalpHMax + var/ReactpHLim = C.ReactpHLim + //var/CatalystFact = C.CatalystFact + var/CurveSharpT = C.CurveSharpT + var/CurveSharppH = C.CurveSharppH + var/ThermicConstant = C.ThermicConstant + var/HIonRelease = C.HIonRelease + var/RateUpLim = C.RateUpLim + var/FermiChem = C.FermiChem + var/FermiExplod = C.FermiExplod + var/ImpureChem = C.ImpureChem + //FermiChem + var/purity = 1 + var/ammoReacted = 0 + var/deltaT = 0 var/deltapH = 0 var/stepChemAmmount = 0 @@ -459,7 +476,7 @@ //go to explode proc FermiExplode() - if (pH > 14) OR (pH < 0) + if (pH > 14 || pH < 0) //Create chemical sludge eventually(for now just destroy the beaker I guess?) //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) FermiExplode() diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index deccc47768..dc7c32d925 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -208,19 +208,6 @@ id = "bicaridine" results = list("bicaridine" = 3) required_reagents = list("carbon" = 1, "oxygen" = 1, "sugar" = 1) - //FermiChem vars: - OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions - OptimalTempMax = 500 // Upper end for above - ExplodeTemp = 550 //Temperature at which reaction explodes - OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) - OptimalpHMax = 9.5 // Higest value for above - ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) - CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharp = 4 // How sharp the exponential curve is (to the power of value) - ThermicConstant = -2.5 //Temperature change per 1u produced - HIonRelease = 0.01 //pH change per 1u reaction - RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect - FermiChem = 1 /datum/chemical_reaction/kelotane name = "Kelotane" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 3d19514334..7eccf33083 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -29,7 +29,9 @@ ..() /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! - if (holder.!has_reagent("eigenstate")) + if (holder.has_reagent("eigenstate")) + do_sparks(5,FALSE,src) + else var/turf/open/T2 = get_turf(src) //sets up return point to_chat(M, "You feel your wavefunction split!") do_sparks(5,FALSE,src) From 0cee082e81fc0c177513763c5f355040e1ddf887 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 14 Apr 2019 22:57:08 +0100 Subject: [PATCH 015/608] Added default fermichemvals to recipies --- code/modules/reagents/chemistry/holder.dm | 28 +++++++++++++++---- code/modules/reagents/chemistry/recipes.dm | 14 +++++++++- .../reagents/chemistry/recipes/medicine.dm | 13 --------- .../chemistry/reagents/fermi_reagents.dm | 5 +++- 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index d5c44315c5..8d6c4cc102 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -370,6 +370,22 @@ var/has_special_react = C.special_react var/can_special_react = 0 + var/datum/chemical_reaction/C/OptimalTempMin = OptimalTempMin // Lower area of bell curve for determining heat based rate reactions + var/OptimalTempMax = C.OptimalTempMax + var/ExplodeTemp = C.ExplodeTemp + var/OptimalpHMin = C.OptimalpHMin + var/OptimalpHMax = C.OptimalpHMax + var/ReactpHLim = C.ReactpHLim + //var/CatalystFact = C.CatalystFact + var/CurveSharpT = C.CurveSharpT + var/CurveSharppH = C.CurveSharppH + var/ThermicConstant = C.ThermicConstant + var/HIonRelease = C.HIonRelease + var/RateUpLim = C.RateUpLim + var/FermiChem = C.FermiChem + var/FermiExplod = C.FermiExplod + var/ImpureChem = C.ImpureChem + //FermiChem var/deltaT = 0 var/deltapH = 0 @@ -407,8 +423,8 @@ matching_other = 1 //FermiChem - if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! - if (C.FermiExplode == TRUE) + if (chem_temp > ExplodeTemp)//Check to see if reaction is too hot! + if (FermiExplode == TRUE) //To be added! else FermiExplode() @@ -455,11 +471,11 @@ //Begin Parse //Check extremes first - if (chem_temp > C.ExplodeTemp) + if (chem_temp > ExplodeTemp) //go to explode proc FermiExplode() - if (pH > 14) OR (pH < 0) + if (pH > 14 || pH < 0) //Create chemical sludge eventually(for now just destroy the beaker I guess?) //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) FermiExplode() @@ -467,8 +483,8 @@ //For now, purity is handled elsewhere //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMax)**C.CurveSharpT)) + if (chem_temp < OptimalTempMax) + deltaT = (((OptimalTempMin - chem_temp)**CurveSharpT)/((OptimalTempMax - OptimalTempMax)**CurveSharpT)) else if (chem_temp >= C.OptimalTempMax) deltaT = 1 else diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index dba07ed875..a3d70efd2d 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -18,9 +18,21 @@ var/mix_sound = 'sound/effects/bubbles.ogg' //The sound played upon mixing, if applicable //FermiChem! + + var/OptimalTempMin = 200 // Lower area of bell curve for determining heat based rate reactions + var/OptimalTempMax = 800 + var/ExplodeTemp = 900 //If any reaction is this hot, it explodes! + var/OptimalpHMin = 5 + var/OptimalpHMax = 10 + var/ReactpHLim = 3 + //var/CatalystFact = C.CatalystFact + var/CurveSharpT = 2 + var/CurveSharppH = 2 + var/ThermicConstant = 1 + var/HIonRelease = 0.1 + var/RateUpLim = 10 var/FermiChem = FALSE //If the chemical uses the Fermichem reaction mechanics var/FermiExplode = FALSE //If the chemical explodes in a special way as a result of - var/ExplodeTemp = 900 //If any reaction is this hot, it explodes! var/ImpureChem = "toxin" //What chemical is produced with an inpure reaction /datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, specialreact) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index deccc47768..dc7c32d925 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -208,19 +208,6 @@ id = "bicaridine" results = list("bicaridine" = 3) required_reagents = list("carbon" = 1, "oxygen" = 1, "sugar" = 1) - //FermiChem vars: - OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions - OptimalTempMax = 500 // Upper end for above - ExplodeTemp = 550 //Temperature at which reaction explodes - OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) - OptimalpHMax = 9.5 // Higest value for above - ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) - CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharp = 4 // How sharp the exponential curve is (to the power of value) - ThermicConstant = -2.5 //Temperature change per 1u produced - HIonRelease = 0.01 //pH change per 1u reaction - RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect - FermiChem = 1 /datum/chemical_reaction/kelotane name = "Kelotane" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 3d19514334..4dc847150c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -22,6 +22,7 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM addiction_stage3_end = 40 addiction_stage4_end = 55 //Incase it's too long + /obj/item/reagent/fermi/eigenstate/Initialize() //. = ..() Unneeded? @@ -29,7 +30,9 @@ ..() /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! - if (holder.!has_reagent("eigenstate")) + if (holder.has_reagent("eigenstate")) + do_sparks(5,FALSE,src) + else var/turf/open/T2 = get_turf(src) //sets up return point to_chat(M, "You feel your wavefunction split!") do_sparks(5,FALSE,src) From 68813cf12a16c168f7182d1ba1c7076916afb6fc Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 14 Apr 2019 23:11:55 +0100 Subject: [PATCH 016/608] fixed add_reagent --- code/modules/reagents/chemistry/holder.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index b24eb7d946..b7628182a0 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -184,8 +184,9 @@ if(preserve_data) trans_data = copy_data(T) - //fermichem Added ph and T.purity - R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + //fermichem Added ph TODO: add T.purity + R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + //R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. remove_reagent(T.id, transfer_amount) update_total() @@ -245,7 +246,8 @@ if(current_reagent.id == reagent) if(preserve_data) trans_data = current_reagent.data - R.add_reagent(current_reagent.id, amount, trans_data, src.chem_temp, pH, current_reagent.purity, no_react = TRUE) //Fermichem edit + R.add_reagent(current_reagent.id, amount, trans_data, src.chem_temp, pH, no_react = TRUE) //Fermichem edit TODO: add purity + //R.add_reagent(current_reagent.id, amount, trans_data, src.chem_temp, pH, current_reagent.purity, no_react = TRUE) //Fermichem edit remove_reagent(current_reagent.id, amount, 1) break @@ -690,7 +692,7 @@ var/S = specific_heat() chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, pH = 7, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ if(!isnum(amount) || !amount) return FALSE From 3d4245905aa29cbd77808e6242e66b5402659431 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 14 Apr 2019 23:16:18 +0100 Subject: [PATCH 017/608] Accidental double vars --- code/modules/reagents/chemistry/holder.dm | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index b7628182a0..3afe6732eb 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -385,23 +385,6 @@ var/FermiExplod = C.FermiExplod var/ImpureChem = C.ImpureChem - - var/datum/chemical_reaction/C/OptimalTempMin = OptimalTempMin // Lower area of bell curve for determining heat based rate reactions - var/OptimalTempMax = C.OptimalTempMax - var/ExplodeTemp = C.ExplodeTemp - var/OptimalpHMin = C.OptimalpHMin - var/OptimalpHMax = C.OptimalpHMax - var/ReactpHLim = C.ReactpHLim - //var/CatalystFact = C.CatalystFact - var/CurveSharpT = C.CurveSharpT - var/CurveSharppH = C.CurveSharppH - var/ThermicConstant = C.ThermicConstant - var/HIonRelease = C.HIonRelease - var/RateUpLim = C.RateUpLim - var/FermiChem = C.FermiChem - var/FermiExplod = C.FermiExplod - var/ImpureChem = C.ImpureChem - //FermiChem var/purity = 1 var/ammoReacted = 0 From e2fb670314ea36cee067cd5c14826291e89e68fc Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 14 Apr 2019 23:21:59 +0100 Subject: [PATCH 018/608] Fixed spelling of explode --- code/modules/reagents/chemistry/holder.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 3afe6732eb..a959544e49 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -382,7 +382,7 @@ var/HIonRelease = C.HIonRelease var/RateUpLim = C.RateUpLim var/FermiChem = C.FermiChem - var/FermiExplod = C.FermiExplod + var/FermiExplode = C.FermiExplode var/ImpureChem = C.ImpureChem //FermiChem From 3aa92325cf1340e7ac26cc7740be263356b79a7b Mon Sep 17 00:00:00 2001 From: Thalpy Date: Mon, 15 Apr 2019 01:05:32 +0100 Subject: [PATCH 019/608] Jubiously day, I fixed the reaction, mostly and xeno broke --- code/modules/reagents/chemistry/holder.dm | 147 +-- .../reagents/chemistry/holderBackup.dm | 952 ++++++++++++++++++ 2 files changed, 1029 insertions(+), 70 deletions(-) create mode 100644 code/modules/reagents/chemistry/holderBackup.dm diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index a959544e49..ec8de8380f 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -338,6 +338,13 @@ update_total() /datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar + //FermiChem + var/purity = 1 + var/ammoReacted = 0 + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmmount = 0 + var/list/cached_reagents = reagent_list //a list of the reagents? var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! @@ -369,6 +376,7 @@ var/has_special_react = C.special_react var/can_special_react = 0 //FermiChem WHY ARE VARIBLES SO ESTRANGED it makes me sad + /* var/OptimalTempMin = C.OptimalTempMin // Lower area of bell curve for determining heat based rate reactions var/OptimalTempMax = C.OptimalTempMax var/ExplodeTemp = C.ExplodeTemp @@ -384,14 +392,16 @@ var/FermiChem = C.FermiChem var/FermiExplode = C.FermiExplode var/ImpureChem = C.ImpureChem - + */ //FermiChem + /* var/purity = 1 var/ammoReacted = 0 var/deltaT = 0 var/deltapH = 0 var/stepChemAmmount = 0 + */ for(var/B in cached_required_reagents) if(!has_reagent(B, cached_required_reagents[B])) @@ -425,12 +435,6 @@ matching_other = 1 //FermiChem - if (chem_temp > ExplodeTemp)//Check to see if reaction is too hot! - if (FermiExplode == TRUE) - //To be added! - else - FermiExplode() - //explode function!! if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! meets_temp_requirement = 1//binary pass @@ -454,6 +458,7 @@ selected_reaction = competitor var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list var/list/cached_results = selected_reaction.results//resultant chemical list + var/special_react_result = selected_reaction.check_special_react(src) var/list/multiplier = INFINITY //Wat for(var/B in cached_required_reagents) // @@ -462,84 +467,86 @@ //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. //FermiChem relies on two additional properties; pH and impurity //Temperature plays into a larger role too. - if (C.FermiChem == TRUE) - message_admins("Hee!!!! Someone is doing a Fermi reaction!!! I'm so excited!!") - //FermiReact(C) - //B is Beaker - //P is product - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + if(selected_reaction) + var/datum/chemical_reaction/C = selected_reaction + if (C.FermiChem == TRUE) + message_admins("Hee!!!! Someone is doing a Fermi reaction!!! I'm so excited!!") + //FermiReact(C) + //B is Beaker + //P is product + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - while (ammoReacted < multiplier) - //Begin Parse + while (ammoReacted < multiplier) + //Begin Parse - //Check extremes first - if (chem_temp > ExplodeTemp) - //go to explode proc - FermiExplode() + //Check extremes first + if (chem_temp > C.ExplodeTemp) + //go to explode proc + FermiExplode() - if (pH > 14 || pH < 0) - //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - FermiExplode() + if (pH > 14 || pH < 0) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + FermiExplode() - //For now, purity is handled elsewhere + //For now, purity is handled elsewhere - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < OptimalTempMax) - deltaT = (((OptimalTempMin - chem_temp)**CurveSharpT)/((OptimalTempMax - OptimalTempMax)**CurveSharpT)) - else if (chem_temp >= C.OptimalTempMax) - deltaT = 1 - else - deltaT = 0 - - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < C.OptimalpHMin) - if (pH < (C.OptimalpHMin - C.ReactpHLim)) - deltapH = 0 + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < C.OptimalTempMax) + deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMax)**C.CurveSharpT)) + else if (chem_temp >= C.OptimalTempMax) + deltaT = 1 else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharp)/(C.ReactpHLim**C.CurveSharppH)) - //Upper range - else if (pH > C.OptimalpHMin) - if (pH > (C.OptimalpHMin + C.ReactpHLim)) - deltapH = 0 + deltaT = 0 + + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < C.OptimalpHMin) + if (pH < (C.OptimalpHMin - C.ReactpHLim)) + deltapH = 0 + else + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) + //Upper range + else if (pH > C.OptimalpHMin) + if (pH > (C.OptimalpHMin + C.ReactpHLim)) + deltapH = 0 + else + deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) + //Within mid range + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + deltapH = 1 + //This should never proc: else - deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) - //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) - deltapH = 1 - //This should never proc: - else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") - WARNING("[my_atom] attempted to determine FermiChem pH for '[reagent]' which broke for some reason! ([usr])") - //TODO Add CatalystFact + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[C]' which broke for some reason! ([usr])") + //TODO Add CatalystFact - stepChemAmmount = multiplier * deltaT - if (ammoReacted > 0) - P.purity = ((P.purity * ammoReacted) + (deltapH * stepChemAmmount)) /(2 * (ammoReacted + stepChemAmmount)) //This should add the purity to the product - else - P.purity = deltapH - //Apply pH changes and thermal output of reaction to beaker - chem_temp += (C.ThermicConstant * stepChemAmmount) - pH += (C.HIonRelease * stepChemAmmount) + stepChemAmmount = multiplier * deltaT + if (ammoReacted > 0) + P.purity = ((P.purity * ammoReacted) + (deltapH * stepChemAmmount)) /(2 * (ammoReacted + stepChemAmmount)) //This should add the purity to the product + else + P.purity = deltapH + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) - // End. + // End. - selected_reaction.on_reaction(src, multiplier, special_react_result) + selected_reaction.on_reaction(src, multiplier, special_react_result) - for(var/B in cached_required_reagents) - remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + for(var/B in cached_required_reagents) + remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: - ammoReacted = ammoReacted + stepChemAmmount + ammoReacted = ammoReacted + stepChemAmmount - reaction_occurred = 1 - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", cached_results[P]*ammoReacted, P)//log + reaction_occurred = 1 + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", cached_results[P]*ammoReacted, P)//log //Standard reaction mechanics: else: diff --git a/code/modules/reagents/chemistry/holderBackup.dm b/code/modules/reagents/chemistry/holderBackup.dm new file mode 100644 index 0000000000..b434b348f0 --- /dev/null +++ b/code/modules/reagents/chemistry/holderBackup.dm @@ -0,0 +1,952 @@ + +/proc/build_chemical_reagent_list() + //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id + + if(GLOB.chemical_reagents_list) + return + + var/paths = subtypesof(/datum/reagent) + GLOB.chemical_reagents_list = list() + + for(var/path in paths) + var/datum/reagent/D = new path() + GLOB.chemical_reagents_list[D.id] = D + +/proc/build_chemical_reactions_list() + //Chemical Reactions - Initialises all /datum/chemical_reaction into a list + // It is filtered into multiple lists within a list. + // For example: + // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma + + if(GLOB.chemical_reactions_list) + return + + var/paths = subtypesof(/datum/chemical_reaction) + GLOB.chemical_reactions_list = list() + + for(var/path in paths) + + var/datum/chemical_reaction/D = new path() + var/list/reaction_ids = list() + + if(D.required_reagents && D.required_reagents.len) + for(var/reaction in D.required_reagents) + reaction_ids += reaction + + // Create filters based on each reagent id in the required reagents list + for(var/id in reaction_ids) + if(!GLOB.chemical_reactions_list[id]) + GLOB.chemical_reactions_list[id] = list() + GLOB.chemical_reactions_list[id] += D + break // Don't bother adding ourselves to other reagent ids, it is redundant + +/////////////////////////////////////////////////////////////////////////////////// + +/datum/reagents + var/list/datum/reagent/reagent_list = new/list() + var/total_volume = 0 + var/maximum_volume = 100 + var/atom/my_atom = null + var/chem_temp = 150 + var/pH = REAGENT_NORMAL_PH + var/last_tick = 1 + var/addiction_tick = 1 + var/list/datum/reagent/addiction_list = new/list() + var/reagents_holder_flags + +/datum/reagents/New(maximum=100) + maximum_volume = maximum + + //I dislike having these here but map-objects are initialised before world/New() is called. >_> + if(!GLOB.chemical_reagents_list) + build_chemical_reagent_list() + if(!GLOB.chemical_reactions_list) + build_chemical_reactions_list() + +/datum/reagents/Destroy() + . = ..() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + qdel(R) + cached_reagents.Cut() + cached_reagents = null + if(my_atom && my_atom.reagents == src) + my_atom.reagents = null + my_atom = null + +// Used in attack logs for reagents in pills and such +/datum/reagents/proc/log_list() + if(!length(reagent_list)) + return "no reagents" + + var/list/data = list() + for(var/r in reagent_list) //no reagents will be left behind + var/datum/reagent/R = r + data += "[R.id] ([round(R.volume, 0.1)]u)" + //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. + return english_list(data) + +/datum/reagents/proc/remove_any(amount = 1) + var/list/cached_reagents = reagent_list + var/total_transfered = 0 + var/current_list_element = 1 + + current_list_element = rand(1, cached_reagents.len) + + while(total_transfered != amount) + if(total_transfered >= amount) + break + if(total_volume <= 0 || !cached_reagents.len) + break + + if(current_list_element > cached_reagents.len) + current_list_element = 1 + + var/datum/reagent/R = cached_reagents[current_list_element] + remove_reagent(R.id, 1) + + current_list_element++ + total_transfered++ + update_total() + + handle_reactions() + return total_transfered + +/datum/reagents/proc/remove_all(amount = 1) + var/list/cached_reagents = reagent_list + if(total_volume > 0) + var/part = amount / total_volume + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + remove_reagent(R.id, R.volume * part) + + update_total() + handle_reactions() + return amount + +/datum/reagents/proc/get_master_reagent_name() + var/list/cached_reagents = reagent_list + var/name + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + name = R.name + + return name + +/datum/reagents/proc/get_master_reagent_id() + var/list/cached_reagents = reagent_list + var/id + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + id = R.id + + return id + +/datum/reagents/proc/get_master_reagent() + var/list/cached_reagents = reagent_list + var/datum/reagent/master + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + master = R + + return master + +/datum/reagents/proc/trans_to(obj/target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. + var/list/cached_reagents = reagent_list + if(!target || !total_volume) + return + if(amount < 0) + return + + var/datum/reagents/R + if(istype(target, /datum/reagents)) + R = target + else + if(!target.reagents) + return + R = target.reagents + amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) + var/part = amount / src.total_volume + var/trans_data = null + for(var/reagent in cached_reagents) + var/datum/reagent/T = reagent + var/transfer_amount = T.volume * part + if(preserve_data) + trans_data = copy_data(T) + + //fermichem Added ph TODO: add T.purity + R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + //R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + remove_reagent(T.id, transfer_amount) + + update_total() + R.update_total() + if(!no_react) + R.handle_reactions() + src.handle_reactions() + return amount + +/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1) + var/list/cached_reagents = reagent_list + if(!target || !total_volume) + return + + var/datum/reagents/R + if(istype(target, /datum/reagents)) + R = target + else + if(!target.reagents) + return + R = target.reagents + + if(amount < 0) + return + amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) + var/part = amount / total_volume + var/trans_data = null + for(var/reagent in cached_reagents) + var/datum/reagent/T = reagent + var/copy_amount = T.volume * part + if(preserve_data) + trans_data = T.data + R.add_reagent(T.id, copy_amount * multiplier, trans_data) + + src.update_total() + R.update_total() + R.handle_reactions() + src.handle_reactions() + return amount + +/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N + var/list/cached_reagents = reagent_list + if (!target) + return + if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) + return + if(amount < 0) + return + + var/datum/reagents/R = target.reagents + if(src.get_reagent_amount(reagent)= R.overdose_threshold && !R.overdosed) + R.overdosed = 1 + need_mob_update += R.overdose_start(C) + if(R.addiction_threshold) + if(R.volume >= R.addiction_threshold && !is_type_in_list(R, cached_addictions)) + var/datum/reagent/new_reagent = new R.type() + cached_addictions.Add(new_reagent) + if(R.overdosed) + need_mob_update += R.overdose_process(C) + if(is_type_in_list(R,cached_addictions)) + for(var/addiction in cached_addictions) + var/datum/reagent/A = addiction + if(istype(R, A)) + A.addiction_stage = -15 // you're satisfied for a good while. + need_mob_update += R.on_mob_life(C) + + if(can_overdose) + if(addiction_tick == 6) + addiction_tick = 1 + for(var/addiction in cached_addictions) + var/datum/reagent/R = addiction + if(C && R) + R.addiction_stage++ + if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end) + need_mob_update += R.addiction_act_stage1(C) + else if(R.addiction_stage1_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end) + need_mob_update += R.addiction_act_stage2(C) + else if(R.addiction_stage2_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end) + need_mob_update += R.addiction_act_stage3(C) + else if(R.addiction_stage3_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end) + need_mob_update += R.addiction_act_stage4(C) + else if(R.addiction_stage4_end <= R.addiction_stage) + to_chat(C, "You feel like you've gotten over your need for [R.name].") + SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.id]_addiction") + cached_addictions.Remove(R) + addiction_tick++ + if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. + C.updatehealth() + C.update_canmove() + C.update_stamina() + update_total() + + +/datum/reagents/proc/set_reacting(react = TRUE) + if(react) + reagents_holder_flags &= ~(REAGENT_NOREACT) + else + reagents_holder_flags |= REAGENT_NOREACT + +/datum/reagents/proc/conditional_update_move(atom/A, Running = 0) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + R.on_move (A, Running) + update_total() + +/datum/reagents/proc/conditional_update(atom/A) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + R.on_update (A) + update_total() + +/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar + //FermiChem + var/purity = 1 + var/ammoReacted = 0 + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmmount = 0 + + var/list/cached_reagents = reagent_list //a list of the reagents? + var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? + var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! + if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. + return //Yup, no reactions here. No siree. + + var/reaction_occurred = 0 // checks if reaction, binary variable + do //What does do do in byond? It sounds very redundant? is it a while loop? + var/list/possible_reactions = list() //init list + reaction_occurred = 0 // sets it back to 0? + for(var/reagent in cached_reagents) //for reagent in beaker/holder + var/datum/reagent/R = reagent //check to make sure that reagent is there for the reaction list + for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id + if(!reaction) + continue + + var/datum/chemical_reaction/C = reaction + var/list/cached_required_reagents = C.required_reagents + var/total_required_reagents = cached_required_reagents.len + var/total_matching_reagents = 0 + var/list/cached_required_catalysts = C.required_catalysts + var/total_required_catalysts = cached_required_catalysts.len + var/total_matching_catalysts= 0 + var/matching_container = 0 + var/matching_other = 0 + var/required_temp = C.required_temp + var/is_cold_recipe = C.is_cold_recipe + var/meets_temp_requirement = 0 + var/has_special_react = C.special_react + var/can_special_react = 0 + //FermiChem WHY ARE VARIBLES SO ESTRANGED it makes me sad + var/OptimalTempMin = C.OptimalTempMin // Lower area of bell curve for determining heat based rate reactions + var/OptimalTempMax = C.OptimalTempMax + var/ExplodeTemp = C.ExplodeTemp + var/OptimalpHMin = C.OptimalpHMin + var/OptimalpHMax = C.OptimalpHMax + var/ReactpHLim = C.ReactpHLim + //var/CatalystFact = C.CatalystFact + var/CurveSharpT = C.CurveSharpT + var/CurveSharppH = C.CurveSharppH + var/ThermicConstant = C.ThermicConstant + var/HIonRelease = C.HIonRelease + var/RateUpLim = C.RateUpLim + var/FermiChem = C.FermiChem + var/FermiExplode = C.FermiExplode + var/ImpureChem = C.ImpureChem + + //FermiChem + /* + var/purity = 1 + var/ammoReacted = 0 + + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmmount = 0 + */ + + for(var/B in cached_required_reagents) + if(!has_reagent(B, cached_required_reagents[B])) + break + total_matching_reagents++ + for(var/B in cached_required_catalysts) + if(!has_reagent(B, cached_required_catalysts[B])) + break + total_matching_catalysts++ + if(cached_my_atom) + if(!C.required_container) + matching_container = 1 + + else + if(cached_my_atom.type == C.required_container)//if the suspected container is a container + matching_container = 1 + if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs + return + if(!C.required_other)//Checks for other things required + matching_other = 1//binary check passes + + else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem + var/obj/item/slime_extract/M = cached_my_atom + + if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this + matching_other = 1 + else + if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? Oh, cyro. + matching_container = 1 + if(!C.required_other) + matching_other = 1 + + //FermiChem + + if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! + meets_temp_requirement = 1//binary pass + + if(!has_special_react || C.check_special_react(src)) + can_special_react = 1 + + if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react) + possible_reactions += C + + if(possible_reactions.len)//does list exist? + var/datum/chemical_reaction/selected_reaction = possible_reactions[1] + //select the reaction with the most extreme temperature requirements + for(var/V in possible_reactions)//why V, surely that would indicate volume? V is the reaction potential. + var/datum/chemical_reaction/competitor = V //competitor? I think this is theres two of them. Troubling..! + if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. + if(competitor.required_temp <= selected_reaction.required_temp)//only returns with lower if reaction "is cold" var. + selected_reaction = competitor + else + if(competitor.required_temp >= selected_reaction.required_temp) //will return with the hotter reacting first. + selected_reaction = competitor + var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list + var/list/cached_results = selected_reaction.results//resultant chemical list + var/special_react_result = selected_reaction.check_special_react(src) + var/list/multiplier = INFINITY //Wat + + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + + //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. + //FermiChem relies on two additional properties; pH and impurity + //Temperature plays into a larger role too. + if (C.FermiChem == TRUE) + message_admins("Hee!!!! Someone is doing a Fermi reaction!!! I'm so excited!!") + //FermiReact(C) + //B is Beaker + //P is product + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + + while (ammoReacted < multiplier) + //Begin Parse + + //Check extremes first + if (chem_temp > ExplodeTemp) + //go to explode proc + FermiExplode() + + if (pH > 14 || pH < 0) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + FermiExplode() + + //For now, purity is handled elsewhere + + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < C.OptimalTempMax) + deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMax)**C.CurveSharpT)) + else if (chem_temp >= C.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < C.OptimalpHMin) + if (pH < (C.OptimalpHMin - C.ReactpHLim)) + deltapH = 0 + else + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharp)/(C.ReactpHLim**C.CurveSharppH)) + //Upper range + else if (pH > C.OptimalpHMin) + if (pH > (C.OptimalpHMin + C.ReactpHLim)) + deltapH = 0 + else + deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) + //Within mid range + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + deltapH = 1 + //This should never proc: + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[reagent]' which broke for some reason! ([usr])") + //TODO Add CatalystFact + + stepChemAmmount = multiplier * deltaT + if (ammoReacted > 0) + P.purity = ((P.purity * ammoReacted) + (deltapH * stepChemAmmount)) /(2 * (ammoReacted + stepChemAmmount)) //This should add the purity to the product + else + P.purity = deltapH + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) + + // End. + + selected_reaction.on_reaction(src, multiplier, special_react_result) + + for(var/B in cached_required_reagents) + remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + + + ammoReacted = ammoReacted + stepChemAmmount + + reaction_occurred = 1 + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", cached_results[P]*ammoReacted, P)//log + //Standard reaction mechanics: + else: + + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + + for(var/B in cached_required_reagents) + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log + add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: + + + var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers + var/iconhtml = icon2html(cached_my_atom, seen) + if(cached_my_atom) + if(!ismob(cached_my_atom)) // No bubbling mobs + if(selected_reaction.mix_sound) + playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) + + for(var/mob/M in seen) + to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + + if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. + var/obj/item/slime_extract/ME2 = my_atom + ME2.Uses-- + if(ME2.Uses <= 0) // give the notification that the slime core is dead + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") + ME2.name = "used slime extract" + ME2.desc = "This extract has been used up." + + selected_reaction.on_reaction(src, multiplier, special_react_result) + reaction_occurred = 1 + + while(reaction_occurred)//while do nothing? + update_total()//Don't know waht this does. + return 0//end! + +/datum/reagents/proc/FermiReact() + return + +/datum/reagents/proc/FermiExplode() + return + +/datum/reagents/proc/isolate_reagent(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if(R.id != reagent) + del_reagent(R.id) + update_total() + +/datum/reagents/proc/del_reagent(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if(R.id == reagent) + if(my_atom && isliving(my_atom)) + var/mob/living/M = my_atom + R.on_mob_delete(M) + qdel(R) + reagent_list -= R + update_total() + if(my_atom) + my_atom.on_reagent_change(DEL_REAGENT) + return 1 + +/datum/reagents/proc/update_total() + var/list/cached_reagents = reagent_list + total_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume < 0.1) + del_reagent(R.id) + else + total_volume += R.volume + + return 0 + +/datum/reagents/proc/clear_reagents() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + del_reagent(R.id) + return 0 + +/datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1) + var/react_type + if(isliving(A)) + react_type = "LIVING" + if(method == INGEST) + var/mob/living/L = A + L.taste(src) + else if(isturf(A)) + react_type = "TURF" + else if(isobj(A)) + react_type = "OBJ" + else + return + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + switch(react_type) + if("LIVING") + var/touch_protection = 0 + if(method == VAPOR) + var/mob/living/L = A + touch_protection = L.get_permeability_protection() + R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection) + if("TURF") + R.reaction_turf(A, R.volume * volume_modifier, show_message) + if("OBJ") + R.reaction_obj(A, R.volume * volume_modifier, show_message) + +/datum/reagents/proc/holder_full() + if(total_volume >= maximum_volume) + return TRUE + return FALSE + +//Returns the average specific heat for all reagents currently in this holder. +/datum/reagents/proc/specific_heat() + . = 0 + var/cached_amount = total_volume //cache amount + var/list/cached_reagents = reagent_list //cache reagents + for(var/I in cached_reagents) + var/datum/reagent/R = I + . += R.specific_heat * (R.volume / cached_amount) + +/datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) + var/S = specific_heat() + chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) + +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, pH = 7, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ + if(!isnum(amount) || !amount) + return FALSE + + if(amount <= 0) + return FALSE + + var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] + if(!D) + WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") + return FALSE + + update_total() + var/cached_total = total_volume + if(cached_total + amount > maximum_volume) + amount = (maximum_volume - cached_total) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. + if(amount <= 0) + return FALSE + var/new_total = cached_total + amount + var/cached_temp = chem_temp + var/list/cached_reagents = reagent_list + + //Equalize temperature - Not using specific_heat() because the new chemical isn't in yet. + var/specific_heat = 0 + var/thermal_energy = 0 + for(var/i in cached_reagents) + var/datum/reagent/R = i + specific_heat += R.specific_heat * (R.volume / new_total) + thermal_energy += R.specific_heat * R.volume * cached_temp + specific_heat += D.specific_heat * (amount / new_total) + thermal_energy += D.specific_heat * amount * reagtemp + chem_temp = thermal_energy / (specific_heat * new_total) + //// + + //add the reagent to the existing if it exists + for(var/A in cached_reagents) + var/datum/reagent/R = A + if (R.id == reagent) + R.volume += amount + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + R.on_merge(data, amount) + if(!no_react) + handle_reactions() + return TRUE + + //otherwise make a new one + var/datum/reagent/R = new D.type(data) + cached_reagents += R + R.holder = src + R.volume = amount + if(data) + R.data = data + R.on_new(data) + + if(isliving(my_atom)) + R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + if(!no_react) + handle_reactions() + return TRUE + +/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) + for(var/r_id in list_reagents) + var/amt = list_reagents[r_id] + add_reagent(r_id, amt, data) + +/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to + + if(isnull(amount)) + amount = 0 + CRASH("null amount passed to reagent code") + return FALSE + + if(!isnum(amount)) + return FALSE + + if(amount < 0) + return FALSE + + var/list/cached_reagents = reagent_list + + for(var/A in cached_reagents) + var/datum/reagent/R = A + if (R.id == reagent) + //clamp the removal amount to be between current reagent amount + //and zero, to prevent removing more than the holder has stored + amount = CLAMP(amount, 0, R.volume) + R.volume -= amount + update_total() + if(!safety)//So it does not handle reactions when it need not to + handle_reactions() + if(my_atom) + my_atom.on_reagent_change(REM_REAGENT) + return TRUE + + return FALSE + +/datum/reagents/proc/has_reagent(reagent, amount = -1) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if (R.id == reagent) + if(!amount) + return R + else + if(R.volume >= amount) + return R + else + return 0 + + return 0 + +/datum/reagents/proc/get_reagent_amount(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if (R.id == reagent) + return R.volume + + return 0 + +/datum/reagents/proc/get_reagents() + var/list/names = list() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + names += R.name + + return jointext(names, ",") + +/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. + if(!isnum(amount)) + return 1 + var/list/cached_reagents = reagent_list + var/has_removed_reagent = 0 + + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + var/matches = 0 + // Switch between how we check the reagent type + if(strict) + if(R.type == reagent_type) + matches = 1 + else + if(istype(R, reagent_type)) + matches = 1 + // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. + if(matches) + // Have our other proc handle removement + has_removed_reagent = remove_reagent(R.id, amount, safety) + + return has_removed_reagent + +//two helper functions to preserve data across reactions (needed for xenoarch) +/datum/reagents/proc/get_data(reagent_id) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.id == reagent_id) + return R.data + +/datum/reagents/proc/set_data(reagent_id, new_data) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.id == reagent_id) + R.data = new_data + +/datum/reagents/proc/copy_data(datum/reagent/current_reagent) + if(!current_reagent || !current_reagent.data) + return null + if(!istype(current_reagent.data, /list)) + return current_reagent.data + + var/list/trans_data = current_reagent.data.Copy() + + // We do this so that introducing a virus to a blood sample + // doesn't automagically infect all other blood samples from + // the same donor. + // + // Technically we should probably copy all data lists, but + // that could possibly eat up a lot of memory needlessly + // if most data lists are read-only. + if(trans_data["viruses"]) + var/list/v = trans_data["viruses"] + trans_data["viruses"] = v.Copy() + + return trans_data + +/datum/reagents/proc/get_reagent(type) + var/list/cached_reagents = reagent_list + . = locate(type) in cached_reagents + +/datum/reagents/proc/generate_taste_message(minimum_percent=15) + // the lower the minimum percent, the more sensitive the message is. + var/list/out = list() + var/list/tastes = list() //descriptor = strength + if(minimum_percent <= 100) + for(var/datum/reagent/R in reagent_list) + if(!R.taste_mult) + continue + + if(istype(R, /datum/reagent/consumable/nutriment)) + var/list/taste_data = R.data + for(var/taste in taste_data) + var/ratio = taste_data[taste] + var/amount = ratio * R.taste_mult * R.volume + if(taste in tastes) + tastes[taste] += amount + else + tastes[taste] = amount + else + var/taste_desc = R.taste_description + var/taste_amount = R.volume * R.taste_mult + if(taste_desc in tastes) + tastes[taste_desc] += taste_amount + else + tastes[taste_desc] = taste_amount + //deal with percentages + // TODO it would be great if we could sort these from strong to weak + var/total_taste = counterlist_sum(tastes) + if(total_taste > 0) + for(var/taste_desc in tastes) + var/percent = tastes[taste_desc]/total_taste * 100 + if(percent < minimum_percent) + continue + var/intensity_desc = "a hint of" + if(percent > minimum_percent * 2 || percent == 100) + intensity_desc = "" + else if(percent > minimum_percent * 3) + intensity_desc = "the strong flavor of" + if(intensity_desc != "") + out += "[intensity_desc] [taste_desc]" + else + out += "[taste_desc]" + + return english_list(out, "something indescribable") + +/datum/reagents/proc/expose_temperature(var/temperature, var/coeff=0.02) + var/temp_delta = (temperature - chem_temp) * coeff + if(temp_delta > 0) + chem_temp = min(chem_temp + max(temp_delta, 1), temperature) + else + chem_temp = max(chem_temp + min(temp_delta, -1), temperature) + chem_temp = round(chem_temp) + handle_reactions() + +/////////////////////////////////////////////////////////////////////////////////// + + +// Convenience proc to create a reagents holder for an atom +// Max vol is maximum volume of holder +/atom/proc/create_reagents(max_vol) + if(reagents) + qdel(reagents) + reagents = new/datum/reagents(max_vol) + reagents.my_atom = src + +/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents + var/static/list/random_reagents = list() + if(!random_reagents.len) + for(var/thing in subtypesof(/datum/reagent)) + var/datum/reagent/R = thing + if(initial(R.can_synth)) + random_reagents += initial(R.id) + var/picked_reagent = pick(random_reagents) + return picked_reagent From 02da3c524e76eeda9624aec4fb2896fdb35dce15 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Mon, 15 Apr 2019 22:08:00 +0100 Subject: [PATCH 020/608] Fixed reaction mechanics - pre status edits --- code/modules/reagents/chemistry/holder.dm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index ec8de8380f..2a56467651 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -474,7 +474,7 @@ //FermiReact(C) //B is Beaker //P is product - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + //multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) while (ammoReacted < multiplier) //Begin Parse @@ -522,10 +522,6 @@ //TODO Add CatalystFact stepChemAmmount = multiplier * deltaT - if (ammoReacted > 0) - P.purity = ((P.purity * ammoReacted) + (deltapH * stepChemAmmount)) /(2 * (ammoReacted + stepChemAmmount)) //This should add the purity to the product - else - P.purity = deltapH //Apply pH changes and thermal output of reaction to beaker chem_temp += (C.ThermicConstant * stepChemAmmount) pH += (C.HIonRelease * stepChemAmmount) @@ -538,15 +534,20 @@ remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + if (ammoReacted > 0) + P.purity = ((P.purity * ammoReacted) + (deltapH * stepChemAmmount)) /(2 * (ammoReacted + stepChemAmmount)) //This should add the purity to the product + else + P.purity = deltapH multiplier = max(multiplier, 1) //this shouldnt happen ... SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", cached_results[P]*ammoReacted, P)//log add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: ammoReacted = ammoReacted + stepChemAmmount reaction_occurred = 1 - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", cached_results[P]*ammoReacted, P)//log + //Standard reaction mechanics: else: From b4d1b0e9067d35104d1e8264b1edaae418f4238f Mon Sep 17 00:00:00 2001 From: Thalpy Date: Mon, 15 Apr 2019 22:59:19 +0100 Subject: [PATCH 021/608] Midfix of chem side of fermichem --- .../code/datums/status_effects/chems.dm | 36 ++++++++++--------- .../chemistry/reagents/fermi_reagents.dm | 32 +++++++++-------- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index a42f5db07a..f4dea1eb6a 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -1,25 +1,27 @@ +#define fermiClone = null + /datum/status_effect/chem/SGDF id = "SGDF" - var/mob/living/clone + //var/mob/living/fermi_Clone -/datum/status_effect/chem/SGDF/on_apply() - var/typepath = owner.type - clone = new typepath(owner.loc) - var/mob/living/carbon/O = owner - var/mob/living/carbon/C = clone - if(istype(C) && istype(O)) +/datum/status_effect/chem/SGDF/on_apply(mob/living/M) + var/typepath = M.type + fermiClone = new typepath(M.loc) + //var/mob/living/carbon/M = owner + var/mob/living/carbon/C = fermi_Clone + if(istype(C) && istype(M)) C.real_name = O.real_name - O.dna.transfer_identity(C) + M.dna.transfer_identity(C) C.updateappearance(mutcolor_update=1) return ..() -/datum/status_effect/chem/SGDF/tick() - if(owner.stat == DEAD) - if(clone && clone.stat != DEAD) - if(owner.mind) - owner.mind.transfer_to(clone) - owner.visible_message("Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") - clone = null - if(!clone || clone.stat == DEAD) - to_chat(owner, "[linked_extract] desperately tries to move your soul to a living body, but can't find one!") +/datum/status_effect/chem/SGDF/tick(mob/living/M) + if(M.stat == DEAD) + if(fermi_Clone && fermi_Clone.stat != DEAD) + if(M.mind) + M.mind.transfer_to(fermi_Clone) + M.visible_message("Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") + fermi_Clone = null + //if(!clone || clone.stat == DEAD) + // to_chat(owner, "[linked_extract] desperately tries to move your soul to a living body, but can't find one!") ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 4dc847150c..dd66122c7e 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -22,9 +22,10 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM addiction_stage3_end = 40 addiction_stage4_end = 55 //Incase it's too long - -/obj/item/reagent/fermi/eigenstate/Initialize() + +///obj/item/reagent/fermi/eigenstate/Initialize() +/datum/reagent/fermi/eigenstate/Initialize() //. = ..() Unneeded? var/turf/open/T = get_turf(src)//Sets up coordinate of where it was created ..() @@ -73,7 +74,7 @@ to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") M.Jitter(50) M.AdjustKnockdown(-40, 0) - for(var/obj/item/I in mob.get_contents()); do_teleport(I, get_turf(I), 5, no_effects=TRUE); + for(var/obj/item/I in M.get_contents()); do_teleport(I, get_turf(I), 5, no_effects=TRUE); ..() /datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! @@ -84,9 +85,9 @@ //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in if(1) var/typepath = M.type - clone = new typepath(M.loc) + fermi_Tclone = new typepath(M.loc) //var/mob/living/carbon/O = M - var/mob/living/carbon/C = clone + var/mob/living/carbon/C = fermi_Tclone C.appearance = M.appearance //Incase Kevin breaks my code: @@ -110,11 +111,12 @@ M.Jitter(50) M.AdjustKnockdown(0, 0) to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your pervious self, sent to god knows what universe.") - mob.emote("me",1,"gasps and gazes around in a bewildered and highly confused fashion!",TRUE) + M.emote("me",1,"gasps and gazes around in a bewildered and highly confused fashion!",TRUE) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) ..() /datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) + return //eigenstate END @@ -129,13 +131,13 @@ //var/typepath = owner.type //clone = new typepath(owner.loc) var/typepath = M.type - clone = new typepath(M.loc) - //var/mob/living/carbon/O = owner - var/mob/living/carbon/O = M - var/mob/living/carbon/SM = clone - if(istype(SM) && istype(O)) - SM.real_name = O.real_name - O.dna.transfer_identity(SM) + fermi_Gclone = new typepath(M.loc) + //var/mob/living/carbon/SM = owner + //var/mob/living/carbon/M = M + var/mob/living/carbon/SM = fermi_Gclone + if(istype(SM) && istype(M)) + SM.real_name = M.real_name + M.dna.transfer_identity(SM) SM.updateappearance(mutcolor_update=1) var/mob/dead/observer/C = pick(candidates) @@ -144,8 +146,8 @@ SM.sentience_act() to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") - to_chat(O, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") - visible_message("[O] suddenly shudders, and splits into two identical twins!") + to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") + visible_message("[M] suddenly shudders, and splits into two identical twins!") SM.copy_known_languages_from(user, FALSE) //after_success(user, SM) //qdel(src) From 977462387c81c89785a572eea9a666c8a64584dd Mon Sep 17 00:00:00 2001 From: Useroth Date: Tue, 16 Apr 2019 00:11:53 +0200 Subject: [PATCH 022/608] A couple of bugfixes. Also testing if I can even push to this repo. --- code/modules/reagents/chemistry/recipes.dm | 1 + .../code/modules/reagents/chemistry/recipes/fermi.dm | 10 +++++----- tgstation.dme | 9 +++++++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index a3d70efd2d..f5f5eda104 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -26,6 +26,7 @@ var/OptimalpHMax = 10 var/ReactpHLim = 3 //var/CatalystFact = C.CatalystFact + var/CatalystFact = 0 var/CurveSharpT = 2 var/CurveSharppH = 2 var/ThermicConstant = 1 diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index bab77de811..4e1a97d269 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -3,7 +3,7 @@ /datum/chemical_reaction/eigenstate name = "Eigenstasium" id = "eigenstate" - results = list("eigenstate" = `1`) + results = list("eigenstate" = 1) required_reagents = list("bluespace" = 1, "stable_plasma" = 1, "sugar" = 1) //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions @@ -19,20 +19,20 @@ HIonRelease = 0.01 //pH change per 1u reaction RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics - var/FermiExplode = FALSE //If the chemical explodes in a special way - var/ImpureChem = "toxin" //What chemical is produced with an inpure reaction + FermiExplode = FALSE //If the chemical explodes in a special way + ImpureChem = "toxin" //What chemical is produced with an inpure reaction //serum /datum/chemical_reaction/SDGF name = "synthetic-derived growth factor" id = "SDGF" - results = list("SDGF" = `3`) + results = list("SDGF" = 3) required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) /datum/chemical_reaction/BElarger name = "" id = "e" - results = list("Eigenstasium" = `6`) + results = list("Eigenstasium" = 6) required_reagents = list("salglu_solution" = 1, "milk" = 5, "synthflesh" = 2, "silicon" = 2, "crocin" = 2) //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions diff --git a/tgstation.dme b/tgstation.dme index d7df01ed59..e84c616d64 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2528,9 +2528,15 @@ #include "code\modules\research\techweb\all_nodes.dm" #include "code\modules\research\xenobiology\xenobio_camera.dm" #include "code\modules\research\xenobiology\xenobiology.dm" +#include "code\modules\research\xenobiology\crossbreeding\__corecross.dm" +#include "code\modules\research\xenobiology\crossbreeding\_clothing.dm" +#include "code\modules\research\xenobiology\crossbreeding\_misc.dm" +#include "code\modules\research\xenobiology\crossbreeding\_mobs.dm" #include "code\modules\research\xenobiology\crossbreeding\_status_effects.dm" +#include "code\modules\research\xenobiology\crossbreeding\_weapons.dm" #include "code\modules\research\xenobiology\crossbreeding\burning.dm" #include "code\modules\research\xenobiology\crossbreeding\charged.dm" +#include "code\modules\research\xenobiology\crossbreeding\chilling.dm" #include "code\modules\research\xenobiology\crossbreeding\consuming.dm" #include "code\modules\research\xenobiology\crossbreeding\industrial.dm" #include "code\modules\research\xenobiology\crossbreeding\prismatic.dm" @@ -2772,12 +2778,10 @@ #include "modular_citadel\code\datums\components\material_container.dm" #include "modular_citadel\code\datums\components\phantomthief.dm" #include "modular_citadel\code\datums\components\souldeath.dm" -#include "modular_citadel\code\datums\mood_events\chem_events.dm" #include "modular_citadel\code\datums\mood_events\generic_negative_events.dm" #include "modular_citadel\code\datums\mood_events\generic_positive_events.dm" #include "modular_citadel\code\datums\mood_events\moodular.dm" #include "modular_citadel\code\datums\mutations\hulk.dm" -#include "modular_citadel\code\datums\status_effects\chems.dm" #include "modular_citadel\code\datums\status_effects\debuffs.dm" #include "modular_citadel\code\datums\traits\neutral.dm" #include "modular_citadel\code\datums\wires\airlock.dm" @@ -2957,6 +2961,7 @@ #include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm" +#include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm" #include "modular_citadel\code\modules\reagents\reagent container\cit_kegs.dm" #include "modular_citadel\code\modules\reagents\reagent container\hypospraymkii.dm" #include "modular_citadel\code\modules\reagents\reagent container\hypovial.dm" From f55b6ed18aee6ef64542a310ec316d24d773d2e0 Mon Sep 17 00:00:00 2001 From: Useroth Date: Tue, 16 Apr 2019 00:53:44 +0200 Subject: [PATCH 023/608] Another round of unspaghettifying the code. A lot still to go. --- code/modules/reagents/chemistry/holder.dm | 148 +++++++++--------- .../chemistry/reagents/fermi_reagents.dm | 23 +-- .../reagents/chemistry/recipes/fermi.dm | 2 +- 3 files changed, 84 insertions(+), 89 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 2a56467651..7fb78d6895 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -338,13 +338,6 @@ update_total() /datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar - //FermiChem - var/purity = 1 - var/ammoReacted = 0 - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmmount = 0 - var/list/cached_reagents = reagent_list //a list of the reagents? var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! @@ -376,7 +369,6 @@ var/has_special_react = C.special_react var/can_special_react = 0 //FermiChem WHY ARE VARIBLES SO ESTRANGED it makes me sad - /* var/OptimalTempMin = C.OptimalTempMin // Lower area of bell curve for determining heat based rate reactions var/OptimalTempMax = C.OptimalTempMax var/ExplodeTemp = C.ExplodeTemp @@ -392,16 +384,14 @@ var/FermiChem = C.FermiChem var/FermiExplode = C.FermiExplode var/ImpureChem = C.ImpureChem - */ + //FermiChem - /* var/purity = 1 var/ammoReacted = 0 var/deltaT = 0 var/deltapH = 0 var/stepChemAmmount = 0 - */ for(var/B in cached_required_reagents) if(!has_reagent(B, cached_required_reagents[B])) @@ -435,6 +425,12 @@ matching_other = 1 //FermiChem + if (chem_temp > ExplodeTemp)//Check to see if reaction is too hot! + if (FermiExplode == TRUE) + //To be added! + else + FermiExplode() + //explode function!! if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! meets_temp_requirement = 1//binary pass @@ -458,7 +454,6 @@ selected_reaction = competitor var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list var/list/cached_results = selected_reaction.results//resultant chemical list - var/special_react_result = selected_reaction.check_special_react(src) var/list/multiplier = INFINITY //Wat for(var/B in cached_required_reagents) // @@ -467,87 +462,84 @@ //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. //FermiChem relies on two additional properties; pH and impurity //Temperature plays into a larger role too. - if(selected_reaction) - var/datum/chemical_reaction/C = selected_reaction - if (C.FermiChem == TRUE) - message_admins("Hee!!!! Someone is doing a Fermi reaction!!! I'm so excited!!") - //FermiReact(C) - //B is Beaker - //P is product - //multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + if (C.FermiChem == TRUE) + message_admins("Hee!!!! Someone is doing a Fermi reaction!!! I'm so excited!!") + //FermiReact(C) + //B is Beaker + //P is product + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - while (ammoReacted < multiplier) - //Begin Parse + while (ammoReacted < multiplier) + //Begin Parse - //Check extremes first - if (chem_temp > C.ExplodeTemp) - //go to explode proc - FermiExplode() + //Check extremes first + if (chem_temp > ExplodeTemp) + //go to explode proc + FermiExplode() - if (pH > 14 || pH < 0) - //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - FermiExplode() + if (pH > 14 || pH < 0) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + FermiExplode() - //For now, purity is handled elsewhere + //For now, purity is handled elsewhere - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMax)**C.CurveSharpT)) - else if (chem_temp >= C.OptimalTempMax) - deltaT = 1 + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < OptimalTempMax) + deltaT = (((OptimalTempMin - chem_temp)**CurveSharpT)/((OptimalTempMax - OptimalTempMax)**CurveSharpT)) + else if (chem_temp >= C.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < C.OptimalpHMin) + if (pH < (C.OptimalpHMin - C.ReactpHLim)) + deltapH = 0 else - deltaT = 0 - - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < C.OptimalpHMin) - if (pH < (C.OptimalpHMin - C.ReactpHLim)) - deltapH = 0 - else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) - //Upper range - else if (pH > C.OptimalpHMin) - if (pH > (C.OptimalpHMin + C.ReactpHLim)) - deltapH = 0 - else - deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) - //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) - deltapH = 1 - //This should never proc: + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharp)/(C.ReactpHLim**C.CurveSharppH)) + //Upper range + else if (pH > C.OptimalpHMin) + if (pH > (C.OptimalpHMin + C.ReactpHLim)) + deltapH = 0 else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") - WARNING("[my_atom] attempted to determine FermiChem pH for '[C]' which broke for some reason! ([usr])") - //TODO Add CatalystFact + deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) + //Within mid range + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + deltapH = 1 + //This should never proc: + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[reagent]' which broke for some reason! ([usr])") + //TODO Add CatalystFact - stepChemAmmount = multiplier * deltaT - //Apply pH changes and thermal output of reaction to beaker - chem_temp += (C.ThermicConstant * stepChemAmmount) - pH += (C.HIonRelease * stepChemAmmount) + stepChemAmmount = multiplier * deltaT + if (ammoReacted > 0) + purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /(2 * (ammoReacted + stepChemAmmount)) //This should add the purity to the product + else + purity = deltapH + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) - // End. + // End. - selected_reaction.on_reaction(src, multiplier, special_react_result) + selected_reaction.on_reaction(src, multiplier, special_react_result) - for(var/B in cached_required_reagents) - remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + for(var/B in cached_required_reagents) + remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - if (ammoReacted > 0) - P.purity = ((P.purity * ammoReacted) + (deltapH * stepChemAmmount)) /(2 * (ammoReacted + stepChemAmmount)) //This should add the purity to the product - else - P.purity = deltapH - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", cached_results[P]*ammoReacted, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: - ammoReacted = ammoReacted + stepChemAmmount - - reaction_occurred = 1 + ammoReacted = ammoReacted + stepChemAmmount + reaction_occurred = 1 + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", cached_results[P]*ammoReacted, P)//log //Standard reaction mechanics: else: diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index dd66122c7e..26310a813b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -22,29 +22,30 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM addiction_stage3_end = 40 addiction_stage4_end = 55 //Incase it's too long + var/turf/open/location_created = null + var/turf/open/location_return = null ///obj/item/reagent/fermi/eigenstate/Initialize() -/datum/reagent/fermi/eigenstate/Initialize() - //. = ..() Unneeded? - var/turf/open/T = get_turf(src)//Sets up coordinate of where it was created - ..() +/datum/reagent/fermi/eigenstate/New() + . = ..() //Unneeded? + location_created = get_turf(src) //Sets up coordinate of where it was created /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! if (holder.has_reagent("eigenstate")) do_sparks(5,FALSE,src) else - var/turf/open/T2 = get_turf(src) //sets up return point + location_return = get_turf(src) //sets up return point to_chat(M, "You feel your wavefunction split!") do_sparks(5,FALSE,src) - src.forceMove(T) //Teleports to creation location + M.forceMove(location_created) //Teleports to creation location do_sparks(5,FALSE,src) ..() /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location do_sparks(5,FALSE,src) to_chat(M, "You feel your wavefunction collapse!") - src.forceMove(T2) //Teleports home + M.forceMove(location_return) //Teleports home do_sparks(5,FALSE,src) ..() @@ -74,7 +75,9 @@ to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") M.Jitter(50) M.AdjustKnockdown(-40, 0) - for(var/obj/item/I in M.get_contents()); do_teleport(I, get_turf(I), 5, no_effects=TRUE); + for(var/item in M.get_contents()) + var/obj/item/I = item + do_teleport(I, get_turf(I), 5, no_effects=TRUE); ..() /datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! @@ -85,7 +88,7 @@ //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in if(1) var/typepath = M.type - fermi_Tclone = new typepath(M.loc) + var/fermi_Tclone = new typepath(M.loc) //var/mob/living/carbon/O = M var/mob/living/carbon/C = fermi_Tclone C.appearance = M.appearance @@ -143,7 +146,7 @@ var/mob/dead/observer/C = pick(candidates) SM.key = C.key SM.mind.enslave_mind_to_creator(user) - SM.sentience_act() + //SM.sentience_act() to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 4e1a97d269..6456715a96 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -42,7 +42,7 @@ OptimalpHMax = 9.5 // Higest value for above ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharp = 4 // How sharp the exponential curve is (to the power of value) + CurveSharpT = 4 // How sharp the exponential curve is (to the power of value) ThermicConstant = -2.5 //Temperature change per 1u produced HIonRelease = 0.01 //pH change per 1u reaction RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect From a57dc622ef9333a24e7c527f7f126cdaed774b77 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Tue, 16 Apr 2019 17:28:49 +0100 Subject: [PATCH 024/608] holder.dm should be fixed!! --- code/modules/reagents/chemistry/holder.dm | 148 +++++++++--------- .../code/datums/status_effects/chems.dm | 2 - .../chemistry/reagents/fermi_reagents.dm | 11 +- tgstation.dme | 2 + 4 files changed, 88 insertions(+), 75 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 7fb78d6895..79b5df1991 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -369,6 +369,7 @@ var/has_special_react = C.special_react var/can_special_react = 0 //FermiChem WHY ARE VARIBLES SO ESTRANGED it makes me sad + /* var/OptimalTempMin = C.OptimalTempMin // Lower area of bell curve for determining heat based rate reactions var/OptimalTempMax = C.OptimalTempMax var/ExplodeTemp = C.ExplodeTemp @@ -384,14 +385,8 @@ var/FermiChem = C.FermiChem var/FermiExplode = C.FermiExplode var/ImpureChem = C.ImpureChem - + */ //FermiChem - var/purity = 1 - var/ammoReacted = 0 - - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmmount = 0 for(var/B in cached_required_reagents) if(!has_reagent(B, cached_required_reagents[B])) @@ -425,8 +420,8 @@ matching_other = 1 //FermiChem - if (chem_temp > ExplodeTemp)//Check to see if reaction is too hot! - if (FermiExplode == TRUE) + if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! + if (C.FermiExplode == TRUE) //To be added! else FermiExplode() @@ -454,6 +449,7 @@ selected_reaction = competitor var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list var/list/cached_results = selected_reaction.results//resultant chemical list + var/special_react_result = selected_reaction.check_special_react(src) var/list/multiplier = INFINITY //Wat for(var/B in cached_required_reagents) // @@ -462,84 +458,92 @@ //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. //FermiChem relies on two additional properties; pH and impurity //Temperature plays into a larger role too. - if (C.FermiChem == TRUE) - message_admins("Hee!!!! Someone is doing a Fermi reaction!!! I'm so excited!!") - //FermiReact(C) - //B is Beaker - //P is product - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + if(selected_reaction) + var/datum/chemical_reaction/C = selected_reaction + if (C.FermiChem == TRUE) + message_admins("Hee!!!! Someone is doing a Fermi reaction!!! I'm so excited!!") + //FermiReact(C) + //B is Beaker + //P is product + //multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmmount = 0 + var/ammoReacted = 0 - while (ammoReacted < multiplier) - //Begin Parse + var/purity = 1 - //Check extremes first - if (chem_temp > ExplodeTemp) - //go to explode proc - FermiExplode() - if (pH > 14 || pH < 0) - //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - FermiExplode() + while (ammoReacted < multiplier) + //Begin Parse - //For now, purity is handled elsewhere + //Check extremes first + if (chem_temp > C.ExplodeTemp) + //go to explode proc + FermiExplode() - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < OptimalTempMax) - deltaT = (((OptimalTempMin - chem_temp)**CurveSharpT)/((OptimalTempMax - OptimalTempMax)**CurveSharpT)) - else if (chem_temp >= C.OptimalTempMax) - deltaT = 1 - else - deltaT = 0 + if (pH > 14 || pH < 0) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + FermiExplode() - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < C.OptimalpHMin) - if (pH < (C.OptimalpHMin - C.ReactpHLim)) - deltapH = 0 + //For now, purity is handled elsewhere + + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < C.OptimalTempMax) + deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMax)**C.CurveSharpT)) + else if (chem_temp >= C.OptimalTempMax) + deltaT = 1 else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharp)/(C.ReactpHLim**C.CurveSharppH)) - //Upper range - else if (pH > C.OptimalpHMin) - if (pH > (C.OptimalpHMin + C.ReactpHLim)) - deltapH = 0 + deltaT = 0 + + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < C.OptimalpHMin) + if (pH < (C.OptimalpHMin - C.ReactpHLim)) + deltapH = 0 + else + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) + //Upper range + else if (pH > C.OptimalpHMin) + if (pH > (C.OptimalpHMin + C.ReactpHLim)) + deltapH = 0 + else + deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) + //Within mid range + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + deltapH = 1 + //This should never proc: else - deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) - //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) - deltapH = 1 - //This should never proc: - else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") - WARNING("[my_atom] attempted to determine FermiChem pH for '[reagent]' which broke for some reason! ([usr])") - //TODO Add CatalystFact + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") + //TODO Add CatalystFact - stepChemAmmount = multiplier * deltaT - if (ammoReacted > 0) - purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /(2 * (ammoReacted + stepChemAmmount)) //This should add the purity to the product - else - purity = deltapH - //Apply pH changes and thermal output of reaction to beaker - chem_temp += (C.ThermicConstant * stepChemAmmount) - pH += (C.HIonRelease * stepChemAmmount) + stepChemAmmount = multiplier * deltaT + if (ammoReacted > 0) + purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /(2 * (ammoReacted + stepChemAmmount)) //This should add the purity to the product + else + purity = deltapH + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) - // End. + // End. - selected_reaction.on_reaction(src, multiplier, special_react_result) + selected_reaction.on_reaction(src, multiplier, special_react_result) - for(var/B in cached_required_reagents) - remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + for(var/B in cached_required_reagents) + remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + ammoReacted = ammoReacted + stepChemAmmount - ammoReacted = ammoReacted + stepChemAmmount - - reaction_occurred = 1 - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", cached_results[P]*ammoReacted, P)//log + reaction_occurred = 1 + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", ammoReacted, C.id)//log //Standard reaction mechanics: else: diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index f4dea1eb6a..55332b2f00 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -1,5 +1,3 @@ -#define fermiClone = null - /datum/status_effect/chem/SGDF id = "SGDF" //var/mob/living/fermi_Clone diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 26310a813b..b299677c68 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -28,7 +28,7 @@ ///obj/item/reagent/fermi/eigenstate/Initialize() /datum/reagent/fermi/eigenstate/New() - . = ..() //Unneeded? + . = ..() //Needed! location_created = get_turf(src) //Sets up coordinate of where it was created /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! @@ -124,6 +124,15 @@ //eigenstate END //Clone serum #chemClone +/datum/reagent/fermi/SDGF + name = "synthetic-derived growth factor" + id = "SDGF" + description = "A rapidly diving mass of Embryonic stem cells. These cells are missing a nucleus and quickly replicate a host’s DNA before growing to form an almost perfect clone of the host. In some cases neural replication takes longer, though the underlying reason underneath has yet to be determined." + color = "#60A584" // rgb: 96, 0, 255 + var/fClone_current_controller = OWNER + var/mob/living/split_personality/clone//there's two so they can swap without overwriting + var/mob/living/split_personality/owner + /datum/reagent/fermi/SGDF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone diff --git a/tgstation.dme b/tgstation.dme index e84c616d64..1610d0354d 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2778,10 +2778,12 @@ #include "modular_citadel\code\datums\components\material_container.dm" #include "modular_citadel\code\datums\components\phantomthief.dm" #include "modular_citadel\code\datums\components\souldeath.dm" +#include "modular_citadel\code\datums\mood_events\chem_events.dm" #include "modular_citadel\code\datums\mood_events\generic_negative_events.dm" #include "modular_citadel\code\datums\mood_events\generic_positive_events.dm" #include "modular_citadel\code\datums\mood_events\moodular.dm" #include "modular_citadel\code\datums\mutations\hulk.dm" +#include "modular_citadel\code\datums\status_effects\chems.dm" #include "modular_citadel\code\datums\status_effects\debuffs.dm" #include "modular_citadel\code\datums\traits\neutral.dm" #include "modular_citadel\code\datums\wires\airlock.dm" From 887aad3bf35244a61f18b6528f54faf3265e77f0 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Tue, 16 Apr 2019 18:02:44 +0100 Subject: [PATCH 025/608] Quick merge!! aaaa --- code/modules/reagents/chemistry/holder.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 69 +++++++++++-------- 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 79b5df1991..9c188c4435 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -470,7 +470,7 @@ var/deltapH = 0 var/stepChemAmmount = 0 var/ammoReacted = 0 - + //get purity from combined beaker reactant purities. var/purity = 1 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index b299677c68..98577f1218 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -7,6 +7,18 @@ //And tips their hat //Naninte chem +/datum/reagent/fermi + name = "Fermi" + id = "fermi" + taste_description = "If a petpat had a taste, this would be it." + +/datum/reagent/fermi/on_mob_life(mob/living/carbon/M) + current_cycle++ + holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency) //fermi reagents stay longer if you have a better metabolism + +/datum/reagent/fermi/overdose_start(mob/living/carbon/M) + current_cycle++ + //eigenstate Chem //Teleports you to chemistry and back //OD teleports you randomly around the Station @@ -24,6 +36,7 @@ addiction_stage4_end = 55 //Incase it's too long var/turf/open/location_created = null var/turf/open/location_return = null + addictCyc3 = 1 ///obj/item/reagent/fermi/eigenstate/Initialize() @@ -50,16 +63,17 @@ ..() /datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly - if(10) - to_chat(M, "Oh god, you feel like your wavefunction is about to hurl.") - M.Jitter(10) + switch(current_cycle) + if(10) + to_chat(M, "Oh god, you feel like your wavefunction is about to hurl.") + M.Jitter(10) - if(15 to INFINITY) - do_sparks(5,FALSE,src) - do_teleport(src, get_turf(src), 50, asoundin = 'sound/effects/phasein.ogg') - do_sparks(5,FALSE,src) - M.reagents.remove_reagent("eigenstate",1)//So you're not stuck for 10 minutes teleporting - ..() + if(15 to INFINITY) + do_sparks(5,FALSE,src) + do_teleport(src, get_turf(src), 50, asoundin = 'sound/effects/phasein.ogg') + do_sparks(5,FALSE,src) + M.reagents.remove_reagent("eigenstate",1)//So you're not stuck for 10 minutes teleporting + ..() //..() //loop function @@ -86,26 +100,27 @@ to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the eigenstate event horizon.") //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in - if(1) - var/typepath = M.type - var/fermi_Tclone = new typepath(M.loc) - //var/mob/living/carbon/O = M - var/mob/living/carbon/C = fermi_Tclone - C.appearance = M.appearance + switch(src.addictCyc3) + if(1) + var/typepath = M.type + var/fermi_Tclone = new typepath(M.loc) + //var/mob/living/carbon/O = M + var/mob/living/carbon/C = fermi_Tclone + C.appearance = M.appearance - //Incase Kevin breaks my code: - //if(istype(C) && istype(O)) - // C.real_name = O.real_name - // O.dna.transfer_identity(C) - // C.updateappearance(mutcolor_update=1) + //Incase Kevin breaks my code: + //if(istype(C) && istype(O)) + // C.real_name = O.real_name + // O.dna.transfer_identity(C) + // C.updateappearance(mutcolor_update=1) - visible_message("[M] collapses in from an alternative reality!") - if(2) - do_teleport(C, get_turf(C), 3, no_effects=TRUE) //teleports clone so it's hard to find the real one! - if(3) - qdel(C) //Deletes CLONE, or at least I hope it is. - visible_message("[M] is snapped across to a different alternative reality!") - .=1 //counter + visible_message("[M] collapses in from an alternative reality!") + if(2) + do_teleport(C, get_turf(C), 3, no_effects=TRUE) //teleports clone so it's hard to find the real one! + if(3) + qdel(C) //Deletes CLONE, or at least I hope it is. + visible_message("[M] is snapped across to a different alternative reality!") + src.addictCyc3 = 1 //counter do_teleport(src, get_turf(src), 3, no_effects=TRUE) //Teleports player randomly ..() //loop function From e038ba40c7da5c112b3e3b216fcb6915a2462009 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 16 Apr 2019 20:18:14 +0100 Subject: [PATCH 026/608] Fixing errors, down to one last error!! --- .../code/datums/status_effects/chems.dm | 14 +++--- .../chemistry/reagents/fermi_reagents.dm | 44 ++++++++++--------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 55332b2f00..df43c3432a 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -1,16 +1,16 @@ /datum/status_effect/chem/SGDF id = "SGDF" - //var/mob/living/fermi_Clone + var/mob/living/carbon/human/fermi_Clone = null /datum/status_effect/chem/SGDF/on_apply(mob/living/M) var/typepath = M.type - fermiClone = new typepath(M.loc) + fermi_Clone = new typepath(M.loc) //var/mob/living/carbon/M = owner - var/mob/living/carbon/C = fermi_Clone - if(istype(C) && istype(M)) - C.real_name = O.real_name - M.dna.transfer_identity(C) - C.updateappearance(mutcolor_update=1) + //var/mob/living/carbon/C = fermi_Clone + if(istype(fermi_Clone) && istype(M)) + fermi_Clone.real_name = M.real_name + M.dna.transfer_identity(fermi_Clone, transfer_SE=1) + fermi_Clone.updateappearance(mutcolor_update=1) return ..() /datum/status_effect/chem/SGDF/tick(mob/living/M) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 98577f1218..98d20188fe 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -36,7 +36,8 @@ addiction_stage4_end = 55 //Incase it's too long var/turf/open/location_created = null var/turf/open/location_return = null - addictCyc3 = 1 + var/addictCyc3 = 1 + var/mob/living/fermi_Tclone = null ///obj/item/reagent/fermi/eigenstate/Initialize() @@ -44,6 +45,7 @@ . = ..() //Needed! location_created = get_turf(src) //Sets up coordinate of where it was created + /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! if (holder.has_reagent("eigenstate")) do_sparks(5,FALSE,src) @@ -73,7 +75,7 @@ do_teleport(src, get_turf(src), 50, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) M.reagents.remove_reagent("eigenstate",1)//So you're not stuck for 10 minutes teleporting - ..() + ..() //..() //loop function @@ -103,10 +105,10 @@ switch(src.addictCyc3) if(1) var/typepath = M.type - var/fermi_Tclone = new typepath(M.loc) + fermi_Tclone = new typepath(M.loc) //var/mob/living/carbon/O = M - var/mob/living/carbon/C = fermi_Tclone - C.appearance = M.appearance + //var/mob/living/carbon/C = fermi_Tclone + fermi_Tclone.appearance = M.appearance //Incase Kevin breaks my code: //if(istype(C) && istype(O)) @@ -114,13 +116,14 @@ // O.dna.transfer_identity(C) // C.updateappearance(mutcolor_update=1) - visible_message("[M] collapses in from an alternative reality!") + M.visible_message("[M] collapses in from an alternative reality!") if(2) - do_teleport(C, get_turf(C), 3, no_effects=TRUE) //teleports clone so it's hard to find the real one! + do_teleport(fermi_Tclone, get_turf(fermi_Tclone), 3, no_effects=TRUE) //teleports clone so it's hard to find the real one! if(3) - qdel(C) //Deletes CLONE, or at least I hope it is. - visible_message("[M] is snapped across to a different alternative reality!") + qdel(fermi_Tclone) //Deletes CLONE, or at least I hope it is. + M.visible_message("[M] is snapped across to a different alternative reality!") src.addictCyc3 = 1 //counter + fermi_Tclone = null do_teleport(src, get_turf(src), 3, no_effects=TRUE) //Teleports player randomly ..() //loop function @@ -133,8 +136,8 @@ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) ..() -/datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) - return +///datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) +// return //eigenstate END @@ -144,21 +147,22 @@ id = "SDGF" description = "A rapidly diving mass of Embryonic stem cells. These cells are missing a nucleus and quickly replicate a host’s DNA before growing to form an almost perfect clone of the host. In some cases neural replication takes longer, though the underlying reason underneath has yet to be determined." color = "#60A584" // rgb: 96, 0, 255 - var/fClone_current_controller = OWNER + //var/fClone_current_controller = OWNER var/mob/living/split_personality/clone//there's two so they can swap without overwriting var/mob/living/split_personality/owner + //var/mob/living/carbon/SM /datum/reagent/fermi/SGDF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone - var/list/candidates = pollCandidatesForMob("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, SM, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies + var/list/candidates = pollCandidatesForMob("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, M, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies if(LAZYLEN(candidates)) //var/typepath = owner.type //clone = new typepath(owner.loc) var/typepath = M.type - fermi_Gclone = new typepath(M.loc) + var/mob/living/carbon/fermi_Gclone = new typepath(M.loc) //var/mob/living/carbon/SM = owner //var/mob/living/carbon/M = M var/mob/living/carbon/SM = fermi_Gclone @@ -169,18 +173,18 @@ var/mob/dead/observer/C = pick(candidates) SM.key = C.key - SM.mind.enslave_mind_to_creator(user) + SM.mind.enslave_mind_to_creator(M) //SM.sentience_act() to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") - visible_message("[M] suddenly shudders, and splits into two identical twins!") - SM.copy_known_languages_from(user, FALSE) + M.visible_message("[M] suddenly shudders, and splits into two identical twins!") + SM.copy_known_languages_from(M, FALSE) //after_success(user, SM) //qdel(src) else if(20) - O.apply_status_effect(var/datum/status_effect/chem/SGDF) + M.apply_status_effect(/datum/status_effect/chem/SGDF) ..() @@ -196,8 +200,8 @@ /datum/reagent/fermi/BElarger/overdose_start(mob/living/M) //Turns you into a female if male and ODing if(M.gender == MALE) M.gender = FEMALE - M.visible_message("[user] suddenly looks more feminine!", "You suddenly feel more feminine!") + M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") if(M.gender == FEMALE) M.gender = FEMALE - M.visible_message("[user] suddenly looks more masculine!", "You suddenly feel more masculine!") + M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") From 5a7a068b6e400a445171f568d9e8245a68810ca0 Mon Sep 17 00:00:00 2001 From: Useroth Date: Tue, 16 Apr 2019 21:21:16 +0200 Subject: [PATCH 027/608] It compiles now. --- modular_citadel/code/datums/status_effects/chems.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index df43c3432a..65a644da34 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -2,7 +2,7 @@ id = "SGDF" var/mob/living/carbon/human/fermi_Clone = null -/datum/status_effect/chem/SGDF/on_apply(mob/living/M) +/datum/status_effect/chem/SGDF/on_apply(mob/living/carbon/M) var/typepath = M.type fermi_Clone = new typepath(M.loc) //var/mob/living/carbon/M = owner From 390f9a635fda0f09c4bfb5ff9046e2cfa063adc1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 16 Apr 2019 23:03:24 +0100 Subject: [PATCH 028/608] Error message addition. --- code/modules/reagents/chemistry/holder.dm | 18 ++++++++++++++---- config/admins.txt | 1 + .../chemistry/reagents/fermi_reagents.dm | 1 + .../reagents/chemistry/recipes/fermi.dm | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 9c188c4435..3f559968ff 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -461,7 +461,6 @@ if(selected_reaction) var/datum/chemical_reaction/C = selected_reaction if (C.FermiChem == TRUE) - message_admins("Hee!!!! Someone is doing a Fermi reaction!!! I'm so excited!!") //FermiReact(C) //B is Beaker //P is product @@ -475,27 +474,32 @@ while (ammoReacted < multiplier) + message_admins("Loop beginning") //Begin Parse //Check extremes first if (chem_temp > C.ExplodeTemp) //go to explode proc + message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") FermiExplode() if (pH > 14 || pH < 0) //Create chemical sludge eventually(for now just destroy the beaker I guess?) //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + message_admins("pH is lover limit, cur pH: [pH]") FermiExplode() //For now, purity is handled elsewhere //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMax)**C.CurveSharpT)) + if (chem_temp < C.OptimalTempMax || chem_temp >= C.OptimalTempMin) + deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) + // 350 300 else if (chem_temp >= C.OptimalTempMax) deltaT = 1 else deltaT = 0 + message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") //Calculate DeltapH (Deviation of pH from optimal) //Lower range @@ -518,21 +522,27 @@ message_admins("Fermichem's pH broke!! Please let Fermis know!!") WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") //TODO Add CatalystFact + message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") stepChemAmmount = multiplier * deltaT if (ammoReacted > 0) - purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /(2 * (ammoReacted + stepChemAmmount)) //This should add the purity to the product + purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /((ammoReacted + stepChemAmmount)) //This should add the purity to the product else purity = deltapH + message_admins("purity: [purity], purity of beaker") + message_admins("Temp before change: [chem_temp], pH after change: [pH]") //Apply pH changes and thermal output of reaction to beaker chem_temp += (C.ThermicConstant * stepChemAmmount) pH += (C.HIonRelease * stepChemAmmount) + message_admins("Temp after change: [chem_temp], pH after change: [pH]") // End. selected_reaction.on_reaction(src, multiplier, special_react_result) + message_admins("cached_results: [cached_results], multiplier: [multiplier], stepChemAmmount [stepChemAmmount]") for(var/B in cached_required_reagents) + message_admins("cached_results: [cached_results], multiplier: [multiplier], stepChemAmmount [stepChemAmmount]") remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? diff --git a/config/admins.txt b/config/admins.txt index 27a2178e2c..ff2d1362e0 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -9,3 +9,4 @@ ############################################################################################### yourckeygoeshere = Host +Useroth = Game Master diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 98d20188fe..2913c2f2b4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -44,6 +44,7 @@ /datum/reagent/fermi/eigenstate/New() . = ..() //Needed! location_created = get_turf(src) //Sets up coordinate of where it was created + ..() /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 6456715a96..5b07dd91c8 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -17,7 +17,7 @@ CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = -2.5 //Temperature change per 1u produced HIonRelease = 0.01 //pH change per 1u reaction - RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect + RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way ImpureChem = "toxin" //What chemical is produced with an inpure reaction From 5657fd8cde1d15860bf2e2c0fa28574a3b1e7164 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 20 Apr 2019 03:40:40 +0100 Subject: [PATCH 029/608] endless sadness and exhaustion --- code/modules/reagents/chemistry/holder.dm | 169 +-- code/modules/reagents/chemistry/holderbk3.dm | 961 ++++++++++++++++++ .../reagents/chemistry/holdersplitfail.dm | 958 +++++++++++++++++ 3 files changed, 2006 insertions(+), 82 deletions(-) create mode 100644 code/modules/reagents/chemistry/holderbk3.dm create mode 100644 code/modules/reagents/chemistry/holdersplitfail.dm diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 3f559968ff..c38f065383 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -1,4 +1,3 @@ - /proc/build_chemical_reagent_list() //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id @@ -458,102 +457,108 @@ //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. //FermiChem relies on two additional properties; pH and impurity //Temperature plays into a larger role too. - if(selected_reaction) - var/datum/chemical_reaction/C = selected_reaction - if (C.FermiChem == TRUE) - //FermiReact(C) - //B is Beaker - //P is product - //multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmmount = 0 - var/ammoReacted = 0 - //get purity from combined beaker reactant purities. - var/purity = 1 + //if(selected_reaction) + var/datum/chemical_reaction/C = selected_reaction + if (C.FermiChem == TRUE) + //FermiReact(C) + //B is Beaker + //P is product + //multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmmount = 0 + var/ammoReacted = 0 + //get purity from combined beaker reactant purities. + var/purity = 1 - while (ammoReacted < multiplier) - message_admins("Loop beginning") - //Begin Parse + while (ammoReacted < multiplier) + message_admins("Loop beginning") + CHECK_TICK + //Begin Parse - //Check extremes first - if (chem_temp > C.ExplodeTemp) - //go to explode proc - message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") - FermiExplode() + //Check extremes first + if (chem_temp > C.ExplodeTemp) + //go to explode proc + message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") + FermiExplode() - if (pH > 14 || pH < 0) - //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - message_admins("pH is lover limit, cur pH: [pH]") - FermiExplode() + if (pH > 14 || pH < 0) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + message_admins("pH is lover limit, cur pH: [pH]") + FermiExplode() - //For now, purity is handled elsewhere + //For now, purity is handled elsewhere - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax || chem_temp >= C.OptimalTempMin) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) - // 350 300 - else if (chem_temp >= C.OptimalTempMax) - deltaT = 1 + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < C.OptimalTempMax || chem_temp >= C.OptimalTempMin) + deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) + // 350 300 + else if (chem_temp >= C.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") + + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < C.OptimalpHMin) + if (pH < (C.OptimalpHMin - C.ReactpHLim)) + deltapH = 0 else - deltaT = 0 - message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") - - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < C.OptimalpHMin) - if (pH < (C.OptimalpHMin - C.ReactpHLim)) - deltapH = 0 - else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) - //Upper range - else if (pH > C.OptimalpHMin) - if (pH > (C.OptimalpHMin + C.ReactpHLim)) - deltapH = 0 - else - deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) - //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) - deltapH = 1 - //This should never proc: + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) + //Upper range + else if (pH > C.OptimalpHMin) + if (pH > (C.OptimalpHMin + C.ReactpHLim)) + deltapH = 0 else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") - WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") - //TODO Add CatalystFact - message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") + deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) + //Within mid range + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + deltapH = 1 + //This should never proc: + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") + //TODO Add CatalystFact + message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") - stepChemAmmount = multiplier * deltaT - if (ammoReacted > 0) - purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /((ammoReacted + stepChemAmmount)) //This should add the purity to the product - else - purity = deltapH - message_admins("purity: [purity], purity of beaker") - message_admins("Temp before change: [chem_temp], pH after change: [pH]") - //Apply pH changes and thermal output of reaction to beaker - chem_temp += (C.ThermicConstant * stepChemAmmount) - pH += (C.HIonRelease * stepChemAmmount) - message_admins("Temp after change: [chem_temp], pH after change: [pH]") + stepChemAmmount = multiplier * deltaT + if (stepChemAmmount > C.RateUpLim) + stepChemAmmount = C.RateUpLim + else if (stepChemAmmount < 0.01) + stepChemAmmount = 0.1 + if (ammoReacted > 0) + purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /((ammoReacted + stepChemAmmount)) //This should add the purity to the product + else + purity = deltapH + message_admins("purity: [purity], purity of beaker") + message_admins("Temp before change: [chem_temp], pH after change: [pH]") + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) + message_admins("Temp after change: [chem_temp], pH after change: [pH]") - // End. + // End. - selected_reaction.on_reaction(src, multiplier, special_react_result) + selected_reaction.on_reaction(src, multiplier, special_react_result) + message_admins("cached_results: [cached_results], multiplier: [multiplier], stepChemAmmount [stepChemAmmount]") + for(var/B in cached_required_reagents) message_admins("cached_results: [cached_results], multiplier: [multiplier], stepChemAmmount [stepChemAmmount]") - for(var/B in cached_required_reagents) - message_admins("cached_results: [cached_results], multiplier: [multiplier], stepChemAmmount [stepChemAmmount]") - remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: - ammoReacted = ammoReacted + stepChemAmmount + ammoReacted = ammoReacted + stepChemAmmount + CHECK_TICK - reaction_occurred = 1 - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", ammoReacted, C.id)//log + reaction_occurred = 1 + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", ammoReacted, C.id)//log //Standard reaction mechanics: else: @@ -959,4 +964,4 @@ if(initial(R.can_synth)) random_reagents += initial(R.id) var/picked_reagent = pick(random_reagents) - return picked_reagent + return picked_reagent \ No newline at end of file diff --git a/code/modules/reagents/chemistry/holderbk3.dm b/code/modules/reagents/chemistry/holderbk3.dm new file mode 100644 index 0000000000..06e99bac96 --- /dev/null +++ b/code/modules/reagents/chemistry/holderbk3.dm @@ -0,0 +1,961 @@ + +/proc/build_chemical_reagent_list() + //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id + + if(GLOB.chemical_reagents_list) + return + + var/paths = subtypesof(/datum/reagent) + GLOB.chemical_reagents_list = list() + + for(var/path in paths) + var/datum/reagent/D = new path() + GLOB.chemical_reagents_list[D.id] = D + +/proc/build_chemical_reactions_list() + //Chemical Reactions - Initialises all /datum/chemical_reaction into a list + // It is filtered into multiple lists within a list. + // For example: + // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma + + if(GLOB.chemical_reactions_list) + return + + var/paths = subtypesof(/datum/chemical_reaction) + GLOB.chemical_reactions_list = list() + + for(var/path in paths) + + var/datum/chemical_reaction/D = new path() + var/list/reaction_ids = list() + + if(D.required_reagents && D.required_reagents.len) + for(var/reaction in D.required_reagents) + reaction_ids += reaction + + // Create filters based on each reagent id in the required reagents list + for(var/id in reaction_ids) + if(!GLOB.chemical_reactions_list[id]) + GLOB.chemical_reactions_list[id] = list() + GLOB.chemical_reactions_list[id] += D + break // Don't bother adding ourselves to other reagent ids, it is redundant + +/////////////////////////////////////////////////////////////////////////////////// + +/datum/reagents + var/list/datum/reagent/reagent_list = new/list() + var/total_volume = 0 + var/maximum_volume = 100 + var/atom/my_atom = null + var/chem_temp = 150 + var/pH = REAGENT_NORMAL_PH + var/last_tick = 1 + var/addiction_tick = 1 + var/list/datum/reagent/addiction_list = new/list() + var/reagents_holder_flags + +/datum/reagents/New(maximum=100) + maximum_volume = maximum + + //I dislike having these here but map-objects are initialised before world/New() is called. >_> + if(!GLOB.chemical_reagents_list) + build_chemical_reagent_list() + if(!GLOB.chemical_reactions_list) + build_chemical_reactions_list() + +/datum/reagents/Destroy() + . = ..() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + qdel(R) + cached_reagents.Cut() + cached_reagents = null + if(my_atom && my_atom.reagents == src) + my_atom.reagents = null + my_atom = null + +// Used in attack logs for reagents in pills and such +/datum/reagents/proc/log_list() + if(!length(reagent_list)) + return "no reagents" + + var/list/data = list() + for(var/r in reagent_list) //no reagents will be left behind + var/datum/reagent/R = r + data += "[R.id] ([round(R.volume, 0.1)]u)" + //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. + return english_list(data) + +/datum/reagents/proc/remove_any(amount = 1) + var/list/cached_reagents = reagent_list + var/total_transfered = 0 + var/current_list_element = 1 + + current_list_element = rand(1, cached_reagents.len) + + while(total_transfered != amount) + if(total_transfered >= amount) + break + if(total_volume <= 0 || !cached_reagents.len) + break + + if(current_list_element > cached_reagents.len) + current_list_element = 1 + + var/datum/reagent/R = cached_reagents[current_list_element] + remove_reagent(R.id, 1) + + current_list_element++ + total_transfered++ + update_total() + + handle_reactions() + return total_transfered + +/datum/reagents/proc/remove_all(amount = 1) + var/list/cached_reagents = reagent_list + if(total_volume > 0) + var/part = amount / total_volume + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + remove_reagent(R.id, R.volume * part) + + update_total() + handle_reactions() + return amount + +/datum/reagents/proc/get_master_reagent_name() + var/list/cached_reagents = reagent_list + var/name + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + name = R.name + + return name + +/datum/reagents/proc/get_master_reagent_id() + var/list/cached_reagents = reagent_list + var/id + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + id = R.id + + return id + +/datum/reagents/proc/get_master_reagent() + var/list/cached_reagents = reagent_list + var/datum/reagent/master + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + master = R + + return master + +/datum/reagents/proc/trans_to(obj/target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. + var/list/cached_reagents = reagent_list + if(!target || !total_volume) + return + if(amount < 0) + return + + var/datum/reagents/R + if(istype(target, /datum/reagents)) + R = target + else + if(!target.reagents) + return + R = target.reagents + amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) + var/part = amount / src.total_volume + var/trans_data = null + for(var/reagent in cached_reagents) + var/datum/reagent/T = reagent + var/transfer_amount = T.volume * part + if(preserve_data) + trans_data = copy_data(T) + + //fermichem Added ph TODO: add T.purity + R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + //R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + remove_reagent(T.id, transfer_amount) + + update_total() + R.update_total() + if(!no_react) + R.handle_reactions() + src.handle_reactions() + return amount + +/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1) + var/list/cached_reagents = reagent_list + if(!target || !total_volume) + return + + var/datum/reagents/R + if(istype(target, /datum/reagents)) + R = target + else + if(!target.reagents) + return + R = target.reagents + + if(amount < 0) + return + amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) + var/part = amount / total_volume + var/trans_data = null + for(var/reagent in cached_reagents) + var/datum/reagent/T = reagent + var/copy_amount = T.volume * part + if(preserve_data) + trans_data = T.data + R.add_reagent(T.id, copy_amount * multiplier, trans_data) + + src.update_total() + R.update_total() + R.handle_reactions() + src.handle_reactions() + return amount + +/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N + var/list/cached_reagents = reagent_list + if (!target) + return + if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) + return + if(amount < 0) + return + + var/datum/reagents/R = target.reagents + if(src.get_reagent_amount(reagent)= R.overdose_threshold && !R.overdosed) + R.overdosed = 1 + need_mob_update += R.overdose_start(C) + if(R.addiction_threshold) + if(R.volume >= R.addiction_threshold && !is_type_in_list(R, cached_addictions)) + var/datum/reagent/new_reagent = new R.type() + cached_addictions.Add(new_reagent) + if(R.overdosed) + need_mob_update += R.overdose_process(C) + if(is_type_in_list(R,cached_addictions)) + for(var/addiction in cached_addictions) + var/datum/reagent/A = addiction + if(istype(R, A)) + A.addiction_stage = -15 // you're satisfied for a good while. + need_mob_update += R.on_mob_life(C) + + if(can_overdose) + if(addiction_tick == 6) + addiction_tick = 1 + for(var/addiction in cached_addictions) + var/datum/reagent/R = addiction + if(C && R) + R.addiction_stage++ + if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end) + need_mob_update += R.addiction_act_stage1(C) + else if(R.addiction_stage1_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end) + need_mob_update += R.addiction_act_stage2(C) + else if(R.addiction_stage2_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end) + need_mob_update += R.addiction_act_stage3(C) + else if(R.addiction_stage3_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end) + need_mob_update += R.addiction_act_stage4(C) + else if(R.addiction_stage4_end <= R.addiction_stage) + to_chat(C, "You feel like you've gotten over your need for [R.name].") + SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.id]_addiction") + cached_addictions.Remove(R) + addiction_tick++ + if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. + C.updatehealth() + C.update_canmove() + C.update_stamina() + update_total() + + +/datum/reagents/proc/set_reacting(react = TRUE) + if(react) + reagents_holder_flags &= ~(REAGENT_NOREACT) + else + reagents_holder_flags |= REAGENT_NOREACT + +/datum/reagents/proc/conditional_update_move(atom/A, Running = 0) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + R.on_move (A, Running) + update_total() + +/datum/reagents/proc/conditional_update(atom/A) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + R.on_update (A) + update_total() + +/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar + var/list/cached_reagents = reagent_list //a list of the reagents? + var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? + var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! + if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. + return //Yup, no reactions here. No siree. + + var/reaction_occurred = 0 // checks if reaction, binary variable + do //What does do do in byond? It sounds very redundant? is it a while loop? + var/list/possible_reactions = list() //init list + reaction_occurred = 0 // sets it back to 0? + for(var/reagent in cached_reagents) //for reagent in beaker/holder + var/datum/reagent/R = reagent //check to make sure that reagent is there for the reaction list + for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id + if(!reaction) + continue + + var/datum/chemical_reaction/C = reaction + var/list/cached_required_reagents = C.required_reagents + var/total_required_reagents = cached_required_reagents.len + var/total_matching_reagents = 0 + var/list/cached_required_catalysts = C.required_catalysts + var/total_required_catalysts = cached_required_catalysts.len + var/total_matching_catalysts= 0 + var/matching_container = 0 + var/matching_other = 0 + var/required_temp = C.required_temp + var/is_cold_recipe = C.is_cold_recipe + var/meets_temp_requirement = 0 + var/has_special_react = C.special_react + var/can_special_react = 0 + var/reactedVol = 0 + + for(var/B in cached_required_reagents) + if(!has_reagent(B, cached_required_reagents[B])) + break + total_matching_reagents++ + for(var/B in cached_required_catalysts) + if(!has_reagent(B, cached_required_catalysts[B])) + break + total_matching_catalysts++ + if(cached_my_atom) + if(!C.required_container) + matching_container = 1 + + else + if(cached_my_atom.type == C.required_container)//if the suspected container is a container + matching_container = 1 + if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs + return + if(!C.required_other)//Checks for other things required + matching_other = 1//binary check passes + + else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem + var/obj/item/slime_extract/M = cached_my_atom + + if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this + matching_other = 1 + else + if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? Oh, cyro. + matching_container = 1 + if(!C.required_other) + matching_other = 1 + + //FermiChem + /* + if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! + if (C.FermiExplode == TRUE) + //To be added! + else + FermiExplode() + //explode function!! + */ + + if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! + meets_temp_requirement = 1//binary pass + + if(!has_special_react || C.check_special_react(src)) + can_special_react = 1 + + if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react) + possible_reactions += C + + if(possible_reactions.len)//does list exist? + var/datum/chemical_reaction/selected_reaction = possible_reactions[1] + //select the reaction with the most extreme temperature requirements + for(var/V in possible_reactions)//why V, surely that would indicate volume? V is the reaction potential. + var/datum/chemical_reaction/competitor = V //competitor? I think this is theres two of them. Troubling..! + if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. + if(competitor.required_temp <= selected_reaction.required_temp)//only returns with lower if reaction "is cold" var. + selected_reaction = competitor + else + if(competitor.required_temp >= selected_reaction.required_temp) //will return with the hotter reacting first. + selected_reaction = competitor + var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list + var/list/cached_results = selected_reaction.results//resultant chemical list + var/special_react_result = selected_reaction.check_special_react(src) + var/list/multiplier = INFINITY //Wat + + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + + //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. + //FermiChem relies on two additional properties; pH and impurity + //Temperature plays into a larger role too. + //BRANCH HERE + if(selected_reaction) + var/datum/chemical_reaction/C = selected_reaction + + if (C.FermiChem == TRUE) + message_admins("FermiChem Proc'd") + + while (reaction_occurred < 1) + reaction_occurred, reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier) + CHECK_TICK + + //Standard reaction mechanics: + else + + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + + for(var/B in cached_required_reagents) + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log + add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: + + + var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers + var/iconhtml = icon2html(cached_my_atom, seen) + if(cached_my_atom) + if(!ismob(cached_my_atom)) // No bubbling mobs + if(selected_reaction.mix_sound) + playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) + + for(var/mob/M in seen) + to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + + if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. + var/obj/item/slime_extract/ME2 = my_atom + ME2.Uses-- + if(ME2.Uses <= 0) // give the notification that the slime core is dead + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") + ME2.name = "used slime extract" + ME2.desc = "This extract has been used up." + + selected_reaction.on_reaction(src, multiplier, special_react_result) + reaction_occurred = 1 + + while(reaction_occurred)//while do nothing? + update_total()//Don't know waht this does. + return 0//end! + +/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, totalVol) + var/datum/chemical_reaction/C = selected_reaction + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmmount = 0 + var/ammoReacted = 0 + //get purity from combined beaker reactant purities HERE. + var/purity = 1 + //var/tempVol = totalVol + //var/list/multiplier = INFINITY + + message_admins("Loop beginning") + //Begin Parse + + //Check extremes first + if (chem_temp > C.ExplodeTemp) + //go to explode proc + message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") + FermiExplode() + + if (pH > 14 || pH < 0) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + message_admins("pH is lover limit, cur pH: [pH]") + FermiExplode() + + //For now, purity is handled elsewhere + + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) + deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) + else if (chem_temp >= C.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") + + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < C.OptimalpHMin) + if (pH < (C.OptimalpHMin - C.ReactpHLim)) + deltapH = 0 + else + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) + //Upper range + else if (pH > C.OptimalpHMin) + if (pH > (C.OptimalpHMin + C.ReactpHLim)) + deltapH = 0 + else + deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) + //Within mid range + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + deltapH = 1 + //This should never proc: + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") + //TODO Add CatalystFact + message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") + + stepChemAmmount = tempVol * deltaT + if (stepChemAmmount > C.RateUpLim) + stepChemAmmount = C.RateUpLim + else if (stepChemAmmount < 0.01) + stepChemAmmount = 0.01 + + if (ammoReacted > 0) + purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /((ammoReacted + stepChemAmmount)) //This should add the purity to the product + else + purity = deltapH + message_admins("purity: [purity], purity of beaker") + message_admins("Temp before change: [chem_temp], pH after change: [pH]") + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) + message_admins("Temp after change: [chem_temp], pH after change: [pH]") + + // End. + + selected_reaction.on_reaction(src, multiplier, special_react_result) + + for(var/B in cached_required_reagents) // + tempVol = min(totalVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + + message_admins("cached_results: [cached_results], totalVol: [totalVol], stepChemAmmount [stepChemAmmount]") + for(var/B in cached_required_reagents) + message_admins("cached_required_reagents(B): [cached_required_reagents[B]], totalVol: [totalVol], base stepChemAmmount [stepChemAmmount]") + remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + totalVol = max(totalVol, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + + ammoReacted = ammoReacted + stepChemAmmount + + if ammoReacted = totalVol + reaction_occurred = 1 + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", ammoReacted, C.id)//log + + CHECK_TICK + return (reaction_occurred, ammoReacted) + +/datum/reagents/proc/FermiExplode() + return + +/datum/reagents/proc/isolate_reagent(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if(R.id != reagent) + del_reagent(R.id) + update_total() + +/datum/reagents/proc/del_reagent(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if(R.id == reagent) + if(my_atom && isliving(my_atom)) + var/mob/living/M = my_atom + R.on_mob_delete(M) + qdel(R) + reagent_list -= R + update_total() + if(my_atom) + my_atom.on_reagent_change(DEL_REAGENT) + return 1 + +/datum/reagents/proc/update_total() + var/list/cached_reagents = reagent_list + total_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume < 0.1) + del_reagent(R.id) + else + total_volume += R.volume + + return 0 + +/datum/reagents/proc/clear_reagents() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + del_reagent(R.id) + return 0 + +/datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1) + var/react_type + if(isliving(A)) + react_type = "LIVING" + if(method == INGEST) + var/mob/living/L = A + L.taste(src) + else if(isturf(A)) + react_type = "TURF" + else if(isobj(A)) + react_type = "OBJ" + else + return + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + switch(react_type) + if("LIVING") + var/touch_protection = 0 + if(method == VAPOR) + var/mob/living/L = A + touch_protection = L.get_permeability_protection() + R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection) + if("TURF") + R.reaction_turf(A, R.volume * volume_modifier, show_message) + if("OBJ") + R.reaction_obj(A, R.volume * volume_modifier, show_message) + +/datum/reagents/proc/holder_full() + if(total_volume >= maximum_volume) + return TRUE + return FALSE + +//Returns the average specific heat for all reagents currently in this holder. +/datum/reagents/proc/specific_heat() + . = 0 + var/cached_amount = total_volume //cache amount + var/list/cached_reagents = reagent_list //cache reagents + for(var/I in cached_reagents) + var/datum/reagent/R = I + . += R.specific_heat * (R.volume / cached_amount) + +/datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) + var/S = specific_heat() + chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) + +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, pH = 7, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ + if(!isnum(amount) || !amount) + return FALSE + + if(amount <= 0) + return FALSE + + var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] + if(!D) + WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") + return FALSE + + update_total() + var/cached_total = total_volume + if(cached_total + amount > maximum_volume) + amount = (maximum_volume - cached_total) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. + if(amount <= 0) + return FALSE + var/new_total = cached_total + amount + var/cached_temp = chem_temp + var/list/cached_reagents = reagent_list + + //Equalize temperature - Not using specific_heat() because the new chemical isn't in yet. + var/specific_heat = 0 + var/thermal_energy = 0 + for(var/i in cached_reagents) + var/datum/reagent/R = i + specific_heat += R.specific_heat * (R.volume / new_total) + thermal_energy += R.specific_heat * R.volume * cached_temp + specific_heat += D.specific_heat * (amount / new_total) + thermal_energy += D.specific_heat * amount * reagtemp + chem_temp = thermal_energy / (specific_heat * new_total) + //// + + //add the reagent to the existing if it exists + for(var/A in cached_reagents) + var/datum/reagent/R = A + if (R.id == reagent) + R.volume += amount + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + R.on_merge(data, amount) + if(!no_react) + handle_reactions() + return TRUE + + //otherwise make a new one + var/datum/reagent/R = new D.type(data) + cached_reagents += R + R.holder = src + R.volume = amount + if(data) + R.data = data + R.on_new(data) + + if(isliving(my_atom)) + R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + if(!no_react) + handle_reactions() + return TRUE + +/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) + for(var/r_id in list_reagents) + var/amt = list_reagents[r_id] + add_reagent(r_id, amt, data) + +/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to + + if(isnull(amount)) + amount = 0 + CRASH("null amount passed to reagent code") + return FALSE + + if(!isnum(amount)) + return FALSE + + if(amount < 0) + return FALSE + + var/list/cached_reagents = reagent_list + + for(var/A in cached_reagents) + var/datum/reagent/R = A + if (R.id == reagent) + //clamp the removal amount to be between current reagent amount + //and zero, to prevent removing more than the holder has stored + amount = CLAMP(amount, 0, R.volume) + R.volume -= amount + update_total() + if(!safety)//So it does not handle reactions when it need not to + handle_reactions() + if(my_atom) + my_atom.on_reagent_change(REM_REAGENT) + return TRUE + + return FALSE + +/datum/reagents/proc/has_reagent(reagent, amount = -1) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if (R.id == reagent) + if(!amount) + return R + else + if(R.volume >= amount) + return R + else + return 0 + + return 0 + +/datum/reagents/proc/get_reagent_amount(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if (R.id == reagent) + return R.volume + + return 0 + +/datum/reagents/proc/get_reagents() + var/list/names = list() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + names += R.name + + return jointext(names, ",") + +/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. + if(!isnum(amount)) + return 1 + var/list/cached_reagents = reagent_list + var/has_removed_reagent = 0 + + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + var/matches = 0 + // Switch between how we check the reagent type + if(strict) + if(R.type == reagent_type) + matches = 1 + else + if(istype(R, reagent_type)) + matches = 1 + // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. + if(matches) + // Have our other proc handle removement + has_removed_reagent = remove_reagent(R.id, amount, safety) + + return has_removed_reagent + +//two helper functions to preserve data across reactions (needed for xenoarch) +/datum/reagents/proc/get_data(reagent_id) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.id == reagent_id) + return R.data + +/datum/reagents/proc/set_data(reagent_id, new_data) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.id == reagent_id) + R.data = new_data + +/datum/reagents/proc/copy_data(datum/reagent/current_reagent) + if(!current_reagent || !current_reagent.data) + return null + if(!istype(current_reagent.data, /list)) + return current_reagent.data + + var/list/trans_data = current_reagent.data.Copy() + + // We do this so that introducing a virus to a blood sample + // doesn't automagically infect all other blood samples from + // the same donor. + // + // Technically we should probably copy all data lists, but + // that could possibly eat up a lot of memory needlessly + // if most data lists are read-only. + if(trans_data["viruses"]) + var/list/v = trans_data["viruses"] + trans_data["viruses"] = v.Copy() + + return trans_data + +/datum/reagents/proc/get_reagent(type) + var/list/cached_reagents = reagent_list + . = locate(type) in cached_reagents + +/datum/reagents/proc/generate_taste_message(minimum_percent=15) + // the lower the minimum percent, the more sensitive the message is. + var/list/out = list() + var/list/tastes = list() //descriptor = strength + if(minimum_percent <= 100) + for(var/datum/reagent/R in reagent_list) + if(!R.taste_mult) + continue + + if(istype(R, /datum/reagent/consumable/nutriment)) + var/list/taste_data = R.data + for(var/taste in taste_data) + var/ratio = taste_data[taste] + var/amount = ratio * R.taste_mult * R.volume + if(taste in tastes) + tastes[taste] += amount + else + tastes[taste] = amount + else + var/taste_desc = R.taste_description + var/taste_amount = R.volume * R.taste_mult + if(taste_desc in tastes) + tastes[taste_desc] += taste_amount + else + tastes[taste_desc] = taste_amount + //deal with percentages + // TODO it would be great if we could sort these from strong to weak + var/total_taste = counterlist_sum(tastes) + if(total_taste > 0) + for(var/taste_desc in tastes) + var/percent = tastes[taste_desc]/total_taste * 100 + if(percent < minimum_percent) + continue + var/intensity_desc = "a hint of" + if(percent > minimum_percent * 2 || percent == 100) + intensity_desc = "" + else if(percent > minimum_percent * 3) + intensity_desc = "the strong flavor of" + if(intensity_desc != "") + out += "[intensity_desc] [taste_desc]" + else + out += "[taste_desc]" + + return english_list(out, "something indescribable") + +/datum/reagents/proc/expose_temperature(var/temperature, var/coeff=0.02) + var/temp_delta = (temperature - chem_temp) * coeff + if(temp_delta > 0) + chem_temp = min(chem_temp + max(temp_delta, 1), temperature) + else + chem_temp = max(chem_temp + min(temp_delta, -1), temperature) + chem_temp = round(chem_temp) + handle_reactions() + +/////////////////////////////////////////////////////////////////////////////////// + + +// Convenience proc to create a reagents holder for an atom +// Max vol is maximum volume of holder +/atom/proc/create_reagents(max_vol) + if(reagents) + qdel(reagents) + reagents = new/datum/reagents(max_vol) + reagents.my_atom = src + +/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents + var/static/list/random_reagents = list() + if(!random_reagents.len) + for(var/thing in subtypesof(/datum/reagent)) + var/datum/reagent/R = thing + if(initial(R.can_synth)) + random_reagents += initial(R.id) + var/picked_reagent = pick(random_reagents) + return picked_reagent diff --git a/code/modules/reagents/chemistry/holdersplitfail.dm b/code/modules/reagents/chemistry/holdersplitfail.dm new file mode 100644 index 0000000000..be39ee3448 --- /dev/null +++ b/code/modules/reagents/chemistry/holdersplitfail.dm @@ -0,0 +1,958 @@ + +/proc/build_chemical_reagent_list() + //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id + + if(GLOB.chemical_reagents_list) + return + + var/paths = subtypesof(/datum/reagent) + GLOB.chemical_reagents_list = list() + + for(var/path in paths) + var/datum/reagent/D = new path() + GLOB.chemical_reagents_list[D.id] = D + +/proc/build_chemical_reactions_list() + //Chemical Reactions - Initialises all /datum/chemical_reaction into a list + // It is filtered into multiple lists within a list. + // For example: + // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma + + if(GLOB.chemical_reactions_list) + return + + var/paths = subtypesof(/datum/chemical_reaction) + GLOB.chemical_reactions_list = list() + + for(var/path in paths) + + var/datum/chemical_reaction/D = new path() + var/list/reaction_ids = list() + + if(D.required_reagents && D.required_reagents.len) + for(var/reaction in D.required_reagents) + reaction_ids += reaction + + // Create filters based on each reagent id in the required reagents list + for(var/id in reaction_ids) + if(!GLOB.chemical_reactions_list[id]) + GLOB.chemical_reactions_list[id] = list() + GLOB.chemical_reactions_list[id] += D + break // Don't bother adding ourselves to other reagent ids, it is redundant + +/////////////////////////////////////////////////////////////////////////////////// + +/datum/reagents + var/list/datum/reagent/reagent_list = new/list() + var/total_volume = 0 + var/maximum_volume = 100 + var/atom/my_atom = null + var/chem_temp = 150 + var/pH = REAGENT_NORMAL_PH + var/last_tick = 1 + var/addiction_tick = 1 + var/list/datum/reagent/addiction_list = new/list() + var/reagents_holder_flags + +/datum/reagents/New(maximum=100) + maximum_volume = maximum + + //I dislike having these here but map-objects are initialised before world/New() is called. >_> + if(!GLOB.chemical_reagents_list) + build_chemical_reagent_list() + if(!GLOB.chemical_reactions_list) + build_chemical_reactions_list() + +/datum/reagents/Destroy() + . = ..() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + qdel(R) + cached_reagents.Cut() + cached_reagents = null + if(my_atom && my_atom.reagents == src) + my_atom.reagents = null + my_atom = null + +// Used in attack logs for reagents in pills and such +/datum/reagents/proc/log_list() + if(!length(reagent_list)) + return "no reagents" + + var/list/data = list() + for(var/r in reagent_list) //no reagents will be left behind + var/datum/reagent/R = r + data += "[R.id] ([round(R.volume, 0.1)]u)" + //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. + return english_list(data) + +/datum/reagents/proc/remove_any(amount = 1) + var/list/cached_reagents = reagent_list + var/total_transfered = 0 + var/current_list_element = 1 + + current_list_element = rand(1, cached_reagents.len) + + while(total_transfered != amount) + if(total_transfered >= amount) + break + if(total_volume <= 0 || !cached_reagents.len) + break + + if(current_list_element > cached_reagents.len) + current_list_element = 1 + + var/datum/reagent/R = cached_reagents[current_list_element] + remove_reagent(R.id, 1) + + current_list_element++ + total_transfered++ + update_total() + + handle_reactions() + return total_transfered + +/datum/reagents/proc/remove_all(amount = 1) + var/list/cached_reagents = reagent_list + if(total_volume > 0) + var/part = amount / total_volume + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + remove_reagent(R.id, R.volume * part) + + update_total() + handle_reactions() + return amount + +/datum/reagents/proc/get_master_reagent_name() + var/list/cached_reagents = reagent_list + var/name + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + name = R.name + + return name + +/datum/reagents/proc/get_master_reagent_id() + var/list/cached_reagents = reagent_list + var/id + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + id = R.id + + return id + +/datum/reagents/proc/get_master_reagent() + var/list/cached_reagents = reagent_list + var/datum/reagent/master + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + master = R + + return master + +/datum/reagents/proc/trans_to(obj/target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. + var/list/cached_reagents = reagent_list + if(!target || !total_volume) + return + if(amount < 0) + return + + var/datum/reagents/R + if(istype(target, /datum/reagents)) + R = target + else + if(!target.reagents) + return + R = target.reagents + amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) + var/part = amount / src.total_volume + var/trans_data = null + for(var/reagent in cached_reagents) + var/datum/reagent/T = reagent + var/transfer_amount = T.volume * part + if(preserve_data) + trans_data = copy_data(T) + + //fermichem Added ph TODO: add T.purity + R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + //R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + remove_reagent(T.id, transfer_amount) + + update_total() + R.update_total() + if(!no_react) + R.handle_reactions() + src.handle_reactions() + return amount + +/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1) + var/list/cached_reagents = reagent_list + if(!target || !total_volume) + return + + var/datum/reagents/R + if(istype(target, /datum/reagents)) + R = target + else + if(!target.reagents) + return + R = target.reagents + + if(amount < 0) + return + amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) + var/part = amount / total_volume + var/trans_data = null + for(var/reagent in cached_reagents) + var/datum/reagent/T = reagent + var/copy_amount = T.volume * part + if(preserve_data) + trans_data = T.data + R.add_reagent(T.id, copy_amount * multiplier, trans_data) + + src.update_total() + R.update_total() + R.handle_reactions() + src.handle_reactions() + return amount + +/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N + var/list/cached_reagents = reagent_list + if (!target) + return + if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) + return + if(amount < 0) + return + + var/datum/reagents/R = target.reagents + if(src.get_reagent_amount(reagent)= R.overdose_threshold && !R.overdosed) + R.overdosed = 1 + need_mob_update += R.overdose_start(C) + if(R.addiction_threshold) + if(R.volume >= R.addiction_threshold && !is_type_in_list(R, cached_addictions)) + var/datum/reagent/new_reagent = new R.type() + cached_addictions.Add(new_reagent) + if(R.overdosed) + need_mob_update += R.overdose_process(C) + if(is_type_in_list(R,cached_addictions)) + for(var/addiction in cached_addictions) + var/datum/reagent/A = addiction + if(istype(R, A)) + A.addiction_stage = -15 // you're satisfied for a good while. + need_mob_update += R.on_mob_life(C) + + if(can_overdose) + if(addiction_tick == 6) + addiction_tick = 1 + for(var/addiction in cached_addictions) + var/datum/reagent/R = addiction + if(C && R) + R.addiction_stage++ + if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end) + need_mob_update += R.addiction_act_stage1(C) + else if(R.addiction_stage1_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end) + need_mob_update += R.addiction_act_stage2(C) + else if(R.addiction_stage2_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end) + need_mob_update += R.addiction_act_stage3(C) + else if(R.addiction_stage3_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end) + need_mob_update += R.addiction_act_stage4(C) + else if(R.addiction_stage4_end <= R.addiction_stage) + to_chat(C, "You feel like you've gotten over your need for [R.name].") + SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.id]_addiction") + cached_addictions.Remove(R) + addiction_tick++ + if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. + C.updatehealth() + C.update_canmove() + C.update_stamina() + update_total() + + +/datum/reagents/proc/set_reacting(react = TRUE) + if(react) + reagents_holder_flags &= ~(REAGENT_NOREACT) + else + reagents_holder_flags |= REAGENT_NOREACT + +/datum/reagents/proc/conditional_update_move(atom/A, Running = 0) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + R.on_move (A, Running) + update_total() + +/datum/reagents/proc/conditional_update(atom/A) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + R.on_update (A) + update_total() + +/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar + var/list/cached_reagents = reagent_list //a list of the reagents? + var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? + var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! + if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. + return //Yup, no reactions here. No siree. + + var/reaction_occurred = 0 // checks if reaction, binary variable + do //What does do do in byond? It sounds very redundant? is it a while loop? + var/list/possible_reactions = list() //init list + reaction_occurred = 0 // sets it back to 0? + for(var/reagent in cached_reagents) //for reagent in beaker/holder + var/datum/reagent/R = reagent //check to make sure that reagent is there for the reaction list + for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id + if(!reaction) + continue + + var/datum/chemical_reaction/C = reaction + var/list/cached_required_reagents = C.required_reagents + var/total_required_reagents = cached_required_reagents.len + var/total_matching_reagents = 0 + var/list/cached_required_catalysts = C.required_catalysts + var/total_required_catalysts = cached_required_catalysts.len + var/total_matching_catalysts= 0 + var/matching_container = 0 + var/matching_other = 0 + var/required_temp = C.required_temp + var/is_cold_recipe = C.is_cold_recipe + var/meets_temp_requirement = 0 + var/has_special_react = C.special_react + var/can_special_react = 0 + var/reactedVol = 0 + + for(var/B in cached_required_reagents) + if(!has_reagent(B, cached_required_reagents[B])) + break + total_matching_reagents++ + for(var/B in cached_required_catalysts) + if(!has_reagent(B, cached_required_catalysts[B])) + break + total_matching_catalysts++ + if(cached_my_atom) + if(!C.required_container) + matching_container = 1 + + else + if(cached_my_atom.type == C.required_container)//if the suspected container is a container + matching_container = 1 + if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs + return + if(!C.required_other)//Checks for other things required + matching_other = 1//binary check passes + + else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem + var/obj/item/slime_extract/M = cached_my_atom + + if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this + matching_other = 1 + else + if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? Oh, cyro. + matching_container = 1 + if(!C.required_other) + matching_other = 1 + + //FermiChem + /* + if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! + if (C.FermiExplode == TRUE) + //To be added! + else + FermiExplode() + //explode function!! + */ + + if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! + meets_temp_requirement = 1//binary pass + + if(!has_special_react || C.check_special_react(src)) + can_special_react = 1 + + if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react) + possible_reactions += C + + if(possible_reactions.len)//does list exist? + var/datum/chemical_reaction/selected_reaction = possible_reactions[1] + //select the reaction with the most extreme temperature requirements + for(var/V in possible_reactions)//why V, surely that would indicate volume? V is the reaction potential. + var/datum/chemical_reaction/competitor = V //competitor? I think this is theres two of them. Troubling..! + if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. + if(competitor.required_temp <= selected_reaction.required_temp)//only returns with lower if reaction "is cold" var. + selected_reaction = competitor + else + if(competitor.required_temp >= selected_reaction.required_temp) //will return with the hotter reacting first. + selected_reaction = competitor + var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list + var/list/cached_results = selected_reaction.results//resultant chemical list + var/special_react_result = selected_reaction.check_special_react(src) + var/list/multiplier = INFINITY //Wat + + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + + //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. + //FermiChem relies on two additional properties; pH and impurity + //Temperature plays into a larger role too. + //BRANCH HERE + //if(selected_reaction) + var/datum/chemical_reaction/C = selected_reaction + + if (C.FermiChem == TRUE) + message_admins("FermiChem Proc'd") + + while (reactedVol < multiplier) + reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, special_react_result, cached_required_reagents, cached_results, selected_reaction.results) + CHECK_TICK + reaction_occurred = 1 + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log + + //Standard reaction mechanics: + else + + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + + for(var/B in cached_required_reagents) + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log + add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: + + + var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers + var/iconhtml = icon2html(cached_my_atom, seen) + if(cached_my_atom) + if(!ismob(cached_my_atom)) // No bubbling mobs + if(selected_reaction.mix_sound) + playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) + + for(var/mob/M in seen) + to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + + if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. + var/obj/item/slime_extract/ME2 = my_atom + ME2.Uses-- + if(ME2.Uses <= 0) // give the notification that the slime core is dead + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") + ME2.name = "used slime extract" + ME2.desc = "This extract has been used up." + + selected_reaction.on_reaction(src, multiplier, special_react_result) + reaction_occurred = 1 + + while(reaction_occurred)//while do nothing? + update_total()//Don't know waht this does. + return 0//end! + +/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, multiplier, totalVol, special_react_result, cached_required_reagents, cached_results, selected_reaction.results) + var/datum/chemical_reaction/C = selected_reaction + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmmount = 0 + var/ammoReacted = 0 + //get purity from combined beaker reactant purities HERE. + var/purity = 1 + var/tempVol = totalVol + //var/list/multiplier = INFINITY + + message_admins("Loop beginning") + //Begin Parse + + //Check extremes first + if (chem_temp > C.ExplodeTemp) + //go to explode proc + message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") + FermiExplode() + + if (pH > 14 || pH < 0) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + message_admins("pH is lover limit, cur pH: [pH]") + FermiExplode() + + //For now, purity is handled elsewhere + + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) + deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) + else if (chem_temp >= C.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") + + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < C.OptimalpHMin) + if (pH < (C.OptimalpHMin - C.ReactpHLim)) + deltapH = 0 + else + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) + //Upper range + else if (pH > C.OptimalpHMin) + if (pH > (C.OptimalpHMin + C.ReactpHLim)) + deltapH = 0 + else + deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) + //Within mid range + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + deltapH = 1 + //This should never proc: + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") + //TODO Add CatalystFact + message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") + + stepChemAmmount = tempVol * deltaT + if (stepChemAmmount > C.RateUpLim) + stepChemAmmount = C.RateUpLim + else if (stepChemAmmount < 0.01) + stepChemAmmount = 0.01 + + if (totalVol > 0) + purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /((ammoReacted + stepChemAmmount)) //This should add the purity to the product + else + purity = deltapH + message_admins("purity: [purity], purity of beaker") + message_admins("Temp before change: [chem_temp], pH after change: [pH]") + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) + message_admins("Temp after change: [chem_temp], pH after change: [pH]") + + // End. + /* + for(var/B in cached_required_reagents) // + tempVol = min(totalVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + */ + message_admins("cached_results: [cached_results], totalVol: [totalVol], stepChemAmmount [stepChemAmmount]") + for(var/B in cached_required_reagents) + message_admins("cached_required_reagents(B): [cached_required_reagents[B]], totalVol: [totalVol], base stepChemAmmount [stepChemAmmount]") + remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + totalVol = max(totalVol, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + + totalVol = totalVol + stepChemAmmount + + + CHECK_TICK + return (totalVol) + +/datum/reagents/proc/FermiExplode() + return + +/datum/reagents/proc/isolate_reagent(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if(R.id != reagent) + del_reagent(R.id) + update_total() + +/datum/reagents/proc/del_reagent(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if(R.id == reagent) + if(my_atom && isliving(my_atom)) + var/mob/living/M = my_atom + R.on_mob_delete(M) + qdel(R) + reagent_list -= R + update_total() + if(my_atom) + my_atom.on_reagent_change(DEL_REAGENT) + return 1 + +/datum/reagents/proc/update_total() + var/list/cached_reagents = reagent_list + total_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume < 0.1) + del_reagent(R.id) + else + total_volume += R.volume + + return 0 + +/datum/reagents/proc/clear_reagents() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + del_reagent(R.id) + return 0 + +/datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1) + var/react_type + if(isliving(A)) + react_type = "LIVING" + if(method == INGEST) + var/mob/living/L = A + L.taste(src) + else if(isturf(A)) + react_type = "TURF" + else if(isobj(A)) + react_type = "OBJ" + else + return + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + switch(react_type) + if("LIVING") + var/touch_protection = 0 + if(method == VAPOR) + var/mob/living/L = A + touch_protection = L.get_permeability_protection() + R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection) + if("TURF") + R.reaction_turf(A, R.volume * volume_modifier, show_message) + if("OBJ") + R.reaction_obj(A, R.volume * volume_modifier, show_message) + +/datum/reagents/proc/holder_full() + if(total_volume >= maximum_volume) + return TRUE + return FALSE + +//Returns the average specific heat for all reagents currently in this holder. +/datum/reagents/proc/specific_heat() + . = 0 + var/cached_amount = total_volume //cache amount + var/list/cached_reagents = reagent_list //cache reagents + for(var/I in cached_reagents) + var/datum/reagent/R = I + . += R.specific_heat * (R.volume / cached_amount) + +/datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) + var/S = specific_heat() + chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) + +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, pH = 7, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ + if(!isnum(amount) || !amount) + return FALSE + + if(amount <= 0) + return FALSE + + var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] + if(!D) + WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") + return FALSE + + update_total() + var/cached_total = total_volume + if(cached_total + amount > maximum_volume) + amount = (maximum_volume - cached_total) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. + if(amount <= 0) + return FALSE + var/new_total = cached_total + amount + var/cached_temp = chem_temp + var/list/cached_reagents = reagent_list + + //Equalize temperature - Not using specific_heat() because the new chemical isn't in yet. + var/specific_heat = 0 + var/thermal_energy = 0 + for(var/i in cached_reagents) + var/datum/reagent/R = i + specific_heat += R.specific_heat * (R.volume / new_total) + thermal_energy += R.specific_heat * R.volume * cached_temp + specific_heat += D.specific_heat * (amount / new_total) + thermal_energy += D.specific_heat * amount * reagtemp + chem_temp = thermal_energy / (specific_heat * new_total) + //// + + //add the reagent to the existing if it exists + for(var/A in cached_reagents) + var/datum/reagent/R = A + if (R.id == reagent) + R.volume += amount + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + R.on_merge(data, amount) + if(!no_react) + handle_reactions() + return TRUE + + //otherwise make a new one + var/datum/reagent/R = new D.type(data) + cached_reagents += R + R.holder = src + R.volume = amount + if(data) + R.data = data + R.on_new(data) + + if(isliving(my_atom)) + R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + if(!no_react) + handle_reactions() + return TRUE + +/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) + for(var/r_id in list_reagents) + var/amt = list_reagents[r_id] + add_reagent(r_id, amt, data) + +/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to + + if(isnull(amount)) + amount = 0 + CRASH("null amount passed to reagent code") + return FALSE + + if(!isnum(amount)) + return FALSE + + if(amount < 0) + return FALSE + + var/list/cached_reagents = reagent_list + + for(var/A in cached_reagents) + var/datum/reagent/R = A + if (R.id == reagent) + //clamp the removal amount to be between current reagent amount + //and zero, to prevent removing more than the holder has stored + amount = CLAMP(amount, 0, R.volume) + R.volume -= amount + update_total() + if(!safety)//So it does not handle reactions when it need not to + handle_reactions() + if(my_atom) + my_atom.on_reagent_change(REM_REAGENT) + return TRUE + + return FALSE + +/datum/reagents/proc/has_reagent(reagent, amount = -1) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if (R.id == reagent) + if(!amount) + return R + else + if(R.volume >= amount) + return R + else + return 0 + + return 0 + +/datum/reagents/proc/get_reagent_amount(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if (R.id == reagent) + return R.volume + + return 0 + +/datum/reagents/proc/get_reagents() + var/list/names = list() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + names += R.name + + return jointext(names, ",") + +/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. + if(!isnum(amount)) + return 1 + var/list/cached_reagents = reagent_list + var/has_removed_reagent = 0 + + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + var/matches = 0 + // Switch between how we check the reagent type + if(strict) + if(R.type == reagent_type) + matches = 1 + else + if(istype(R, reagent_type)) + matches = 1 + // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. + if(matches) + // Have our other proc handle removement + has_removed_reagent = remove_reagent(R.id, amount, safety) + + return has_removed_reagent + +//two helper functions to preserve data across reactions (needed for xenoarch) +/datum/reagents/proc/get_data(reagent_id) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.id == reagent_id) + return R.data + +/datum/reagents/proc/set_data(reagent_id, new_data) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.id == reagent_id) + R.data = new_data + +/datum/reagents/proc/copy_data(datum/reagent/current_reagent) + if(!current_reagent || !current_reagent.data) + return null + if(!istype(current_reagent.data, /list)) + return current_reagent.data + + var/list/trans_data = current_reagent.data.Copy() + + // We do this so that introducing a virus to a blood sample + // doesn't automagically infect all other blood samples from + // the same donor. + // + // Technically we should probably copy all data lists, but + // that could possibly eat up a lot of memory needlessly + // if most data lists are read-only. + if(trans_data["viruses"]) + var/list/v = trans_data["viruses"] + trans_data["viruses"] = v.Copy() + + return trans_data + +/datum/reagents/proc/get_reagent(type) + var/list/cached_reagents = reagent_list + . = locate(type) in cached_reagents + +/datum/reagents/proc/generate_taste_message(minimum_percent=15) + // the lower the minimum percent, the more sensitive the message is. + var/list/out = list() + var/list/tastes = list() //descriptor = strength + if(minimum_percent <= 100) + for(var/datum/reagent/R in reagent_list) + if(!R.taste_mult) + continue + + if(istype(R, /datum/reagent/consumable/nutriment)) + var/list/taste_data = R.data + for(var/taste in taste_data) + var/ratio = taste_data[taste] + var/amount = ratio * R.taste_mult * R.volume + if(taste in tastes) + tastes[taste] += amount + else + tastes[taste] = amount + else + var/taste_desc = R.taste_description + var/taste_amount = R.volume * R.taste_mult + if(taste_desc in tastes) + tastes[taste_desc] += taste_amount + else + tastes[taste_desc] = taste_amount + //deal with percentages + // TODO it would be great if we could sort these from strong to weak + var/total_taste = counterlist_sum(tastes) + if(total_taste > 0) + for(var/taste_desc in tastes) + var/percent = tastes[taste_desc]/total_taste * 100 + if(percent < minimum_percent) + continue + var/intensity_desc = "a hint of" + if(percent > minimum_percent * 2 || percent == 100) + intensity_desc = "" + else if(percent > minimum_percent * 3) + intensity_desc = "the strong flavor of" + if(intensity_desc != "") + out += "[intensity_desc] [taste_desc]" + else + out += "[taste_desc]" + + return english_list(out, "something indescribable") + +/datum/reagents/proc/expose_temperature(var/temperature, var/coeff=0.02) + var/temp_delta = (temperature - chem_temp) * coeff + if(temp_delta > 0) + chem_temp = min(chem_temp + max(temp_delta, 1), temperature) + else + chem_temp = max(chem_temp + min(temp_delta, -1), temperature) + chem_temp = round(chem_temp) + handle_reactions() + +/////////////////////////////////////////////////////////////////////////////////// + + +// Convenience proc to create a reagents holder for an atom +// Max vol is maximum volume of holder +/atom/proc/create_reagents(max_vol) + if(reagents) + qdel(reagents) + reagents = new/datum/reagents(max_vol) + reagents.my_atom = src + +/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents + var/static/list/random_reagents = list() + if(!random_reagents.len) + for(var/thing in subtypesof(/datum/reagent)) + var/datum/reagent/R = thing + if(initial(R.can_synth)) + random_reagents += initial(R.id) + var/picked_reagent = pick(random_reagents) + return picked_reagent From 744b1328e87b9551d61993802bf1ccf1a7bfc5ab Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 22 Apr 2019 20:08:19 +0100 Subject: [PATCH 030/608] Fixing the main holder reaction loop - fermi is it's own proc --- ....dm => holder(nonProc.old.functional.).dm} | 267 +++++++++-------- code/modules/reagents/chemistry/holder.dm | 283 +++++++++--------- code/modules/reagents/chemistry/holderbk3.dm | 1 + .../chemistry/reagents/fermi_reagents.dm | 33 +- 4 files changed, 299 insertions(+), 285 deletions(-) rename code/modules/reagents/chemistry/{holdersplitfail.dm => holder(nonProc.old.functional.).dm} (81%) diff --git a/code/modules/reagents/chemistry/holdersplitfail.dm b/code/modules/reagents/chemistry/holder(nonProc.old.functional.).dm similarity index 81% rename from code/modules/reagents/chemistry/holdersplitfail.dm rename to code/modules/reagents/chemistry/holder(nonProc.old.functional.).dm index be39ee3448..c38f065383 100644 --- a/code/modules/reagents/chemistry/holdersplitfail.dm +++ b/code/modules/reagents/chemistry/holder(nonProc.old.functional.).dm @@ -1,4 +1,3 @@ - /proc/build_chemical_reagent_list() //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id @@ -368,7 +367,25 @@ var/meets_temp_requirement = 0 var/has_special_react = C.special_react var/can_special_react = 0 - var/reactedVol = 0 + //FermiChem WHY ARE VARIBLES SO ESTRANGED it makes me sad + /* + var/OptimalTempMin = C.OptimalTempMin // Lower area of bell curve for determining heat based rate reactions + var/OptimalTempMax = C.OptimalTempMax + var/ExplodeTemp = C.ExplodeTemp + var/OptimalpHMin = C.OptimalpHMin + var/OptimalpHMax = C.OptimalpHMax + var/ReactpHLim = C.ReactpHLim + //var/CatalystFact = C.CatalystFact + var/CurveSharpT = C.CurveSharpT + var/CurveSharppH = C.CurveSharppH + var/ThermicConstant = C.ThermicConstant + var/HIonRelease = C.HIonRelease + var/RateUpLim = C.RateUpLim + var/FermiChem = C.FermiChem + var/FermiExplode = C.FermiExplode + var/ImpureChem = C.ImpureChem + */ + //FermiChem for(var/B in cached_required_reagents) if(!has_reagent(B, cached_required_reagents[B])) @@ -402,14 +419,12 @@ matching_other = 1 //FermiChem - /* if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! if (C.FermiExplode == TRUE) //To be added! else FermiExplode() //explode function!! - */ if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! meets_temp_requirement = 1//binary pass @@ -442,21 +457,110 @@ //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. //FermiChem relies on two additional properties; pH and impurity //Temperature plays into a larger role too. - //BRANCH HERE //if(selected_reaction) var/datum/chemical_reaction/C = selected_reaction - if (C.FermiChem == TRUE) - message_admins("FermiChem Proc'd") + //FermiReact(C) + //B is Beaker + //P is product + //multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmmount = 0 + var/ammoReacted = 0 + //get purity from combined beaker reactant purities. + var/purity = 1 - while (reactedVol < multiplier) - reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, special_react_result, cached_required_reagents, cached_results, selected_reaction.results) + + while (ammoReacted < multiplier) + message_admins("Loop beginning") CHECK_TICK - reaction_occurred = 1 - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log + //Begin Parse - //Standard reaction mechanics: - else + //Check extremes first + if (chem_temp > C.ExplodeTemp) + //go to explode proc + message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") + FermiExplode() + + if (pH > 14 || pH < 0) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + message_admins("pH is lover limit, cur pH: [pH]") + FermiExplode() + + //For now, purity is handled elsewhere + + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < C.OptimalTempMax || chem_temp >= C.OptimalTempMin) + deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) + // 350 300 + else if (chem_temp >= C.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") + + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < C.OptimalpHMin) + if (pH < (C.OptimalpHMin - C.ReactpHLim)) + deltapH = 0 + else + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) + //Upper range + else if (pH > C.OptimalpHMin) + if (pH > (C.OptimalpHMin + C.ReactpHLim)) + deltapH = 0 + else + deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) + //Within mid range + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + deltapH = 1 + //This should never proc: + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") + //TODO Add CatalystFact + message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") + + stepChemAmmount = multiplier * deltaT + if (stepChemAmmount > C.RateUpLim) + stepChemAmmount = C.RateUpLim + else if (stepChemAmmount < 0.01) + stepChemAmmount = 0.1 + if (ammoReacted > 0) + purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /((ammoReacted + stepChemAmmount)) //This should add the purity to the product + else + purity = deltapH + message_admins("purity: [purity], purity of beaker") + message_admins("Temp before change: [chem_temp], pH after change: [pH]") + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) + message_admins("Temp after change: [chem_temp], pH after change: [pH]") + + // End. + + selected_reaction.on_reaction(src, multiplier, special_react_result) + + message_admins("cached_results: [cached_results], multiplier: [multiplier], stepChemAmmount [stepChemAmmount]") + for(var/B in cached_required_reagents) + message_admins("cached_results: [cached_results], multiplier: [multiplier], stepChemAmmount [stepChemAmmount]") + remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + + ammoReacted = ammoReacted + stepChemAmmount + CHECK_TICK + + reaction_occurred = 1 + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", ammoReacted, C.id)//log + //Standard reaction mechanics: + else: for(var/B in cached_required_reagents) // multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) @@ -470,129 +574,34 @@ add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: - var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers - var/iconhtml = icon2html(cached_my_atom, seen) - if(cached_my_atom) - if(!ismob(cached_my_atom)) // No bubbling mobs - if(selected_reaction.mix_sound) - playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) + var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers + var/iconhtml = icon2html(cached_my_atom, seen) + if(cached_my_atom) + if(!ismob(cached_my_atom)) // No bubbling mobs + if(selected_reaction.mix_sound) + playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + + if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. + var/obj/item/slime_extract/ME2 = my_atom + ME2.Uses-- + if(ME2.Uses <= 0) // give the notification that the slime core is dead for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") + ME2.name = "used slime extract" + ME2.desc = "This extract has been used up." - if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." - - selected_reaction.on_reaction(src, multiplier, special_react_result) - reaction_occurred = 1 + selected_reaction.on_reaction(src, multiplier, special_react_result) + reaction_occurred = 1 while(reaction_occurred)//while do nothing? update_total()//Don't know waht this does. return 0//end! -/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, multiplier, totalVol, special_react_result, cached_required_reagents, cached_results, selected_reaction.results) - var/datum/chemical_reaction/C = selected_reaction - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmmount = 0 - var/ammoReacted = 0 - //get purity from combined beaker reactant purities HERE. - var/purity = 1 - var/tempVol = totalVol - //var/list/multiplier = INFINITY - - message_admins("Loop beginning") - //Begin Parse - - //Check extremes first - if (chem_temp > C.ExplodeTemp) - //go to explode proc - message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") - FermiExplode() - - if (pH > 14 || pH < 0) - //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - message_admins("pH is lover limit, cur pH: [pH]") - FermiExplode() - - //For now, purity is handled elsewhere - - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) - else if (chem_temp >= C.OptimalTempMax) - deltaT = 1 - else - deltaT = 0 - message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") - - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < C.OptimalpHMin) - if (pH < (C.OptimalpHMin - C.ReactpHLim)) - deltapH = 0 - else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) - //Upper range - else if (pH > C.OptimalpHMin) - if (pH > (C.OptimalpHMin + C.ReactpHLim)) - deltapH = 0 - else - deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) - //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) - deltapH = 1 - //This should never proc: - else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") - WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") - //TODO Add CatalystFact - message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") - - stepChemAmmount = tempVol * deltaT - if (stepChemAmmount > C.RateUpLim) - stepChemAmmount = C.RateUpLim - else if (stepChemAmmount < 0.01) - stepChemAmmount = 0.01 - - if (totalVol > 0) - purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /((ammoReacted + stepChemAmmount)) //This should add the purity to the product - else - purity = deltapH - message_admins("purity: [purity], purity of beaker") - message_admins("Temp before change: [chem_temp], pH after change: [pH]") - //Apply pH changes and thermal output of reaction to beaker - chem_temp += (C.ThermicConstant * stepChemAmmount) - pH += (C.HIonRelease * stepChemAmmount) - message_admins("Temp after change: [chem_temp], pH after change: [pH]") - - // End. - /* - for(var/B in cached_required_reagents) // - tempVol = min(totalVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - */ - message_admins("cached_results: [cached_results], totalVol: [totalVol], stepChemAmmount [stepChemAmmount]") - for(var/B in cached_required_reagents) - message_admins("cached_required_reagents(B): [cached_required_reagents[B]], totalVol: [totalVol], base stepChemAmmount [stepChemAmmount]") - remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - totalVol = max(totalVol, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: - - totalVol = totalVol + stepChemAmmount - - - CHECK_TICK - return (totalVol) +/datum/reagents/proc/FermiReact() + return /datum/reagents/proc/FermiExplode() return @@ -955,4 +964,4 @@ if(initial(R.can_synth)) random_reagents += initial(R.id) var/picked_reagent = pick(random_reagents) - return picked_reagent + return picked_reagent \ No newline at end of file diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index c38f065383..bafc1865dc 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -1,3 +1,4 @@ + /proc/build_chemical_reagent_list() //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id @@ -367,25 +368,8 @@ var/meets_temp_requirement = 0 var/has_special_react = C.special_react var/can_special_react = 0 - //FermiChem WHY ARE VARIBLES SO ESTRANGED it makes me sad - /* - var/OptimalTempMin = C.OptimalTempMin // Lower area of bell curve for determining heat based rate reactions - var/OptimalTempMax = C.OptimalTempMax - var/ExplodeTemp = C.ExplodeTemp - var/OptimalpHMin = C.OptimalpHMin - var/OptimalpHMax = C.OptimalpHMax - var/ReactpHLim = C.ReactpHLim - //var/CatalystFact = C.CatalystFact - var/CurveSharpT = C.CurveSharpT - var/CurveSharppH = C.CurveSharppH - var/ThermicConstant = C.ThermicConstant - var/HIonRelease = C.HIonRelease - var/RateUpLim = C.RateUpLim - var/FermiChem = C.FermiChem - var/FermiExplode = C.FermiExplode - var/ImpureChem = C.ImpureChem - */ - //FermiChem + var/reactedVol = 0 + va/continue_reacting = FALSE for(var/B in cached_required_reagents) if(!has_reagent(B, cached_required_reagents[B])) @@ -419,12 +403,14 @@ matching_other = 1 //FermiChem + /* if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! if (C.FermiExplode == TRUE) //To be added! else FermiExplode() //explode function!! + */ if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! meets_temp_requirement = 1//binary pass @@ -457,110 +443,25 @@ //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. //FermiChem relies on two additional properties; pH and impurity //Temperature plays into a larger role too. + //BRANCH HERE //if(selected_reaction) var/datum/chemical_reaction/C = selected_reaction - if (C.FermiChem == TRUE) - //FermiReact(C) - //B is Beaker - //P is product - //multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmmount = 0 - var/ammoReacted = 0 - //get purity from combined beaker reactant purities. - var/purity = 1 - - - while (ammoReacted < multiplier) - message_admins("Loop beginning") - CHECK_TICK - //Begin Parse - - //Check extremes first - if (chem_temp > C.ExplodeTemp) - //go to explode proc - message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") - FermiExplode() - - if (pH > 14 || pH < 0) - //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - message_admins("pH is lover limit, cur pH: [pH]") - FermiExplode() - - //For now, purity is handled elsewhere - - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax || chem_temp >= C.OptimalTempMin) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) - // 350 300 - else if (chem_temp >= C.OptimalTempMax) - deltaT = 1 - else - deltaT = 0 - message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") - - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < C.OptimalpHMin) - if (pH < (C.OptimalpHMin - C.ReactpHLim)) - deltapH = 0 - else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) - //Upper range - else if (pH > C.OptimalpHMin) - if (pH > (C.OptimalpHMin + C.ReactpHLim)) - deltapH = 0 - else - deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) - //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) - deltapH = 1 - //This should never proc: - else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") - WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") - //TODO Add CatalystFact - message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") - - stepChemAmmount = multiplier * deltaT - if (stepChemAmmount > C.RateUpLim) - stepChemAmmount = C.RateUpLim - else if (stepChemAmmount < 0.01) - stepChemAmmount = 0.1 - if (ammoReacted > 0) - purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /((ammoReacted + stepChemAmmount)) //This should add the purity to the product - else - purity = deltapH - message_admins("purity: [purity], purity of beaker") - message_admins("Temp before change: [chem_temp], pH after change: [pH]") - //Apply pH changes and thermal output of reaction to beaker - chem_temp += (C.ThermicConstant * stepChemAmmount) - pH += (C.HIonRelease * stepChemAmmount) - message_admins("Temp after change: [chem_temp], pH after change: [pH]") - - // End. - - selected_reaction.on_reaction(src, multiplier, special_react_result) - - message_admins("cached_results: [cached_results], multiplier: [multiplier], stepChemAmmount [stepChemAmmount]") - for(var/B in cached_required_reagents) - message_admins("cached_results: [cached_results], multiplier: [multiplier], stepChemAmmount [stepChemAmmount]") - remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: - - ammoReacted = ammoReacted + stepChemAmmount - CHECK_TICK + if (C.FermiChem == TRUE && !continue_reacting == TRUE) + message_admins("FermiChem Proc'd") reaction_occurred = 1 - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", ammoReacted, C.id)//log - //Standard reaction mechanics: - else: + + for(var/P in selected_reaction.results) + var/targetVol = cached_results[P]*multiplier + + while (reactedVol < targetVol) + reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol cached_required_reagents, cached_results) + + + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log + + //Standard reaction mechanics: + else for(var/B in cached_required_reagents) // multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) @@ -574,34 +475,136 @@ add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: - var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers - var/iconhtml = icon2html(cached_my_atom, seen) - if(cached_my_atom) - if(!ismob(cached_my_atom)) // No bubbling mobs - if(selected_reaction.mix_sound) - playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) + var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers + var/iconhtml = icon2html(cached_my_atom, seen) + if(cached_my_atom) + if(!ismob(cached_my_atom)) // No bubbling mobs + if(selected_reaction.mix_sound) + playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") - - if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." + to_chat(M, "[iconhtml] [selected_reaction.mix_message]") - selected_reaction.on_reaction(src, multiplier, special_react_result) - reaction_occurred = 1 + if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. + var/obj/item/slime_extract/ME2 = my_atom + ME2.Uses-- + if(ME2.Uses <= 0) // give the notification that the slime core is dead + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") + ME2.name = "used slime extract" + ME2.desc = "This extract has been used up." + + selected_reaction.on_reaction(src, multiplier, special_react_result) + reaction_occurred = 1 + continue_reacting = TRUE while(reaction_occurred)//while do nothing? update_total()//Don't know waht this does. return 0//end! -/datum/reagents/proc/FermiReact() - return +/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) + var/datum/chemical_reaction/C = selected_reaction + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmmount = 0 + var/ammoReacted = 0 + //get purity from combined beaker reactant purities HERE. + var/purity = 1 + var/tempVol = totalVol + //var/list/multiplier = INFINITY + + message_admins("Loop beginning") + //Begin Parse + + //Check extremes first + if (chem_temp > C.ExplodeTemp) + //go to explode proc + message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") + FermiExplode() + + if (pH > 14 || pH < 0) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + message_admins("pH is lover limit, cur pH: [pH]") + FermiExplode() + + //For now, purity is handled elsewhere + + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) + deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) + else if (chem_temp >= C.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") + + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < C.OptimalpHMin) + if (pH < (C.OptimalpHMin - C.ReactpHLim)) + deltapH = 0 + else + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) + //Upper range + else if (pH > C.OptimalpHMin) + if (pH > (C.OptimalpHMin + C.ReactpHLim)) + deltapH = 0 + else + deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) + //Within mid range + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + deltapH = 1 + //This should never proc: + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") + //TODO Add CatalystFact + message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") + + stepChemAmmount = targetVol * deltaT + if (stepChemAmmount > C.RateUpLim) + stepChemAmmount = C.RateUpLim + else if (stepChemAmmount < 0.01) + stepChemAmmount = 0.01 + + if ((reactedVol + stepChemAmmount) > targetVol) + stepChemAmmount = targetVol - reactedVol + message_admins("target volume reached. Reaction should stop after this loop") + + if (reactedVol > 0) + purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /((ammoReacted + stepChemAmmount)) //This should add the purity to the product + else + purity = deltapH + message_admins("purity: [purity], purity of beaker") + message_admins("Temp before change: [chem_temp], pH after change: [pH]") + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) + message_admins("Temp after change: [chem_temp], pH after change: [pH]") + + // End. + /* + for(var/B in cached_required_reagents) // + tempVol = min(reactedVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + */ + message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]") + + + + for(var/B in cached_required_reagents) + message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]") + remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + reactedVol = max(reactedVol, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + + reactedVol = reactedVol + stepChemAmmount + + + return (reactedVol) /datum/reagents/proc/FermiExplode() return @@ -964,4 +967,4 @@ if(initial(R.can_synth)) random_reagents += initial(R.id) var/picked_reagent = pick(random_reagents) - return picked_reagent \ No newline at end of file + return picked_reagent diff --git a/code/modules/reagents/chemistry/holderbk3.dm b/code/modules/reagents/chemistry/holderbk3.dm index 06e99bac96..6c2f5a9876 100644 --- a/code/modules/reagents/chemistry/holderbk3.dm +++ b/code/modules/reagents/chemistry/holderbk3.dm @@ -578,6 +578,7 @@ for(var/B in cached_required_reagents) // tempVol = min(totalVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + message_admins("cached_results: [cached_results], totalVol: [totalVol], stepChemAmmount [stepChemAmmount]") for(var/B in cached_required_reagents) message_admins("cached_required_reagents(B): [cached_required_reagents[B]], totalVol: [totalVol], base stepChemAmmount [stepChemAmmount]") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 2913c2f2b4..0a12e40bd6 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -49,13 +49,13 @@ /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! if (holder.has_reagent("eigenstate")) - do_sparks(5,FALSE,src) + do_sparks(5,FALSE,M) else location_return = get_turf(src) //sets up return point to_chat(M, "You feel your wavefunction split!") - do_sparks(5,FALSE,src) + do_sparks(5,FALSE,M) M.forceMove(location_created) //Teleports to creation location - do_sparks(5,FALSE,src) + do_sparks(5,FALSE,M) ..() /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location @@ -66,16 +66,17 @@ ..() /datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly - switch(current_cycle) - if(10) - to_chat(M, "Oh god, you feel like your wavefunction is about to hurl.") - M.Jitter(10) + . = ..() + //switch(current_cycle) + // if(1) + to_chat(M, "Oh god, you feel like your wavefunction is about to hurl.") + M.Jitter(10) - if(15 to INFINITY) - do_sparks(5,FALSE,src) - do_teleport(src, get_turf(src), 50, asoundin = 'sound/effects/phasein.ogg') - do_sparks(5,FALSE,src) - M.reagents.remove_reagent("eigenstate",1)//So you're not stuck for 10 minutes teleporting + //if(3 to INFINITY) + do_sparks(5,FALSE,src) + do_teleport(src, get_turf(src), 50, asoundin = 'sound/effects/phasein.ogg') + do_sparks(5,FALSE,src) + //M.reagents.remove_reagent("eigenstate",1)//So you're not stuck for 10 minutes teleporting ..() @@ -132,7 +133,7 @@ /datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. M.Jitter(50) M.AdjustKnockdown(0, 0) - to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your pervious self, sent to god knows what universe.") + to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") M.emote("me",1,"gasps and gazes around in a bewildered and highly confused fashion!",TRUE) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) ..() @@ -192,8 +193,8 @@ //Breast englargement /datum/reagent/fermi/BElarger - name = "Eigenstasium" - id = "eigenstate" + name = "Sucubus Draft" + id = "BEenlager" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." color = "#60A584" // rgb: 96, 0, 255 overdose_threshold = 12 @@ -204,5 +205,5 @@ M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") if(M.gender == FEMALE) - M.gender = FEMALE + M.gender = MALE M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") From 53a93c410871d4430ee4b6afbf14076b64321508 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 22 Apr 2019 20:31:09 +0100 Subject: [PATCH 031/608] Few code fixes. --- code/modules/reagents/chemistry/holder.dm | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index bafc1865dc..839c67eff9 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -345,6 +345,10 @@ return //Yup, no reactions here. No siree. var/reaction_occurred = 0 // checks if reaction, binary variable + var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. + var/targetVol = 0 + var/reactedVol = 0 + do //What does do do in byond? It sounds very redundant? is it a while loop? var/list/possible_reactions = list() //init list reaction_occurred = 0 // sets it back to 0? @@ -368,8 +372,7 @@ var/meets_temp_requirement = 0 var/has_special_react = C.special_react var/can_special_react = 0 - var/reactedVol = 0 - va/continue_reacting = FALSE + for(var/B in cached_required_reagents) if(!has_reagent(B, cached_required_reagents[B])) @@ -452,10 +455,10 @@ reaction_occurred = 1 for(var/P in selected_reaction.results) - var/targetVol = cached_results[P]*multiplier + targetVol = cached_results[P]*multiplier while (reactedVol < targetVol) - reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol cached_required_reagents, cached_results) + reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log @@ -510,7 +513,7 @@ var/ammoReacted = 0 //get purity from combined beaker reactant purities HERE. var/purity = 1 - var/tempVol = totalVol + //var/tempVol = totalVol //var/list/multiplier = INFINITY message_admins("Loop beginning") @@ -596,7 +599,7 @@ message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]") remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? reactedVol = max(reactedVol, 1) //this shouldnt happen ... SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: From 95ed826faf17ebec220920d2262d603639ae3ce4 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 22 Apr 2019 20:39:35 +0100 Subject: [PATCH 032/608] quick fix to prevent unreactable reactions. --- code/modules/reagents/chemistry/holder.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 839c67eff9..6abb41cc79 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -457,8 +457,9 @@ for(var/P in selected_reaction.results) targetVol = cached_results[P]*multiplier - while (reactedVol < targetVol) - reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) + if (chem_temp > C.C.OptimalTempMin)//To prevent pointless reactions + while (reactedVol < targetVol) + reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log From 3ba7f57cd1a89ab54a05524bbf59a069e0fdaf04 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 22 Apr 2019 23:53:16 +0100 Subject: [PATCH 033/608] Setting FermiReact to be part of a PROCESSING call. --- code/modules/reagents/chemistry/holder.dm | 41 +++++++++++++++---- code/modules/reagents/chemistry/reagents.dm | 1 + .../chemistry/reagents/fermi_reagents.dm | 21 +++++++--- 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6abb41cc79..42417acc39 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -53,6 +53,10 @@ var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() var/reagents_holder_flags + //var/targetVol = 0 + //var/reactedVol = 0 + var/fermiIsReacting = FALSE + var/fermiReactID = null /datum/reagents/New(maximum=100) maximum_volume = maximum @@ -346,8 +350,16 @@ var/reaction_occurred = 0 // checks if reaction, binary variable var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. - var/targetVol = 0 - var/reactedVol = 0 + + if(fermiIsReacting == TRUE) + if (reactedVol >= targetVol) + STOP_PROCESSING(SSprocessing, src) + fermiIsReacting = FALSE + message_admins("FermiChem processing stopped") + reaction_occurred = 1 + return + + do //What does do do in byond? It sounds very redundant? is it a while loop? var/list/possible_reactions = list() //init list @@ -450,16 +462,24 @@ //if(selected_reaction) var/datum/chemical_reaction/C = selected_reaction - if (C.FermiChem == TRUE && !continue_reacting == TRUE) + if (C.FermiChem == TRUE && !continue_reacting) message_admins("FermiChem Proc'd") reaction_occurred = 1 for(var/P in selected_reaction.results) targetVol = cached_results[P]*multiplier - if (chem_temp > C.C.OptimalTempMin)//To prevent pointless reactions - while (reactedVol < targetVol) - reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) + if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions + if (reactedVol < targetVol) + reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) + START_PROCESSING(SSprocessing, src) + message_admins("FermiChem processing started") + fermiIsReacting = TRUE + else + fermiIsReacting = FALSE + STOP_PROCESSING(SSprocessing, src) + message_admins("FermiChem processing stopped, 2nd catch, this shouldn't appear.") + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log @@ -506,12 +526,15 @@ update_total()//Don't know waht this does. return 0//end! +/datum/reagents/process() + handle_reactions() + /datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) var/datum/chemical_reaction/C = selected_reaction var/deltaT = 0 var/deltapH = 0 var/stepChemAmmount = 0 - var/ammoReacted = 0 + //var/ammoReacted = 0 //get purity from combined beaker reactant purities HERE. var/purity = 1 //var/tempVol = totalVol @@ -577,7 +600,7 @@ message_admins("target volume reached. Reaction should stop after this loop") if (reactedVol > 0) - purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /((ammoReacted + stepChemAmmount)) //This should add the purity to the product + purity = ((purity * reactedVol) + (deltapH * stepChemAmmount)) /((reactedVol+ stepChemAmmount)) //This should add the purity to the product else purity = deltapH message_admins("purity: [purity], purity of beaker") @@ -608,7 +631,7 @@ reactedVol = reactedVol + stepChemAmmount - return (reactedVol) + return //(reactedVol) /datum/reagents/proc/FermiExplode() return diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index a52bb1ecfe..01810b9713 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -33,6 +33,7 @@ var/addiction_stage4_end = 40 var/overdosed = 0 // You fucked up and this is now triggering its overdose effects, purge that shit quick. var/self_consuming = FALSE + var/purity = 1 //Fermichem var /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 0a12e40bd6..d10fda80d1 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -32,15 +32,22 @@ overdose_threshold = 20 addiction_threshold = 30 metabolization_rate = 0.5 * REAGENTS_METABOLISM - addiction_stage3_end = 40 - addiction_stage4_end = 55 //Incase it's too long + addiction_stage2_end = 20 + addiction_stage3_end = 22 + addiction_stage4_end = 24 //Incase it's too long var/turf/open/location_created = null var/turf/open/location_return = null var/addictCyc3 = 1 var/mob/living/fermi_Tclone = null + var/teleBool = FALSE ///obj/item/reagent/fermi/eigenstate/Initialize() +/datum/reagent/fermi/eigenstate/on_new() + . = ..() //Needed! + location_created = get_turf(src) //Sets up coordinate of where it was created + ..() + /datum/reagent/fermi/eigenstate/New() . = ..() //Needed! location_created = get_turf(src) //Sets up coordinate of where it was created @@ -48,7 +55,7 @@ /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! - if (holder.has_reagent("eigenstate")) + if (teleBool == TRUE) do_sparks(5,FALSE,M) else location_return = get_turf(src) //sets up return point @@ -56,6 +63,7 @@ do_sparks(5,FALSE,M) M.forceMove(location_created) //Teleports to creation location do_sparks(5,FALSE,M) + teleBool = TRUE ..() /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location @@ -63,6 +71,7 @@ to_chat(M, "You feel your wavefunction collapse!") M.forceMove(location_return) //Teleports home do_sparks(5,FALSE,src) + teleBool = FALSE ..() /datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly @@ -95,8 +104,9 @@ M.AdjustKnockdown(-40, 0) for(var/item in M.get_contents()) var/obj/item/I = item + M.dropItemToGround(I, TRUE) do_teleport(I, get_turf(I), 5, no_effects=TRUE); - ..() + //..() /datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! M.Jitter(100) @@ -119,6 +129,7 @@ // C.updateappearance(mutcolor_update=1) M.visible_message("[M] collapses in from an alternative reality!") + message_admins("Fermi T Clone: [fermi_Tclone]") if(2) do_teleport(fermi_Tclone, get_turf(fermi_Tclone), 3, no_effects=TRUE) //teleports clone so it's hard to find the real one! if(3) @@ -136,7 +147,7 @@ to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") M.emote("me",1,"gasps and gazes around in a bewildered and highly confused fashion!",TRUE) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) - ..() + //..() ///datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) // return From 879efcd63452b6c9d7f351c81ae72ac51114ec61 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 22 Apr 2019 23:58:39 +0100 Subject: [PATCH 034/608] Changed processing to be SSprocessing instead of SSfastprocess. --- code/modules/reagents/chemistry/holder.dm | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 42417acc39..3808b1e39b 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -53,8 +53,8 @@ var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() var/reagents_holder_flags - //var/targetVol = 0 - //var/reactedVol = 0 + var/targetVol = 0 + var/reactedVol = 0 var/fermiIsReacting = FALSE var/fermiReactID = null @@ -352,8 +352,8 @@ var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. if(fermiIsReacting == TRUE) - if (reactedVol >= targetVol) - STOP_PROCESSING(SSprocessing, src) + if (reactedVol >= targetVol && targetVol != 0) + STOP_PROCESSING(SSfastprocess, src) fermiIsReacting = FALSE message_admins("FermiChem processing stopped") reaction_occurred = 1 @@ -472,13 +472,12 @@ if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions if (reactedVol < targetVol) reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) - START_PROCESSING(SSprocessing, src) + START_PROCESSING(SSfastprocess, src) message_admins("FermiChem processing started") fermiIsReacting = TRUE else fermiIsReacting = FALSE - STOP_PROCESSING(SSprocessing, src) - message_admins("FermiChem processing stopped, 2nd catch, this shouldn't appear.") + STOP_PROCESSING(SSfastprocess, src) From 663b60fb15915c2c7202f521195722c90e8df503 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 01:08:30 +0100 Subject: [PATCH 035/608] Fermichem now reacts without hanging the server!! --- code/modules/reagents/chemistry/holder.dm | 62 +- .../reagents/chemistry/holderProcBackup.dm | 1003 +++++++++++++++++ .../chemistry/reagents/fermi_reagents.dm | 4 +- 3 files changed, 1051 insertions(+), 18 deletions(-) create mode 100644 code/modules/reagents/chemistry/holderProcBackup.dm diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 3808b1e39b..3b49c69626 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -342,6 +342,9 @@ update_total() /datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar + if(fermiIsReacting == TRUE) + //reagents_holder_flags |= REAGENT_NOREACT unsure if this is needed + return var/list/cached_reagents = reagent_list //a list of the reagents? var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! @@ -351,14 +354,17 @@ var/reaction_occurred = 0 // checks if reaction, binary variable var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. - if(fermiIsReacting == TRUE) - if (reactedVol >= targetVol && targetVol != 0) - STOP_PROCESSING(SSfastprocess, src) + //if(fermiIsReacting == TRUE) + /* if (reactedVol >= targetVol && targetVol != 0) + STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE - message_admins("FermiChem processing stopped") + message_admins("FermiChem processing stopped in reaction handler") reaction_occurred = 1 return - + else + message_admins("FermiChem processing passed in reaction handler") + return + */ do //What does do do in byond? It sounds very redundant? is it a while loop? @@ -468,17 +474,23 @@ for(var/P in selected_reaction.results) targetVol = cached_results[P]*multiplier + message_admins("FermiChem target volume: [targetVol]") if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions if (reactedVol < targetVol) - reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) - START_PROCESSING(SSfastprocess, src) - message_admins("FermiChem processing started") - fermiIsReacting = TRUE - else - fermiIsReacting = FALSE - STOP_PROCESSING(SSfastprocess, src) - + if (fermiIsReacting == TRUE) + return + else + //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) + START_PROCESSING(SSprocessing, src) + message_admins("FermiChem processing started") + fermiIsReacting = TRUE + fermiReactID = selected_reaction + //else + // fermiIsReacting = FALSE + // STOP_PROCESSING(SSfastprocess, src) + else + return SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log @@ -526,9 +538,28 @@ return 0//end! /datum/reagents/process() - handle_reactions() + var/datum/chemical_reaction/C = fermiReactID + var/list/cached_required_reagents = C.required_reagents//update reagents list + var/list/cached_results = C.results//resultant chemical list -/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) + + if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions + if (reactedVol < targetVol) + + reactedVol = FermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results) + message_admins("FermiChem tick activated started") + else + STOP_PROCESSING(SSprocessing, src) + fermiIsReacting = FALSE + return + else + STOP_PROCESSING(SSprocessing, src) + fermiIsReacting = FALSE + reactedVol = 0 + targetVol = 0 + //handle_reactions() + +/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results) var/datum/chemical_reaction/C = selected_reaction var/deltaT = 0 var/deltapH = 0 @@ -537,7 +568,6 @@ //get purity from combined beaker reactant purities HERE. var/purity = 1 //var/tempVol = totalVol - //var/list/multiplier = INFINITY message_admins("Loop beginning") //Begin Parse diff --git a/code/modules/reagents/chemistry/holderProcBackup.dm b/code/modules/reagents/chemistry/holderProcBackup.dm new file mode 100644 index 0000000000..02ebbc5096 --- /dev/null +++ b/code/modules/reagents/chemistry/holderProcBackup.dm @@ -0,0 +1,1003 @@ + +/proc/build_chemical_reagent_list() + //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id + + if(GLOB.chemical_reagents_list) + return + + var/paths = subtypesof(/datum/reagent) + GLOB.chemical_reagents_list = list() + + for(var/path in paths) + var/datum/reagent/D = new path() + GLOB.chemical_reagents_list[D.id] = D + +/proc/build_chemical_reactions_list() + //Chemical Reactions - Initialises all /datum/chemical_reaction into a list + // It is filtered into multiple lists within a list. + // For example: + // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma + + if(GLOB.chemical_reactions_list) + return + + var/paths = subtypesof(/datum/chemical_reaction) + GLOB.chemical_reactions_list = list() + + for(var/path in paths) + + var/datum/chemical_reaction/D = new path() + var/list/reaction_ids = list() + + if(D.required_reagents && D.required_reagents.len) + for(var/reaction in D.required_reagents) + reaction_ids += reaction + + // Create filters based on each reagent id in the required reagents list + for(var/id in reaction_ids) + if(!GLOB.chemical_reactions_list[id]) + GLOB.chemical_reactions_list[id] = list() + GLOB.chemical_reactions_list[id] += D + break // Don't bother adding ourselves to other reagent ids, it is redundant + +/////////////////////////////////////////////////////////////////////////////////// + +/datum/reagents + var/list/datum/reagent/reagent_list = new/list() + var/total_volume = 0 + var/maximum_volume = 100 + var/atom/my_atom = null + var/chem_temp = 150 + var/pH = REAGENT_NORMAL_PH + var/last_tick = 1 + var/addiction_tick = 1 + var/list/datum/reagent/addiction_list = new/list() + var/reagents_holder_flags + var/targetVol = 0 + var/reactedVol = 0 + var/fermiIsReacting = FALSE + var/fermiReactID = null + +/datum/reagents/New(maximum=100) + maximum_volume = maximum + + //I dislike having these here but map-objects are initialised before world/New() is called. >_> + if(!GLOB.chemical_reagents_list) + build_chemical_reagent_list() + if(!GLOB.chemical_reactions_list) + build_chemical_reactions_list() + +/datum/reagents/Destroy() + . = ..() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + qdel(R) + cached_reagents.Cut() + cached_reagents = null + if(my_atom && my_atom.reagents == src) + my_atom.reagents = null + my_atom = null + +// Used in attack logs for reagents in pills and such +/datum/reagents/proc/log_list() + if(!length(reagent_list)) + return "no reagents" + + var/list/data = list() + for(var/r in reagent_list) //no reagents will be left behind + var/datum/reagent/R = r + data += "[R.id] ([round(R.volume, 0.1)]u)" + //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. + return english_list(data) + +/datum/reagents/proc/remove_any(amount = 1) + var/list/cached_reagents = reagent_list + var/total_transfered = 0 + var/current_list_element = 1 + + current_list_element = rand(1, cached_reagents.len) + + while(total_transfered != amount) + if(total_transfered >= amount) + break + if(total_volume <= 0 || !cached_reagents.len) + break + + if(current_list_element > cached_reagents.len) + current_list_element = 1 + + var/datum/reagent/R = cached_reagents[current_list_element] + remove_reagent(R.id, 1) + + current_list_element++ + total_transfered++ + update_total() + + handle_reactions() + return total_transfered + +/datum/reagents/proc/remove_all(amount = 1) + var/list/cached_reagents = reagent_list + if(total_volume > 0) + var/part = amount / total_volume + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + remove_reagent(R.id, R.volume * part) + + update_total() + handle_reactions() + return amount + +/datum/reagents/proc/get_master_reagent_name() + var/list/cached_reagents = reagent_list + var/name + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + name = R.name + + return name + +/datum/reagents/proc/get_master_reagent_id() + var/list/cached_reagents = reagent_list + var/id + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + id = R.id + + return id + +/datum/reagents/proc/get_master_reagent() + var/list/cached_reagents = reagent_list + var/datum/reagent/master + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + master = R + + return master + +/datum/reagents/proc/trans_to(obj/target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. + var/list/cached_reagents = reagent_list + if(!target || !total_volume) + return + if(amount < 0) + return + + var/datum/reagents/R + if(istype(target, /datum/reagents)) + R = target + else + if(!target.reagents) + return + R = target.reagents + amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) + var/part = amount / src.total_volume + var/trans_data = null + for(var/reagent in cached_reagents) + var/datum/reagent/T = reagent + var/transfer_amount = T.volume * part + if(preserve_data) + trans_data = copy_data(T) + + //fermichem Added ph TODO: add T.purity + R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + //R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + remove_reagent(T.id, transfer_amount) + + update_total() + R.update_total() + if(!no_react) + R.handle_reactions() + src.handle_reactions() + return amount + +/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1) + var/list/cached_reagents = reagent_list + if(!target || !total_volume) + return + + var/datum/reagents/R + if(istype(target, /datum/reagents)) + R = target + else + if(!target.reagents) + return + R = target.reagents + + if(amount < 0) + return + amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) + var/part = amount / total_volume + var/trans_data = null + for(var/reagent in cached_reagents) + var/datum/reagent/T = reagent + var/copy_amount = T.volume * part + if(preserve_data) + trans_data = T.data + R.add_reagent(T.id, copy_amount * multiplier, trans_data) + + src.update_total() + R.update_total() + R.handle_reactions() + src.handle_reactions() + return amount + +/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N + var/list/cached_reagents = reagent_list + if (!target) + return + if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) + return + if(amount < 0) + return + + var/datum/reagents/R = target.reagents + if(src.get_reagent_amount(reagent)= R.overdose_threshold && !R.overdosed) + R.overdosed = 1 + need_mob_update += R.overdose_start(C) + if(R.addiction_threshold) + if(R.volume >= R.addiction_threshold && !is_type_in_list(R, cached_addictions)) + var/datum/reagent/new_reagent = new R.type() + cached_addictions.Add(new_reagent) + if(R.overdosed) + need_mob_update += R.overdose_process(C) + if(is_type_in_list(R,cached_addictions)) + for(var/addiction in cached_addictions) + var/datum/reagent/A = addiction + if(istype(R, A)) + A.addiction_stage = -15 // you're satisfied for a good while. + need_mob_update += R.on_mob_life(C) + + if(can_overdose) + if(addiction_tick == 6) + addiction_tick = 1 + for(var/addiction in cached_addictions) + var/datum/reagent/R = addiction + if(C && R) + R.addiction_stage++ + if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end) + need_mob_update += R.addiction_act_stage1(C) + else if(R.addiction_stage1_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end) + need_mob_update += R.addiction_act_stage2(C) + else if(R.addiction_stage2_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end) + need_mob_update += R.addiction_act_stage3(C) + else if(R.addiction_stage3_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end) + need_mob_update += R.addiction_act_stage4(C) + else if(R.addiction_stage4_end <= R.addiction_stage) + to_chat(C, "You feel like you've gotten over your need for [R.name].") + SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.id]_addiction") + cached_addictions.Remove(R) + addiction_tick++ + if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. + C.updatehealth() + C.update_canmove() + C.update_stamina() + update_total() + + +/datum/reagents/proc/set_reacting(react = TRUE) + if(react) + reagents_holder_flags &= ~(REAGENT_NOREACT) + else + reagents_holder_flags |= REAGENT_NOREACT + +/datum/reagents/proc/conditional_update_move(atom/A, Running = 0) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + R.on_move (A, Running) + update_total() + +/datum/reagents/proc/conditional_update(atom/A) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + R.on_update (A) + update_total() + +/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar + var/list/cached_reagents = reagent_list //a list of the reagents? + var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? + var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! + if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. + return //Yup, no reactions here. No siree. + + var/reaction_occurred = 0 // checks if reaction, binary variable + var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. + + if(fermiIsReacting == TRUE) + if (reactedVol >= targetVol && targetVol != 0) + STOP_PROCESSING(SSfastprocess, src) + fermiIsReacting = FALSE + message_admins("FermiChem processing stopped") + reaction_occurred = 1 + return + + + + do //What does do do in byond? It sounds very redundant? is it a while loop? + var/list/possible_reactions = list() //init list + reaction_occurred = 0 // sets it back to 0? + for(var/reagent in cached_reagents) //for reagent in beaker/holder + var/datum/reagent/R = reagent //check to make sure that reagent is there for the reaction list + for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id + if(!reaction) + continue + + var/datum/chemical_reaction/C = reaction + var/list/cached_required_reagents = C.required_reagents + var/total_required_reagents = cached_required_reagents.len + var/total_matching_reagents = 0 + var/list/cached_required_catalysts = C.required_catalysts + var/total_required_catalysts = cached_required_catalysts.len + var/total_matching_catalysts= 0 + var/matching_container = 0 + var/matching_other = 0 + var/required_temp = C.required_temp + var/is_cold_recipe = C.is_cold_recipe + var/meets_temp_requirement = 0 + var/has_special_react = C.special_react + var/can_special_react = 0 + + + for(var/B in cached_required_reagents) + if(!has_reagent(B, cached_required_reagents[B])) + break + total_matching_reagents++ + for(var/B in cached_required_catalysts) + if(!has_reagent(B, cached_required_catalysts[B])) + break + total_matching_catalysts++ + if(cached_my_atom) + if(!C.required_container) + matching_container = 1 + + else + if(cached_my_atom.type == C.required_container)//if the suspected container is a container + matching_container = 1 + if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs + return + if(!C.required_other)//Checks for other things required + matching_other = 1//binary check passes + + else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem + var/obj/item/slime_extract/M = cached_my_atom + + if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this + matching_other = 1 + else + if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? Oh, cyro. + matching_container = 1 + if(!C.required_other) + matching_other = 1 + + //FermiChem + /* + if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! + if (C.FermiExplode == TRUE) + //To be added! + else + FermiExplode() + //explode function!! + */ + + if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! + meets_temp_requirement = 1//binary pass + + if(!has_special_react || C.check_special_react(src)) + can_special_react = 1 + + if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react) + possible_reactions += C + + if(possible_reactions.len)//does list exist? + var/datum/chemical_reaction/selected_reaction = possible_reactions[1] + //select the reaction with the most extreme temperature requirements + for(var/V in possible_reactions)//why V, surely that would indicate volume? V is the reaction potential. + var/datum/chemical_reaction/competitor = V //competitor? I think this is theres two of them. Troubling..! + if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. + if(competitor.required_temp <= selected_reaction.required_temp)//only returns with lower if reaction "is cold" var. + selected_reaction = competitor + else + if(competitor.required_temp >= selected_reaction.required_temp) //will return with the hotter reacting first. + selected_reaction = competitor + var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list + var/list/cached_results = selected_reaction.results//resultant chemical list + var/special_react_result = selected_reaction.check_special_react(src) + var/list/multiplier = INFINITY //Wat + + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + + //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. + //FermiChem relies on two additional properties; pH and impurity + //Temperature plays into a larger role too. + //BRANCH HERE + //if(selected_reaction) + var/datum/chemical_reaction/C = selected_reaction + + if (C.FermiChem == TRUE && !continue_reacting) + message_admins("FermiChem Proc'd") + reaction_occurred = 1 + + for(var/P in selected_reaction.results) + targetVol = cached_results[P]*multiplier + + if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions + if (reactedVol < targetVol) + //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) + START_PROCESSING(SSfastprocess, src) + message_admins("FermiChem processing started") + fermiIsReacting = TRUE + fermiReactID = selected_reaction + else + fermiIsReacting = FALSE + STOP_PROCESSING(SSfastprocess, src) + else + return + + + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log + + //Standard reaction mechanics: + else + + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + + for(var/B in cached_required_reagents) + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log + add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: + + + var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers + var/iconhtml = icon2html(cached_my_atom, seen) + if(cached_my_atom) + if(!ismob(cached_my_atom)) // No bubbling mobs + if(selected_reaction.mix_sound) + playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) + + for(var/mob/M in seen) + to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + + if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. + var/obj/item/slime_extract/ME2 = my_atom + ME2.Uses-- + if(ME2.Uses <= 0) // give the notification that the slime core is dead + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") + ME2.name = "used slime extract" + ME2.desc = "This extract has been used up." + + selected_reaction.on_reaction(src, multiplier, special_react_result) + reaction_occurred = 1 + continue_reacting = TRUE + + while(reaction_occurred)//while do nothing? + update_total()//Don't know waht this does. + return 0//end! + +/datum/reagents/process() + if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions + if (reactedVol < targetVol) + reactedVol = FermiReact(fermiReactID, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) + else + STOP_PROCESSING(SSfastprocess, src) + //handle_reactions() + +/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) + var/datum/chemical_reaction/C = selected_reaction + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmmount = 0 + //var/ammoReacted = 0 + //get purity from combined beaker reactant purities HERE. + var/purity = 1 + //var/tempVol = totalVol + //var/list/multiplier = INFINITY + + message_admins("Loop beginning") + //Begin Parse + + //Check extremes first + if (chem_temp > C.ExplodeTemp) + //go to explode proc + message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") + FermiExplode() + + if (pH > 14 || pH < 0) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + message_admins("pH is lover limit, cur pH: [pH]") + FermiExplode() + + //For now, purity is handled elsewhere + + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) + deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) + else if (chem_temp >= C.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") + + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < C.OptimalpHMin) + if (pH < (C.OptimalpHMin - C.ReactpHLim)) + deltapH = 0 + else + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) + //Upper range + else if (pH > C.OptimalpHMin) + if (pH > (C.OptimalpHMin + C.ReactpHLim)) + deltapH = 0 + else + deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) + //Within mid range + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + deltapH = 1 + //This should never proc: + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") + //TODO Add CatalystFact + message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") + + stepChemAmmount = targetVol * deltaT + if (stepChemAmmount > C.RateUpLim) + stepChemAmmount = C.RateUpLim + else if (stepChemAmmount < 0.01) + stepChemAmmount = 0.01 + + if ((reactedVol + stepChemAmmount) > targetVol) + stepChemAmmount = targetVol - reactedVol + message_admins("target volume reached. Reaction should stop after this loop") + + if (reactedVol > 0) + purity = ((purity * reactedVol) + (deltapH * stepChemAmmount)) /((reactedVol+ stepChemAmmount)) //This should add the purity to the product + else + purity = deltapH + message_admins("purity: [purity], purity of beaker") + message_admins("Temp before change: [chem_temp], pH after change: [pH]") + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) + message_admins("Temp after change: [chem_temp], pH after change: [pH]") + + // End. + /* + for(var/B in cached_required_reagents) // + tempVol = min(reactedVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + */ + message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]") + + + + for(var/B in cached_required_reagents) + message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]") + remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? + reactedVol = max(reactedVol, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + + reactedVol = reactedVol + stepChemAmmount + + + return //(reactedVol) + +/datum/reagents/proc/FermiExplode() + return + +/datum/reagents/proc/isolate_reagent(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if(R.id != reagent) + del_reagent(R.id) + update_total() + +/datum/reagents/proc/del_reagent(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if(R.id == reagent) + if(my_atom && isliving(my_atom)) + var/mob/living/M = my_atom + R.on_mob_delete(M) + qdel(R) + reagent_list -= R + update_total() + if(my_atom) + my_atom.on_reagent_change(DEL_REAGENT) + return 1 + +/datum/reagents/proc/update_total() + var/list/cached_reagents = reagent_list + total_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume < 0.1) + del_reagent(R.id) + else + total_volume += R.volume + + return 0 + +/datum/reagents/proc/clear_reagents() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + del_reagent(R.id) + return 0 + +/datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1) + var/react_type + if(isliving(A)) + react_type = "LIVING" + if(method == INGEST) + var/mob/living/L = A + L.taste(src) + else if(isturf(A)) + react_type = "TURF" + else if(isobj(A)) + react_type = "OBJ" + else + return + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + switch(react_type) + if("LIVING") + var/touch_protection = 0 + if(method == VAPOR) + var/mob/living/L = A + touch_protection = L.get_permeability_protection() + R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection) + if("TURF") + R.reaction_turf(A, R.volume * volume_modifier, show_message) + if("OBJ") + R.reaction_obj(A, R.volume * volume_modifier, show_message) + +/datum/reagents/proc/holder_full() + if(total_volume >= maximum_volume) + return TRUE + return FALSE + +//Returns the average specific heat for all reagents currently in this holder. +/datum/reagents/proc/specific_heat() + . = 0 + var/cached_amount = total_volume //cache amount + var/list/cached_reagents = reagent_list //cache reagents + for(var/I in cached_reagents) + var/datum/reagent/R = I + . += R.specific_heat * (R.volume / cached_amount) + +/datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) + var/S = specific_heat() + chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) + +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, pH = 7, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ + if(!isnum(amount) || !amount) + return FALSE + + if(amount <= 0) + return FALSE + + var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] + if(!D) + WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") + return FALSE + + update_total() + var/cached_total = total_volume + if(cached_total + amount > maximum_volume) + amount = (maximum_volume - cached_total) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. + if(amount <= 0) + return FALSE + var/new_total = cached_total + amount + var/cached_temp = chem_temp + var/list/cached_reagents = reagent_list + + //Equalize temperature - Not using specific_heat() because the new chemical isn't in yet. + var/specific_heat = 0 + var/thermal_energy = 0 + for(var/i in cached_reagents) + var/datum/reagent/R = i + specific_heat += R.specific_heat * (R.volume / new_total) + thermal_energy += R.specific_heat * R.volume * cached_temp + specific_heat += D.specific_heat * (amount / new_total) + thermal_energy += D.specific_heat * amount * reagtemp + chem_temp = thermal_energy / (specific_heat * new_total) + //// + + //add the reagent to the existing if it exists + for(var/A in cached_reagents) + var/datum/reagent/R = A + if (R.id == reagent) + R.volume += amount + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + R.on_merge(data, amount) + if(!no_react) + handle_reactions() + return TRUE + + //otherwise make a new one + var/datum/reagent/R = new D.type(data) + cached_reagents += R + R.holder = src + R.volume = amount + if(data) + R.data = data + R.on_new(data) + + if(isliving(my_atom)) + R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + if(!no_react) + handle_reactions() + return TRUE + +/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) + for(var/r_id in list_reagents) + var/amt = list_reagents[r_id] + add_reagent(r_id, amt, data) + +/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to + + if(isnull(amount)) + amount = 0 + CRASH("null amount passed to reagent code") + return FALSE + + if(!isnum(amount)) + return FALSE + + if(amount < 0) + return FALSE + + var/list/cached_reagents = reagent_list + + for(var/A in cached_reagents) + var/datum/reagent/R = A + if (R.id == reagent) + //clamp the removal amount to be between current reagent amount + //and zero, to prevent removing more than the holder has stored + amount = CLAMP(amount, 0, R.volume) + R.volume -= amount + update_total() + if(!safety)//So it does not handle reactions when it need not to + handle_reactions() + if(my_atom) + my_atom.on_reagent_change(REM_REAGENT) + return TRUE + + return FALSE + +/datum/reagents/proc/has_reagent(reagent, amount = -1) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if (R.id == reagent) + if(!amount) + return R + else + if(R.volume >= amount) + return R + else + return 0 + + return 0 + +/datum/reagents/proc/get_reagent_amount(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if (R.id == reagent) + return R.volume + + return 0 + +/datum/reagents/proc/get_reagents() + var/list/names = list() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + names += R.name + + return jointext(names, ",") + +/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. + if(!isnum(amount)) + return 1 + var/list/cached_reagents = reagent_list + var/has_removed_reagent = 0 + + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + var/matches = 0 + // Switch between how we check the reagent type + if(strict) + if(R.type == reagent_type) + matches = 1 + else + if(istype(R, reagent_type)) + matches = 1 + // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. + if(matches) + // Have our other proc handle removement + has_removed_reagent = remove_reagent(R.id, amount, safety) + + return has_removed_reagent + +//two helper functions to preserve data across reactions (needed for xenoarch) +/datum/reagents/proc/get_data(reagent_id) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.id == reagent_id) + return R.data + +/datum/reagents/proc/set_data(reagent_id, new_data) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.id == reagent_id) + R.data = new_data + +/datum/reagents/proc/copy_data(datum/reagent/current_reagent) + if(!current_reagent || !current_reagent.data) + return null + if(!istype(current_reagent.data, /list)) + return current_reagent.data + + var/list/trans_data = current_reagent.data.Copy() + + // We do this so that introducing a virus to a blood sample + // doesn't automagically infect all other blood samples from + // the same donor. + // + // Technically we should probably copy all data lists, but + // that could possibly eat up a lot of memory needlessly + // if most data lists are read-only. + if(trans_data["viruses"]) + var/list/v = trans_data["viruses"] + trans_data["viruses"] = v.Copy() + + return trans_data + +/datum/reagents/proc/get_reagent(type) + var/list/cached_reagents = reagent_list + . = locate(type) in cached_reagents + +/datum/reagents/proc/generate_taste_message(minimum_percent=15) + // the lower the minimum percent, the more sensitive the message is. + var/list/out = list() + var/list/tastes = list() //descriptor = strength + if(minimum_percent <= 100) + for(var/datum/reagent/R in reagent_list) + if(!R.taste_mult) + continue + + if(istype(R, /datum/reagent/consumable/nutriment)) + var/list/taste_data = R.data + for(var/taste in taste_data) + var/ratio = taste_data[taste] + var/amount = ratio * R.taste_mult * R.volume + if(taste in tastes) + tastes[taste] += amount + else + tastes[taste] = amount + else + var/taste_desc = R.taste_description + var/taste_amount = R.volume * R.taste_mult + if(taste_desc in tastes) + tastes[taste_desc] += taste_amount + else + tastes[taste_desc] = taste_amount + //deal with percentages + // TODO it would be great if we could sort these from strong to weak + var/total_taste = counterlist_sum(tastes) + if(total_taste > 0) + for(var/taste_desc in tastes) + var/percent = tastes[taste_desc]/total_taste * 100 + if(percent < minimum_percent) + continue + var/intensity_desc = "a hint of" + if(percent > minimum_percent * 2 || percent == 100) + intensity_desc = "" + else if(percent > minimum_percent * 3) + intensity_desc = "the strong flavor of" + if(intensity_desc != "") + out += "[intensity_desc] [taste_desc]" + else + out += "[taste_desc]" + + return english_list(out, "something indescribable") + +/datum/reagents/proc/expose_temperature(var/temperature, var/coeff=0.02) + var/temp_delta = (temperature - chem_temp) * coeff + if(temp_delta > 0) + chem_temp = min(chem_temp + max(temp_delta, 1), temperature) + else + chem_temp = max(chem_temp + min(temp_delta, -1), temperature) + chem_temp = round(chem_temp) + handle_reactions() + +/////////////////////////////////////////////////////////////////////////////////// + + +// Convenience proc to create a reagents holder for an atom +// Max vol is maximum volume of holder +/atom/proc/create_reagents(max_vol) + if(reagents) + qdel(reagents) + reagents = new/datum/reagents(max_vol) + reagents.my_atom = src + +/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents + var/static/list/random_reagents = list() + if(!random_reagents.len) + for(var/thing in subtypesof(/datum/reagent)) + var/datum/reagent/R = thing + if(initial(R.can_synth)) + random_reagents += initial(R.id) + var/picked_reagent = pick(random_reagents) + return picked_reagent diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index d10fda80d1..df034c41f7 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -61,7 +61,7 @@ location_return = get_turf(src) //sets up return point to_chat(M, "You feel your wavefunction split!") do_sparks(5,FALSE,M) - M.forceMove(location_created) //Teleports to creation location + M.forceMove(location_created.loc) //Teleports to creation location do_sparks(5,FALSE,M) teleBool = TRUE ..() @@ -69,7 +69,7 @@ /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location do_sparks(5,FALSE,src) to_chat(M, "You feel your wavefunction collapse!") - M.forceMove(location_return) //Teleports home + M.forceMove(location_return.loc) //Teleports home do_sparks(5,FALSE,src) teleBool = FALSE ..() From 0cbefc35ee56990f13c371c1a92728e845b0b61c Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 01:11:26 +0100 Subject: [PATCH 036/608] Quick test to fix. --- code/modules/reagents/chemistry/holder.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 3b49c69626..c354bd7026 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -543,11 +543,11 @@ var/list/cached_results = C.results//resultant chemical list - if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions + if (chem_temp > C.OptimalTempMin && fermiIsReacting == TRUE)//To prevent pointless reactions if (reactedVol < targetVol) reactedVol = FermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results) - message_admins("FermiChem tick activated started") + message_admins("FermiChem tick activated started, Reacted vol: [reactedVol] of [targetVol]") else STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE From 5e54cfd7398b48711829b0daa316059e18c0efb3 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 06:26:41 +0100 Subject: [PATCH 037/608] Fixed addition mechanics and reaction code. --- code/modules/reagents/chemistry/holder.dm | 64 ++++++--- .../chemistry/reagents/fermi_reagents.dm | 135 ++++++++++-------- .../reagents/chemistry/recipes/fermi.dm | 1 + 3 files changed, 122 insertions(+), 78 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index c354bd7026..4d9b541579 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -470,27 +470,27 @@ if (C.FermiChem == TRUE && !continue_reacting) message_admins("FermiChem Proc'd") - reaction_occurred = 1 for(var/P in selected_reaction.results) targetVol = cached_results[P]*multiplier message_admins("FermiChem target volume: [targetVol]") if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions - if (reactedVol < targetVol) - if (fermiIsReacting == TRUE) - return - else - //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) - START_PROCESSING(SSprocessing, src) - message_admins("FermiChem processing started") - fermiIsReacting = TRUE - fermiReactID = selected_reaction + //if (reactedVol < targetVol) + if (fermiIsReacting == TRUE) + return 0 + else + //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) + START_PROCESSING(SSprocessing, src) + message_admins("FermiChem processing started") + fermiIsReacting = TRUE + fermiReactID = selected_reaction + reaction_occurred = 1 //else // fermiIsReacting = FALSE // STOP_PROCESSING(SSfastprocess, src) else - return + return 0 SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log @@ -541,22 +541,51 @@ var/datum/chemical_reaction/C = fermiReactID var/list/cached_required_reagents = C.required_reagents//update reagents list var/list/cached_results = C.results//resultant chemical list + var/multiplier = INFINITY + message_admins("updating targetVol from [targetVol]") + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) + if (multiplier == 0) + STOP_PROCESSING(SSprocessing, src) + fermiIsReacting = FALSE + message_admins("FermiChem STOPPED due to reactant removal! Reacted vol: [reactedVol] of [targetVol]") + reactedVol = 0 + targetVol = 0 + handle_reactions() + update_total() + return + for(var/P in cached_results) + targetVol = cached_results[P]*multiplier + + message_admins("to [targetVol]") + + if (fermiIsReacting == FALSE) + message_admins("THIS SHOULD NEVER APPEAR!") if (chem_temp > C.OptimalTempMin && fermiIsReacting == TRUE)//To prevent pointless reactions if (reactedVol < targetVol) - reactedVol = FermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results) message_admins("FermiChem tick activated started, Reacted vol: [reactedVol] of [targetVol]") else STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE + message_admins("FermiChem STOPPED due to volume reached! Reacted vol: [reactedVol] of [targetVol]") + reactedVol = 0 + targetVol = 0 + handle_reactions() + update_total() return else STOP_PROCESSING(SSprocessing, src) + message_admins("FermiChem STOPPED due to temperature! Reacted vol: [reactedVol] of [targetVol]") fermiIsReacting = FALSE reactedVol = 0 targetVol = 0 + handle_reactions() + update_total() + return + //handle_reactions() /datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results) @@ -621,12 +650,13 @@ stepChemAmmount = targetVol * deltaT if (stepChemAmmount > C.RateUpLim) stepChemAmmount = C.RateUpLim - else if (stepChemAmmount < 0.01) - stepChemAmmount = 0.01 + else if (stepChemAmmount <= 0.01) + message_admins("stepChem underflow [stepChemAmmount]") + stepChemAmmount = 0.02 if ((reactedVol + stepChemAmmount) > targetVol) stepChemAmmount = targetVol - reactedVol - message_admins("target volume reached. Reaction should stop after this loop") + message_admins("target volume reached. Reaction should stop after this loop. stepChemAmmount: [stepChemAmmount] + reactedVol: [reactedVol] = targetVol [targetVol]") if (reactedVol > 0) purity = ((purity * reactedVol) + (deltapH * stepChemAmmount)) /((reactedVol+ stepChemAmmount)) //This should add the purity to the product @@ -653,14 +683,14 @@ remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? - reactedVol = max(reactedVol, 1) //this shouldnt happen ... + //reactedVol = max(reactedVol, 1) //this shouldnt happen ... SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: reactedVol = reactedVol + stepChemAmmount - return //(reactedVol) + return (reactedVol) /datum/reagents/proc/FermiExplode() return diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index df034c41f7..a9af2fae4b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -10,11 +10,12 @@ /datum/reagent/fermi name = "Fermi" id = "fermi" - taste_description = "If a petpat had a taste, this would be it." + taste_description = "If affection had a taste, this would be it." /datum/reagent/fermi/on_mob_life(mob/living/carbon/M) current_cycle++ - holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency) //fermi reagents stay longer if you have a better metabolism + holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism + return ..() /datum/reagent/fermi/overdose_start(mob/living/carbon/M) current_cycle++ @@ -28,16 +29,20 @@ name = "Eigenstasium" id = "eigenstate" description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" + taste_description = "." color = "#60A584" // rgb: 96, 0, 255 overdose_threshold = 20 addiction_threshold = 30 metabolization_rate = 0.5 * REAGENTS_METABOLISM - addiction_stage2_end = 20 - addiction_stage3_end = 22 - addiction_stage4_end = 24 //Incase it's too long + addiction_stage2_end = 30 + addiction_stage3_end = 40 + addiction_stage4_end = 45 //Incase it's too long var/turf/open/location_created = null var/turf/open/location_return = null + var/addictCyc1 = 1 + var/addictCyc2 = 1 var/addictCyc3 = 1 + var/addictCyc4 = 1 var/mob/living/fermi_Tclone = null var/teleBool = FALSE @@ -46,24 +51,27 @@ /datum/reagent/fermi/eigenstate/on_new() . = ..() //Needed! location_created = get_turf(src) //Sets up coordinate of where it was created - ..() + message_admins("Attempting to get creation location from on_new() [location_created]") + //..()s /datum/reagent/fermi/eigenstate/New() . = ..() //Needed! - location_created = get_turf(src) //Sets up coordinate of where it was created - ..() + //if(holder && holder.my_atom) + location_created = get_turf(holder.my_atom) //Sets up coordinate of where it was created + message_admins("Attempting to get creation location from New() [location_created]") + //..() /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! - if (teleBool == TRUE) + switch(current_cycle) + if(1) + location_return = get_turf(M.loc) //sets up return point + to_chat(M, "You feel your wavefunction split!") + do_sparks(5,FALSE,M) + M.forceMove(location_created) //Teleports to creation location + do_sparks(5,FALSE,M) + if(prob(20)) do_sparks(5,FALSE,M) - else - location_return = get_turf(src) //sets up return point - to_chat(M, "You feel your wavefunction split!") - do_sparks(5,FALSE,M) - M.forceMove(location_created.loc) //Teleports to creation location - do_sparks(5,FALSE,M) - teleBool = TRUE ..() /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location @@ -71,83 +79,88 @@ to_chat(M, "You feel your wavefunction collapse!") M.forceMove(location_return.loc) //Teleports home do_sparks(5,FALSE,src) - teleBool = FALSE ..() /datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly . = ..() - //switch(current_cycle) - // if(1) - to_chat(M, "Oh god, you feel like your wavefunction is about to hurl.") + to_chat(M, "Oh god, you feel like your wavefunction is about to tear.") M.Jitter(10) - //if(3 to INFINITY) +/datum/reagent/fermi/eigenstate/overdose_process(mob/living/M) //Overdose, makes you teleport randomly do_sparks(5,FALSE,src) - do_teleport(src, get_turf(src), 50, asoundin = 'sound/effects/phasein.ogg') + do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) - //M.reagents.remove_reagent("eigenstate",1)//So you're not stuck for 10 minutes teleporting - ..() - - - //..() //loop function + M.reagents.remove_reagent("eigenstate",0.5)//So you're not stuck for 10 minutes teleporting + ..() //loop function /datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride. - to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") - M.Jitter(10) - M.nutrition = M.nutrition - (M.nutrition/10) + switch(src.addictCyc1) + if(1) + to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") + M.Jitter(10) + M.nutrition = M.nutrition - (M.nutrition/15) + src.addictCyc1++ ..() /datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M) - to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") - M.Jitter(50) - M.AdjustKnockdown(-40, 0) - for(var/item in M.get_contents()) - var/obj/item/I = item - M.dropItemToGround(I, TRUE) - do_teleport(I, get_turf(I), 5, no_effects=TRUE); - //..() + switch(src.addictCyc2) + if(1) + to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") + M.Jitter(50) + M.Knockdown(100) + M.Stun(40) + var/items = M.get_contents() + var/obj/item/I = pick(items) + M.dropItemToGround(I, TRUE) + do_sparks(5,FALSE,I) + do_teleport(I, get_turf(I), 5, no_effects=TRUE); + do_sparks(5,FALSE,I) + src.addictCyc2++ + ..() /datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! - M.Jitter(100) - M.AdjustKnockdown(-40, 0) - to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the eigenstate event horizon.") //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in switch(src.addictCyc3) if(1) + M.Jitter(100) + to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the eigenstate event horizon.") + if(2) var/typepath = M.type fermi_Tclone = new typepath(M.loc) - //var/mob/living/carbon/O = M - //var/mob/living/carbon/C = fermi_Tclone + var/mob/living/carbon/C = fermi_Tclone fermi_Tclone.appearance = M.appearance - - //Incase Kevin breaks my code: - //if(istype(C) && istype(O)) - // C.real_name = O.real_name - // O.dna.transfer_identity(C) - // C.updateappearance(mutcolor_update=1) - + C.real_name = M.real_name M.visible_message("[M] collapses in from an alternative reality!") message_admins("Fermi T Clone: [fermi_Tclone]") - if(2) - do_teleport(fermi_Tclone, get_turf(fermi_Tclone), 3, no_effects=TRUE) //teleports clone so it's hard to find the real one! + do_teleport(C, get_turf(C), 3, no_effects=TRUE) //teleports clone so it's hard to find the real one! + do_sparks(5,FALSE,C) + message_admins("Fermi T Clone: [fermi_Tclone] teleport attempt") if(3) - qdel(fermi_Tclone) //Deletes CLONE, or at least I hope it is. + var/mob/living/carbon/C = fermi_Tclone + do_sparks(5,FALSE,C) + qdel(C) //Deletes CLONE, or at least I hope it is. + message_admins("Fermi T Clone: [fermi_Tclone] deletion attempt") M.visible_message("[M] is snapped across to a different alternative reality!") src.addictCyc3 = 1 //counter fermi_Tclone = null - - do_teleport(src, get_turf(src), 3, no_effects=TRUE) //Teleports player randomly + message_admins("[src.addictCyc3]") + src.addictCyc3++ + do_teleport(M, get_turf(M), 3, no_effects=TRUE) //Teleports player randomly ..() //loop function /datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. - M.Jitter(50) - M.AdjustKnockdown(0, 0) - to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") - M.emote("me",1,"gasps and gazes around in a bewildered and highly confused fashion!",TRUE) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) - //..() + switch(src.addictCyc4) + if(1) + M.Jitter(50) + M.Knockdown(0) + to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") + M.emote("me",1,"gasps and gazes around in a bewildered and highly confused fashion!",TRUE) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) + src.addictCyc4++ + ..() + . = 1 ///datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) // return diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 5b07dd91c8..a7afff86cc 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -5,6 +5,7 @@ id = "eigenstate" results = list("eigenstate" = 1) required_reagents = list("bluespace" = 1, "stable_plasma" = 1, "sugar" = 1) + mix_message = "zaps brightly into existance, diffusing the energy from the localised gravity well as light" //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 500 // Upper end for above From de5906b92d9503537174bef5127b1ad41ce85f07 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 06:37:02 +0100 Subject: [PATCH 038/608] Quick fixes --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index a9af2fae4b..d7ab5f2c7c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -134,7 +134,7 @@ C.real_name = M.real_name M.visible_message("[M] collapses in from an alternative reality!") message_admins("Fermi T Clone: [fermi_Tclone]") - do_teleport(C, get_turf(C), 3, no_effects=TRUE) //teleports clone so it's hard to find the real one! + do_teleport(C, get_turf(C), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! do_sparks(5,FALSE,C) message_admins("Fermi T Clone: [fermi_Tclone] teleport attempt") if(3) @@ -147,18 +147,22 @@ fermi_Tclone = null message_admins("[src.addictCyc3]") src.addictCyc3++ - do_teleport(M, get_turf(M), 3, no_effects=TRUE) //Teleports player randomly + do_teleport(M, get_turf(M), 2, no_effects=TRUE) //Teleports player randomly ..() //loop function /datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. switch(src.addictCyc4) if(1) + M.Sleeping(20, 0) M.Jitter(50) M.Knockdown(0) to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") M.emote("me",1,"gasps and gazes around in a bewildered and highly confused fashion!",TRUE) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) + if(prob(20)) + do_sparks(5,FALSE,M) src.addictCyc4++ + ..() . = 1 From 09cd6f8b2f986f594207df45dbacfcf4c69324b6 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 06:41:02 +0100 Subject: [PATCH 039/608] Added placeholders for SDGF --- .../reagents/chemistry/recipes/fermi.dm | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index a7afff86cc..37729ef21f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -28,7 +28,25 @@ name = "synthetic-derived growth factor" id = "SDGF" results = list("SDGF" = 3) - required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) + required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) + //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) + //FermiChem vars: + OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions + OptimalTempMax = 500 // Upper end for above + ExplodeTemp = 550 //Temperature at which reaction explodes + OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 9.5 // Higest value for above + ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) + CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) + CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) + ThermicConstant = +20 //Temperature change per 1u produced + HIonRelease = 0.01 //pH change per 1u reaction + RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect + FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics + FermiExplode = FALSE //If the chemical explodes in a special way + ImpureChem = "toxin" //What chemical is produced with an inpure reaction + /datum/chemical_reaction/BElarger name = "" From 45c4e0acaf73657fb38ad1822031d23b8e841917 Mon Sep 17 00:00:00 2001 From: Useroth Date: Tue, 23 Apr 2019 07:46:32 +0200 Subject: [PATCH 040/608] Let's try this approach --- .../chemistry/reagents/fermi_reagents.dm | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index d7ab5f2c7c..2b14bd9cfd 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -37,7 +37,7 @@ addiction_stage2_end = 30 addiction_stage3_end = 40 addiction_stage4_end = 45 //Incase it's too long - var/turf/open/location_created = null + //var/turf/open/location_created = null var/turf/open/location_return = null var/addictCyc1 = 1 var/addictCyc2 = 1 @@ -46,29 +46,36 @@ var/mob/living/fermi_Tclone = null var/teleBool = FALSE +/mob/living/carbon + var/turf/location_spawn = null + +/mob/living/carbon/New() + . = ..() + location_spawn = get_turf(src) ///obj/item/reagent/fermi/eigenstate/Initialize() /datum/reagent/fermi/eigenstate/on_new() . = ..() //Needed! - location_created = get_turf(src) //Sets up coordinate of where it was created - message_admins("Attempting to get creation location from on_new() [location_created]") + //location_created = get_turf(src) //Sets up coordinate of where it was created + //message_admins("Attempting to get creation location from on_new() [location_created]") //..()s /datum/reagent/fermi/eigenstate/New() . = ..() //Needed! //if(holder && holder.my_atom) - location_created = get_turf(holder.my_atom) //Sets up coordinate of where it was created - message_admins("Attempting to get creation location from New() [location_created]") + //location_created = get_turf(holder.my_atom) //Sets up coordinate of where it was created + //message_admins("Attempting to get creation location from New() [location_created]") //..() /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! switch(current_cycle) if(1) - location_return = get_turf(M.loc) //sets up return point + location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") do_sparks(5,FALSE,M) - M.forceMove(location_created) //Teleports to creation location + //M.forceMove(location_created) //Teleports to creation location + M.forceMove(M.location_spawn) do_sparks(5,FALSE,M) if(prob(20)) do_sparks(5,FALSE,M) @@ -111,7 +118,7 @@ M.Knockdown(100) M.Stun(40) var/items = M.get_contents() - var/obj/item/I = pick(items) + var/obj/item/I = pick(items) M.dropItemToGround(I, TRUE) do_sparks(5,FALSE,I) do_teleport(I, get_turf(I), 5, no_effects=TRUE); From ac541ff9d272b865a480378513039072c547ab3f Mon Sep 17 00:00:00 2001 From: Useroth Date: Tue, 23 Apr 2019 08:17:25 +0200 Subject: [PATCH 041/608] Fuck if I know. --- .../reagents/chemistry/reagents/fermi_reagents.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 2b14bd9cfd..151d84bafb 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -38,7 +38,7 @@ addiction_stage3_end = 40 addiction_stage4_end = 45 //Incase it's too long //var/turf/open/location_created = null - var/turf/open/location_return = null + var/turf/location_return = null var/addictCyc1 = 1 var/addictCyc2 = 1 var/addictCyc3 = 1 @@ -49,12 +49,12 @@ /mob/living/carbon var/turf/location_spawn = null -/mob/living/carbon/New() +/mob/living/carbon/Initialize() . = ..() location_spawn = get_turf(src) ///obj/item/reagent/fermi/eigenstate/Initialize() -/datum/reagent/fermi/eigenstate/on_new() +/*/datum/reagent/fermi/eigenstate/on_new() . = ..() //Needed! //location_created = get_turf(src) //Sets up coordinate of where it was created //message_admins("Attempting to get creation location from on_new() [location_created]") @@ -66,7 +66,7 @@ //location_created = get_turf(holder.my_atom) //Sets up coordinate of where it was created //message_admins("Attempting to get creation location from New() [location_created]") //..() - +*/ /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! switch(current_cycle) @@ -84,7 +84,7 @@ /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location do_sparks(5,FALSE,src) to_chat(M, "You feel your wavefunction collapse!") - M.forceMove(location_return.loc) //Teleports home + M.forceMove(location_return) //Teleports home do_sparks(5,FALSE,src) ..() From d6d6dc77f1a26b4718307771ae9937192541822a Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 07:32:56 +0100 Subject: [PATCH 042/608] Fixes and tweaks to try to get things to work. --- code/modules/reagents/chemistry/holder.dm | 5 ++- .../chemistry/reagents/fermi_reagents.dm | 42 +++++++++---------- .../reagents/chemistry/recipes/fermi.dm | 2 +- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 4d9b541579..0b76dcef5d 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -665,8 +665,6 @@ message_admins("purity: [purity], purity of beaker") message_admins("Temp before change: [chem_temp], pH after change: [pH]") //Apply pH changes and thermal output of reaction to beaker - chem_temp += (C.ThermicConstant * stepChemAmmount) - pH += (C.HIonRelease * stepChemAmmount) message_admins("Temp after change: [chem_temp], pH after change: [pH]") // End. @@ -687,6 +685,9 @@ SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) + reactedVol = reactedVol + stepChemAmmount diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 151d84bafb..243ff10dad 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -37,8 +37,8 @@ addiction_stage2_end = 30 addiction_stage3_end = 40 addiction_stage4_end = 45 //Incase it's too long - //var/turf/open/location_created = null - var/turf/location_return = null + var/turf/open/location_created = null + var/turf/open/location_return = null var/addictCyc1 = 1 var/addictCyc2 = 1 var/addictCyc3 = 1 @@ -46,36 +46,29 @@ var/mob/living/fermi_Tclone = null var/teleBool = FALSE -/mob/living/carbon - var/turf/location_spawn = null - -/mob/living/carbon/Initialize() - . = ..() - location_spawn = get_turf(src) ///obj/item/reagent/fermi/eigenstate/Initialize() -/*/datum/reagent/fermi/eigenstate/on_new() +/datum/reagent/fermi/eigenstate/on_new() . = ..() //Needed! - //location_created = get_turf(src) //Sets up coordinate of where it was created - //message_admins("Attempting to get creation location from on_new() [location_created]") + location_created = get_turf(src) //Sets up coordinate of where it was created + message_admins("Attempting to get creation location from on_new() [location_created]") //..()s /datum/reagent/fermi/eigenstate/New() . = ..() //Needed! //if(holder && holder.my_atom) - //location_created = get_turf(holder.my_atom) //Sets up coordinate of where it was created - //message_admins("Attempting to get creation location from New() [location_created]") + location_created = get_turf(holder.my_atom) //Sets up coordinate of where it was created + message_admins("Attempting to get creation location from New() [location_created]") //..() -*/ + /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! switch(current_cycle) if(1) - location_return = get_turf(M) //sets up return point + location_return = get_turf(M.loc) //sets up return point to_chat(M, "You feel your wavefunction split!") do_sparks(5,FALSE,M) - //M.forceMove(location_created) //Teleports to creation location - M.forceMove(M.location_spawn) + M.forceMove(location_created) //Teleports to creation location do_sparks(5,FALSE,M) if(prob(20)) do_sparks(5,FALSE,M) @@ -84,7 +77,7 @@ /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location do_sparks(5,FALSE,src) to_chat(M, "You feel your wavefunction collapse!") - M.forceMove(location_return) //Teleports home + M.forceMove(location_return.loc) //Teleports home do_sparks(5,FALSE,src) ..() @@ -118,7 +111,7 @@ M.Knockdown(100) M.Stun(40) var/items = M.get_contents() - var/obj/item/I = pick(items) + var/obj/item/I = pick(items) M.dropItemToGround(I, TRUE) do_sparks(5,FALSE,I) do_teleport(I, get_turf(I), 5, no_effects=TRUE); @@ -192,10 +185,10 @@ /datum/reagent/fermi/SGDF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone - + message_admins("SGDF ingested") var/list/candidates = pollCandidatesForMob("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, M, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies if(LAZYLEN(candidates)) - + message_admins("Candidate found!") //var/typepath = owner.type //clone = new typepath(owner.loc) var/typepath = M.type @@ -220,7 +213,12 @@ //after_success(user, SM) //qdel(src) else - if(20) + message_admins("Failed to find clone Candidate") + if(M.has_status_effect(/datum/status_effect/chem/SGDF) + + else + switch(20) + if(1) M.apply_status_effect(/datum/status_effect/chem/SGDF) ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 37729ef21f..481c7925cf 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -40,7 +40,7 @@ CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) - ThermicConstant = +20 //Temperature change per 1u produced + ThermicConstant = 20 //Temperature change per 1u produced HIonRelease = 0.01 //pH change per 1u reaction RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics From 5f706f2f0973087ca120c845710d3a2806d52ea0 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 08:44:41 +0100 Subject: [PATCH 043/608] Added more the SDGF chem. --- .../code/datums/status_effects/chems.dm | 3 + .../chemistry/reagents/fermi_reagents.dm | 107 ++++++++++++------ .../reagents/chemistry/recipes/fermi.dm | 2 +- 3 files changed, 79 insertions(+), 33 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 65a644da34..54071bff27 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -3,6 +3,7 @@ var/mob/living/carbon/human/fermi_Clone = null /datum/status_effect/chem/SGDF/on_apply(mob/living/carbon/M) + message_admins("SGDF status appied") var/typepath = M.type fermi_Clone = new typepath(M.loc) //var/mob/living/carbon/M = owner @@ -14,7 +15,9 @@ return ..() /datum/status_effect/chem/SGDF/tick(mob/living/M) + message_admins("SDGF ticking") if(M.stat == DEAD) + message_admins("SGDF status swapping") if(fermi_Clone && fermi_Clone.stat != DEAD) if(M.mind) M.mind.transfer_to(fermi_Clone) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 243ff10dad..d4c6e93c2a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -186,43 +186,86 @@ //Setup clone message_admins("SGDF ingested") - var/list/candidates = pollCandidatesForMob("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, M, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies - if(LAZYLEN(candidates)) - message_admins("Candidate found!") - //var/typepath = owner.type - //clone = new typepath(owner.loc) - var/typepath = M.type - var/mob/living/carbon/fermi_Gclone = new typepath(M.loc) - //var/mob/living/carbon/SM = owner - //var/mob/living/carbon/M = M - var/mob/living/carbon/SM = fermi_Gclone - if(istype(SM) && istype(M)) - SM.real_name = M.real_name - M.dna.transfer_identity(SM) - SM.updateappearance(mutcolor_update=1) + switch(current_cycle) + if(1) + var/list/candidates = pollCandidatesForMob("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, M, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies + if(10 to INFINITY) + if(LAZYLEN(candidates)) + message_admins("Candidate found!") + //var/typepath = owner.type + //clone = new typepath(owner.loc) + var/typepath = M.type + var/mob/living/carbon/fermi_Gclone = new typepath(M.loc) + //var/mob/living/carbon/SM = owner + //var/mob/living/carbon/M = M + var/mob/living/carbon/SM = fermi_Gclone + if(istype(SM) && istype(M)) + SM.real_name = M.real_name + M.dna.transfer_identity(SM) + SM.updateappearance(mutcolor_update=1) - var/mob/dead/observer/C = pick(candidates) - SM.key = C.key - SM.mind.enslave_mind_to_creator(M) - //SM.sentience_act() - to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") - to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") - to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") - M.visible_message("[M] suddenly shudders, and splits into two identical twins!") - SM.copy_known_languages_from(M, FALSE) - //after_success(user, SM) - //qdel(src) - else - message_admins("Failed to find clone Candidate") - if(M.has_status_effect(/datum/status_effect/chem/SGDF) + if(M.getorganslot(ORGAN_SLOT_ZOMBIE))//sure, it "treats" it, but "you've" still got it. + var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE) + ZI.Remove(M) + ZI.Insert(C) - else - switch(20) - if(1) - M.apply_status_effect(/datum/status_effect/chem/SGDF) + var/mob/dead/observer/C = pick(candidates) + SM.key = C.key + SM.mind.enslave_mind_to_creator(M) + //SM.sentience_act() + to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") + to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") + to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") + M.visible_message("[M] suddenly shudders, and splits into two identical twins!") + SM.copy_known_languages_from(M, FALSE) + //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? + + //after_success(user, SM) + //qdel(src) + + else + message_admins("Failed to find clone Candidate") + if(M.has_status_effect(/datum/status_effect/chem/SGDF)) + to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). + M.adjustCloneLoss(-0.5, 0) + M.adjustBruteLoss(-0.5, 0) + M.adjustFireLoss(-0.5, 0) + M.heal_bodypart_damage(1,1) + M.remove_trait(TRAIT_DISFIGURED, TRAIT_GENERIC) + else + switch(current_cycle) + message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") + if(10) + to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") + M.nutrition = M.nutrition + (M.nutrition/30) + if(15) + to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") + M.nutrition = M.nutrition + (M.nutrition/20) + if(20) + to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") + M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! + M.nutrition = M.nutrition + (M.nutrition/10) + if(28) + to_chat(M, "The cells begin to precipitate outwards of your body, you feel like you'll split soon...") + M.nutrition = 200 + if(30) + M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE + M.next_move_modifier = 1 + to_chat(M, "Your body splits away from the cell clone of yourself, leaving your with a drained and hollow feeling inside.") + M.apply_status_effect(/datum/status_effect/chem/SGDF) + M.reagents.del_reagent("SGDF")//removes SGDF on completion. ..() +/datum/reagent/fermi/SDGF/on_mob_delete(mob/living/M) //returns back to original location + if !(M.has_status_effect(/datum/status_effect/chem/SGDF) && M.next_move_modifier == 4) + to_chat(M, "You feel the cells begin to merge with your body, unable to reach nucleation, they instead merge with your body, healing any wounds.") + M.adjustCloneLoss(-10, 0) //I don't want to make Rezadone obsolete. + M.adjustBruteLoss(-50, 0) + M.adjustFireLoss(-50, 0) + M.heal_bodypart_damage(1,1) + M.next_move_modifier = 1 + //Breast englargement /datum/reagent/fermi/BElarger diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 481c7925cf..37729ef21f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -40,7 +40,7 @@ CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) - ThermicConstant = 20 //Temperature change per 1u produced + ThermicConstant = +20 //Temperature change per 1u produced HIonRelease = 0.01 //pH change per 1u reaction RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics From 4c302a1aa3700405de9bb843e844173e1eabbacf Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 09:00:13 +0100 Subject: [PATCH 044/608] Small changes --- code/modules/reagents/chemistry/reagents.dm | 4 +++- .../code/modules/reagents/chemistry/recipes/fermi.dm | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 01810b9713..578904c096 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -33,7 +33,9 @@ var/addiction_stage4_end = 40 var/overdosed = 0 // You fucked up and this is now triggering its overdose effects, purge that shit quick. var/self_consuming = FALSE - var/purity = 1 //Fermichem var + //Fermichem vars: + var/purity = 1 + var/impureChem = "toxin" /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 37729ef21f..9683c61ecb 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -45,7 +45,7 @@ RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way - ImpureChem = "toxin" //What chemical is produced with an inpure reaction + ImpureChem = "SDZF" //What chemical is produced with an inpure reaction /datum/chemical_reaction/BElarger From 3ac2206f754a89b1f61b0fab04b1079f97c43127 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 09:41:58 +0100 Subject: [PATCH 045/608] Added SDGF's fail chem; SDZF. --- .../chemistry/reagents/fermi_reagents.dm | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index d4c6e93c2a..9df95d7492 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -178,8 +178,8 @@ description = "A rapidly diving mass of Embryonic stem cells. These cells are missing a nucleus and quickly replicate a host’s DNA before growing to form an almost perfect clone of the host. In some cases neural replication takes longer, though the underlying reason underneath has yet to be determined." color = "#60A584" // rgb: 96, 0, 255 //var/fClone_current_controller = OWNER - var/mob/living/split_personality/clone//there's two so they can swap without overwriting - var/mob/living/split_personality/owner + //var/mob/living/split_personality/clone//there's two so they can swap without overwriting + //var/mob/living/split_personality/owner //var/mob/living/carbon/SM /datum/reagent/fermi/SGDF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. @@ -251,7 +251,7 @@ if(30) M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE M.next_move_modifier = 1 - to_chat(M, "Your body splits away from the cell clone of yourself, leaving your with a drained and hollow feeling inside.") + to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) M.reagents.del_reagent("SGDF")//removes SGDF on completion. @@ -266,6 +266,46 @@ M.heal_bodypart_damage(1,1) M.next_move_modifier = 1 +/datum/reagent/fermi/SDZF + name = "synthetic-derived zombie factor" + id = "SDGF" + description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" + color = "#60A584" // rgb: 96, 0, 255 + +/datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. + message_admins("SGZF ingested") + switch(current_cycle)//Pretends to be normal + message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") + if(10) + to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") + M.nutrition = M.nutrition + (M.nutrition/30) + if(15) + to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") + M.nutrition = M.nutrition + (M.nutrition/20) + if(20) + to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") + M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! + M.nutrition = M.nutrition + (M.nutrition/10) + if(28) + to_chat(M, "The cells begin to precipitate outwards of your body, but... something is wrong, the sythetic cells are beginnning to rot...") + M.nutrition = 200 + M.adjustToxLoss(10, 0) + if(30) + message_admins("Zombie spawned at [M.loc]") + M.nutrition = 15//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE + M.next_move_modifier = 1 + to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") + /datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. + M.visible_message("[M] suddenly shudders, and splits herself into a funky smelling copy of themselves!") + M.emote("scream") + M.adjustToxLoss(30, 0) + fermi_Zombie = new typepath(M.loc) + var/mob/living/simple_animal/hostile/zombie/ZI = fermi_Zombie + ZI.damage_coeff = list(BRUTE = ((1 / M.reagents.volume)**0.5) , BURN = ((1 / M.reagents.volume)**0.25), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + ZI.real_name = M.real_name//Give your offspring a big old kiss. + M.reagents.del_reagent("SGZF")//removes SGZF on completion. + ..() + //Breast englargement /datum/reagent/fermi/BElarger From 0ad81b1bb011dff981f52e4ce2d5cc7dcc9d512b Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 12:23:03 +0100 Subject: [PATCH 046/608] The addiction handling is beautiful. --- code/modules/reagents/chemistry/holder.dm | 9 +- .../code/datums/status_effects/chems.dm | 4 +- .../chemistry/reagents/fermi_reagents.dm | 147 +++++++++++------- .../reagents/chemistry/recipes/fermi.dm | 4 +- 4 files changed, 97 insertions(+), 67 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 0b76dcef5d..986d2bce94 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -662,10 +662,6 @@ purity = ((purity * reactedVol) + (deltapH * stepChemAmmount)) /((reactedVol+ stepChemAmmount)) //This should add the purity to the product else purity = deltapH - message_admins("purity: [purity], purity of beaker") - message_admins("Temp before change: [chem_temp], pH after change: [pH]") - //Apply pH changes and thermal output of reaction to beaker - message_admins("Temp after change: [chem_temp], pH after change: [pH]") // End. /* @@ -685,8 +681,13 @@ SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + message_admins("purity: [purity], purity of beaker") + message_admins("Temp before change: [chem_temp], pH after change: [pH]") + //Apply pH changes and thermal output of reaction to beaker chem_temp += (C.ThermicConstant * stepChemAmmount) pH += (C.HIonRelease * stepChemAmmount) + message_admins("Temp after change: [chem_temp], pH after change: [pH]") + reactedVol = reactedVol + stepChemAmmount diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 54071bff27..5c218dfbe3 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -4,8 +4,8 @@ /datum/status_effect/chem/SGDF/on_apply(mob/living/carbon/M) message_admins("SGDF status appied") - var/typepath = M.type - fermi_Clone = new typepath(M.loc) + var/typepath + fermi_Clone = new typepath(get_turf(M.loc)) //var/mob/living/carbon/M = owner //var/mob/living/carbon/C = fermi_Clone if(istype(fermi_Clone) && istype(M)) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 9df95d7492..6f425f14df 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -35,8 +35,8 @@ addiction_threshold = 30 metabolization_rate = 0.5 * REAGENTS_METABOLISM addiction_stage2_end = 30 - addiction_stage3_end = 40 - addiction_stage4_end = 45 //Incase it's too long + addiction_stage3_end = 41 + addiction_stage4_end = 43 //Incase it's too long var/turf/open/location_created = null var/turf/open/location_return = null var/addictCyc1 = 1 @@ -110,8 +110,9 @@ M.Jitter(50) M.Knockdown(100) M.Stun(40) + var/items = M.get_contents() - var/obj/item/I = pick(items) + var/obj/item/I = pick(items) M.dropItemToGround(I, TRUE) do_sparks(5,FALSE,I) do_teleport(I, get_turf(I), 5, no_effects=TRUE); @@ -136,6 +137,9 @@ message_admins("Fermi T Clone: [fermi_Tclone]") do_teleport(C, get_turf(C), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! do_sparks(5,FALSE,C) + C.emote("spin") + M.emote("spin") + C.visible_message("[C] [pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")] [pick(""Bugger me, whats all this then?"", "Hot damn, where is this?", "sacre bleu! Où suis-je?!", "Yee haw!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "Ciekawe co na obiad?", "You fool! You took too much eigenstasium! You've doomed us all!", "Watashi no nihon'noanime no yona monodesu!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Detta är sista gången jag dricker beepsky smash.")]") message_admins("Fermi T Clone: [fermi_Tclone] teleport attempt") if(3) var/mob/living/carbon/C = fermi_Tclone @@ -145,19 +149,23 @@ M.visible_message("[M] is snapped across to a different alternative reality!") src.addictCyc3 = 1 //counter fermi_Tclone = null - message_admins("[src.addictCyc3]") src.addictCyc3++ + message_admins("[src.addictCyc3]") do_teleport(M, get_turf(M), 2, no_effects=TRUE) //Teleports player randomly + do_sparks(5,FALSE,M) ..() //loop function /datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. switch(src.addictCyc4) if(1) - M.Sleeping(20, 0) + do_sparks(5,FALSE,M) + do_teleport(M, get_turf(M), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! + do_sparks(5,FALSE,M) + M.Sleeping(50, 0) M.Jitter(50) M.Knockdown(0) to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") - M.emote("me",1,"gasps and gazes around in a bewildered and highly confused fashion!",TRUE) + M.emote("me",1,"flashes into reality suddenly, gasping as she gazes around in a bewildered and highly confused fashion!",TRUE) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) if(prob(20)) do_sparks(5,FALSE,M) @@ -172,25 +180,29 @@ //eigenstate END //Clone serum #chemClone -/datum/reagent/fermi/SDGF +/datum/reagent/fermi/SDGF //vars, mostly only care about keeping track if there's a player in the clone or not. name = "synthetic-derived growth factor" id = "SDGF" description = "A rapidly diving mass of Embryonic stem cells. These cells are missing a nucleus and quickly replicate a host’s DNA before growing to form an almost perfect clone of the host. In some cases neural replication takes longer, though the underlying reason underneath has yet to be determined." color = "#60A584" // rgb: 96, 0, 255 + var/playerClone = FALSE + var/unitCheck = FALSE + var/list/candidates + //var/fClone_current_controller = OWNER //var/mob/living/split_personality/clone//there's two so they can swap without overwriting //var/mob/living/split_personality/owner //var/mob/living/carbon/SM -/datum/reagent/fermi/SGDF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. +/datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone - message_admins("SGDF ingested") + message_admins("SDGF ingested") switch(current_cycle) - if(1) - var/list/candidates = pollCandidatesForMob("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, M, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies + if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. + src.candidates = pollCandidatesForMob("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, M, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies if(10 to INFINITY) - if(LAZYLEN(candidates)) + if(LAZYLEN(src.candidates)) //If there's candidates, clone the person and put them in there! message_admins("Candidate found!") //var/typepath = owner.type //clone = new typepath(owner.loc) @@ -203,107 +215,124 @@ SM.real_name = M.real_name M.dna.transfer_identity(SM) SM.updateappearance(mutcolor_update=1) - - if(M.getorganslot(ORGAN_SLOT_ZOMBIE))//sure, it "treats" it, but "you've" still got it. - var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE) - ZI.Remove(M) - ZI.Insert(C) - - var/mob/dead/observer/C = pick(candidates) + var/mob/dead/observer/C = pick(src.candidates) SM.key = C.key SM.mind.enslave_mind_to_creator(M) + + if(M.getorganslot(ORGAN_SLOT_ZOMBIE))//sure, it "treats" it, but "you've" still got it. Doesn't always work as well; needs a ghost. + var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE) + ZI.Remove(M) + ZI.Insert(SM) + //SM.sentience_act() to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") M.visible_message("[M] suddenly shudders, and splits into two identical twins!") SM.copy_known_languages_from(M, FALSE) + src.playerClone = TRUE //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? //after_success(user, SM) //qdel(src) - else + else //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). message_admins("Failed to find clone Candidate") - if(M.has_status_effect(/datum/status_effect/chem/SGDF)) + src.unitCheck = TRUE + if(M.has_status_effect(/datum/status_effect/chem/SGDF)) // Heal the user if they went to all this trouble to make it and can't get a clone, the poor fellow. to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). - M.adjustCloneLoss(-0.5, 0) - M.adjustBruteLoss(-0.5, 0) - M.adjustFireLoss(-0.5, 0) + M.adjustCloneLoss(-2, 0) + M.adjustBruteLoss(-2, 0) + M.adjustFireLoss(-2, 0) M.heal_bodypart_damage(1,1) M.remove_trait(TRAIT_DISFIGURED, TRAIT_GENERIC) - else + else //If there's no ghosts, but they've made a large amount, then proceed to make flavourful clone, where you become fat and useless until you split. switch(current_cycle) - message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") if(10) to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") - M.nutrition = M.nutrition + (M.nutrition/30) - if(15) - to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") - M.nutrition = M.nutrition + (M.nutrition/20) - if(20) - to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") - M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! M.nutrition = M.nutrition + (M.nutrition/10) - if(28) + if(20) + to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") + M.nutrition = M.nutrition + (M.nutrition/5) + if(40) + to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") + M.next_move_modifier = 2//If this makes you fast then please fix it, it should make you slow!! + M.nutrition = M.nutrition + (M.nutrition/2) + if(65) to_chat(M, "The cells begin to precipitate outwards of your body, you feel like you'll split soon...") - M.nutrition = 200 - if(30) + M.nutrition = 2000 + if(75)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE M.next_move_modifier = 1 to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) M.reagents.del_reagent("SGDF")//removes SGDF on completion. + message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 30") - ..() -/datum/reagent/fermi/SDGF/on_mob_delete(mob/living/M) //returns back to original location - if !(M.has_status_effect(/datum/status_effect/chem/SGDF) && M.next_move_modifier == 4) + //..() + +/datum/reagent/fermi/SDGF/on_mob_delete(mob/living/M) //When the chem is removed, a few things can happen. + if (playerClone == TRUE)//If the player made a clone with it, then thats all they get. + playerClone = FALSE + return + if (M.next_move_modifier == 4 && !M.has_status_effect(/datum/status_effect/chem/SGDF))//checks if they're ingested over 20u of the stuff, but fell short of the required 30u to make a clone. to_chat(M, "You feel the cells begin to merge with your body, unable to reach nucleation, they instead merge with your body, healing any wounds.") M.adjustCloneLoss(-10, 0) //I don't want to make Rezadone obsolete. - M.adjustBruteLoss(-50, 0) - M.adjustFireLoss(-50, 0) + M.adjustBruteLoss(-25, 0)// Note that this takes a long time to apply and makes you fat and useless when it's in you, I don't think this small burst of healing will be useful considering how long it takes to get there. + M.adjustFireLoss(-25, 0) + M.blood_volume += 250 M.heal_bodypart_damage(1,1) M.next_move_modifier = 1 + if (M.nutrition < 1500) + M.nutrition += 250 + else if (src.unitCheck == TRUE && !M.has_status_effect(/datum/status_effect/chem/SGDF))// If they're ingested a little bit (10u minimum), then give them a little healing. + src.unitCheck = FALSE + to_chat(M, "the cells fail to hold enough mass to generate a clone, instead diffusing into your system instead. you can fee") + M.adjustBruteLoss(-10, 0) + M.adjustFireLoss(-10, 0) + M.blood_volume += 100 + if (M.nutrition < 1500) + M.nutrition += 500 /datum/reagent/fermi/SDZF name = "synthetic-derived zombie factor" - id = "SDGF" + id = "SDZF" description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" color = "#60A584" // rgb: 96, 0, 255 + var/fermi_Zombie /datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. message_admins("SGZF ingested") switch(current_cycle)//Pretends to be normal - message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") if(10) to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") - M.nutrition = M.nutrition + (M.nutrition/30) - if(15) - to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") - M.nutrition = M.nutrition + (M.nutrition/20) - if(20) - to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") - M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! M.nutrition = M.nutrition + (M.nutrition/10) - if(28) + if(20) + to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") + M.nutrition = M.nutrition + (M.nutrition/5) + if(40) + to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") + M.next_move_modifier = 2//If this makes you fast then please fix it, it should make you slow!! + M.nutrition = M.nutrition + (M.nutrition/2) + if(65) to_chat(M, "The cells begin to precipitate outwards of your body, but... something is wrong, the sythetic cells are beginnning to rot...") - M.nutrition = 200 - M.adjustToxLoss(10, 0) - if(30) + M.nutrition = 2000 + M.adjustToxLoss(1, 0) + if(75) message_admins("Zombie spawned at [M.loc]") M.nutrition = 15//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE M.next_move_modifier = 1 - to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") - /datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. + to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") M.visible_message("[M] suddenly shudders, and splits herself into a funky smelling copy of themselves!") M.emote("scream") M.adjustToxLoss(30, 0) - fermi_Zombie = new typepath(M.loc) - var/mob/living/simple_animal/hostile/zombie/ZI = fermi_Zombie - ZI.damage_coeff = list(BRUTE = ((1 / M.reagents.volume)**0.5) , BURN = ((1 / M.reagents.volume)**0.25), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + //fermi_Zombie = new typepath(M.loc) + var/mob/living/simple_animal/hostile/zombie/ZI = new(get_turf(M.loc)) + ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) ZI.real_name = M.real_name//Give your offspring a big old kiss. M.reagents.del_reagent("SGZF")//removes SGZF on completion. + message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 9683c61ecb..481c7925cf 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -40,12 +40,12 @@ CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) - ThermicConstant = +20 //Temperature change per 1u produced + ThermicConstant = 20 //Temperature change per 1u produced HIonRelease = 0.01 //pH change per 1u reaction RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way - ImpureChem = "SDZF" //What chemical is produced with an inpure reaction + ImpureChem = "toxin" //What chemical is produced with an inpure reaction /datum/chemical_reaction/BElarger From 10e9cd8b68426c01fff09622cab48bdb72f162d6 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 19:42:35 +0100 Subject: [PATCH 047/608] Minor tweaks and fixes to SDGF and Eigen. --- .../chemistry/reagents/fermi_reagents.dm | 59 +++++++++++++------ 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 6f425f14df..81809d361c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -13,7 +13,7 @@ taste_description = "If affection had a taste, this would be it." /datum/reagent/fermi/on_mob_life(mob/living/carbon/M) - current_cycle++ + //current_cycle++ holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism return ..() @@ -65,19 +65,21 @@ /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! switch(current_cycle) if(1) - location_return = get_turf(M.loc) //sets up return point + location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") do_sparks(5,FALSE,M) - M.forceMove(location_created) //Teleports to creation location + do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg') + //M.forceMove(location_created) //Teleports to creation location do_sparks(5,FALSE,M) if(prob(20)) do_sparks(5,FALSE,M) + message_admins("eigenstate state: [current_cycle]") ..() /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location do_sparks(5,FALSE,src) to_chat(M, "You feel your wavefunction collapse!") - M.forceMove(location_return.loc) //Teleports home + do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home do_sparks(5,FALSE,src) ..() @@ -139,7 +141,8 @@ do_sparks(5,FALSE,C) C.emote("spin") M.emote("spin") - C.visible_message("[C] [pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")] [pick(""Bugger me, whats all this then?"", "Hot damn, where is this?", "sacre bleu! Où suis-je?!", "Yee haw!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "Ciekawe co na obiad?", "You fool! You took too much eigenstasium! You've doomed us all!", "Watashi no nihon'noanime no yona monodesu!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Detta är sista gången jag dricker beepsky smash.")]") + M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) + C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! O� suis-je?!", "Yee haw!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "Ciekawe co na obiad?", "You fool! You took too much eigenstasium! You've doomed us all!", "Watashi no nihon'noanime no yona monodesu!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Detta �r sista g�ngen jag dricker beepsky smash.")]\"") message_admins("Fermi T Clone: [fermi_Tclone] teleport attempt") if(3) var/mob/living/carbon/C = fermi_Tclone @@ -165,7 +168,7 @@ M.Jitter(50) M.Knockdown(0) to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") - M.emote("me",1,"flashes into reality suddenly, gasping as she gazes around in a bewildered and highly confused fashion!",TRUE) + M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) if(prob(20)) do_sparks(5,FALSE,M) @@ -250,27 +253,32 @@ switch(current_cycle) if(10) to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") + if(11 to 19) M.nutrition = M.nutrition + (M.nutrition/10) if(20) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") + if(21 to 39) M.nutrition = M.nutrition + (M.nutrition/5) if(40) to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") - M.next_move_modifier = 2//If this makes you fast then please fix it, it should make you slow!! + M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! + if(41 to 69) M.nutrition = M.nutrition + (M.nutrition/2) - if(65) + if(70) to_chat(M, "The cells begin to precipitate outwards of your body, you feel like you'll split soon...") - M.nutrition = 2000 - if(75)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. + if M.nutrition < 20000 + M.nutrition = 20000 + if(76)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE M.next_move_modifier = 1 to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) - M.reagents.del_reagent("SGDF")//removes SGDF on completion. + if(71 to INFINITY) + M.reagents.remove_reagent("SGDF", 5)//removes SGDF on completion. message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 30") - //..() + ..() /datum/reagent/fermi/SDGF/on_mob_delete(mob/living/M) //When the chem is removed, a few things can happen. if (playerClone == TRUE)//If the player made a clone with it, then thats all they get. @@ -307,21 +315,26 @@ switch(current_cycle)//Pretends to be normal if(10) to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") + if(11 to 19) M.nutrition = M.nutrition + (M.nutrition/10) if(20) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") + if(21 to 39) M.nutrition = M.nutrition + (M.nutrition/5) if(40) to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") - M.next_move_modifier = 2//If this makes you fast then please fix it, it should make you slow!! + M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! + if(41 to 61) M.nutrition = M.nutrition + (M.nutrition/2) - if(65) + if(62) to_chat(M, "The cells begin to precipitate outwards of your body, but... something is wrong, the sythetic cells are beginnning to rot...") - M.nutrition = 2000 - M.adjustToxLoss(1, 0) - if(75) + if M.nutrition < 20000 + M.nutrition = 20000 + if(63 to 75) + M.adjustToxLoss(1, 0)// the warning! + if(76 && if (!holder.has_reagent("pen_acid")))//Counterplay is pent. message_admins("Zombie spawned at [M.loc]") - M.nutrition = 15//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE + M.nutrition -= 10000//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE M.next_move_modifier = 1 to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") M.visible_message("[M] suddenly shudders, and splits herself into a funky smelling copy of themselves!") @@ -331,7 +344,15 @@ var/mob/living/simple_animal/hostile/zombie/ZI = new(get_turf(M.loc)) ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) ZI.real_name = M.real_name//Give your offspring a big old kiss. - M.reagents.del_reagent("SGZF")//removes SGZF on completion. + M.reagents.remove_reagent("SGZF", 20) + if(77 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. + M.nutrition -= 1000 + var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") + S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + S.real_name = "rotting tumour." + M.reagents.remove_reagent("SGZF", 50) + M.adjustToxLoss(10, 0) + to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") ..() From 6ec913af78a9d8ba7008dac2ca6f649ac52b2893 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 20:55:59 +0100 Subject: [PATCH 048/608] Futher fixes --- .../code/datums/status_effects/chems.dm | 4 +- .../chemistry/reagents/fermi_reagents.dm | 70 ++++++++++--------- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 5c218dfbe3..90eca8d7c8 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -2,10 +2,10 @@ id = "SGDF" var/mob/living/carbon/human/fermi_Clone = null -/datum/status_effect/chem/SGDF/on_apply(mob/living/carbon/M) +/datum/status_effect/chem/SGDF/on_apply(mob/living/M) message_admins("SGDF status appied") var/typepath - fermi_Clone = new typepath(get_turf(M.loc)) + fermi_Clone = new typepath(get_turf(M)) //var/mob/living/carbon/M = owner //var/mob/living/carbon/C = fermi_Clone if(istype(fermi_Clone) && istype(M)) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 81809d361c..9c7cedecbf 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -31,8 +31,8 @@ description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" taste_description = "." color = "#60A584" // rgb: 96, 0, 255 - overdose_threshold = 20 - addiction_threshold = 30 + overdose_threshold = 15 + addiction_threshold = 20 metabolization_rate = 0.5 * REAGENTS_METABOLISM addiction_stage2_end = 30 addiction_stage3_end = 41 @@ -57,12 +57,12 @@ /datum/reagent/fermi/eigenstate/New() . = ..() //Needed! //if(holder && holder.my_atom) - location_created = get_turf(holder.my_atom) //Sets up coordinate of where it was created + location_created = get_turf(mob/living/M) //Sets up coordinate of where it was created message_admins("Attempting to get creation location from New() [location_created]") //..() -/datum/reagent/fermi/eigenstate/on_mob_life(mob/living/carbon/M) //Teleports to chemistry! +/datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! switch(current_cycle) if(1) location_return = get_turf(M) //sets up return point @@ -71,7 +71,7 @@ do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg') //M.forceMove(location_created) //Teleports to creation location do_sparks(5,FALSE,M) - if(prob(20)) + if(prob(20))s do_sparks(5,FALSE,M) message_admins("eigenstate state: [current_cycle]") ..() @@ -142,7 +142,7 @@ C.emote("spin") M.emote("spin") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) - C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! O� suis-je?!", "Yee haw!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "Ciekawe co na obiad?", "You fool! You took too much eigenstasium! You've doomed us all!", "Watashi no nihon'noanime no yona monodesu!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Detta �r sista g�ngen jag dricker beepsky smash.")]\"") + C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! O� suis-je?!", "Yee haw!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "Ciekawe co na obiad?", "You fool! You took too much eigenstasium! You've doomed us all!", "Watashi no nihon'noanime no yona monodesu!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Detta �r sista g�ngen jag dricker beepsky smash.", "Now neither of us will be virgins!")]\"") message_admins("Fermi T Clone: [fermi_Tclone] teleport attempt") if(3) var/mob/living/carbon/C = fermi_Tclone @@ -190,7 +190,7 @@ color = "#60A584" // rgb: 96, 0, 255 var/playerClone = FALSE var/unitCheck = FALSE - var/list/candidates + var/list/candidates = list() //var/fClone_current_controller = OWNER //var/mob/living/split_personality/clone//there's two so they can swap without overwriting @@ -200,16 +200,18 @@ /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone - message_admins("SDGF ingested") + switch(current_cycle) if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. - src.candidates = pollCandidatesForMob("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, M, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies + src.candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 300, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies + message_admins("Attempting to poll") if(10 to INFINITY) + message_admins("Number of candidates [LAZYLEN(src.candidates)]") if(LAZYLEN(src.candidates)) //If there's candidates, clone the person and put them in there! message_admins("Candidate found!") //var/typepath = owner.type //clone = new typepath(owner.loc) - var/typepath = M.type + //var/typepath = M.type var/mob/living/carbon/fermi_Gclone = new typepath(M.loc) //var/mob/living/carbon/SM = owner //var/mob/living/carbon/M = M @@ -266,16 +268,17 @@ M.nutrition = M.nutrition + (M.nutrition/2) if(70) to_chat(M, "The cells begin to precipitate outwards of your body, you feel like you'll split soon...") - if M.nutrition < 20000 - M.nutrition = 20000 + if (M.nutrition < 20000) + M.nutrition = 20000 if(76)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE M.next_move_modifier = 1 to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) - if(71 to INFINITY) + if(77 to INFINITY) M.reagents.remove_reagent("SGDF", 5)//removes SGDF on completion. - message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 30") + message_admins("Purging SGDF [volume]") + message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") ..() @@ -324,29 +327,32 @@ if(40) to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! - if(41 to 61) + if(41 to 63) M.nutrition = M.nutrition + (M.nutrition/2) - if(62) + if(64) to_chat(M, "The cells begin to precipitate outwards of your body, but... something is wrong, the sythetic cells are beginnning to rot...") - if M.nutrition < 20000 + if (M.nutrition < 20000) M.nutrition = 20000 - if(63 to 75) + if(65 to 75) M.adjustToxLoss(1, 0)// the warning! - if(76 && if (!holder.has_reagent("pen_acid")))//Counterplay is pent. - message_admins("Zombie spawned at [M.loc]") - M.nutrition -= 10000//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE - M.next_move_modifier = 1 - to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") - M.visible_message("[M] suddenly shudders, and splits herself into a funky smelling copy of themselves!") - M.emote("scream") - M.adjustToxLoss(30, 0) - //fermi_Zombie = new typepath(M.loc) - var/mob/living/simple_animal/hostile/zombie/ZI = new(get_turf(M.loc)) - ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - ZI.real_name = M.real_name//Give your offspring a big old kiss. - M.reagents.remove_reagent("SGZF", 20) + if(76) + if (!holder.has_reagent("pen_acid"))//Counterplay is pent.) + message_admins("Zombie spawned at [M.loc]") + M.nutrition -= 18500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE + M.next_move_modifier = 1 + to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") + M.visible_message("[M] suddenly shudders, and splits into a funky smelling copy of themselves!") + M.emote("scream") + M.adjustToxLoss(30, 0) + //fermi_Zombie = new typepath(M.loc) + var/mob/living/simple_animal/hostile/zombie/ZI = new(get_turf(M.loc)) + ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + ZI.real_name = M.real_name//Give your offspring a big old kiss. + M.reagents.remove_reagent("SGZF", 50) + else + to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") if(77 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. - M.nutrition -= 1000 + M.nutrition -= 100 var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) S.real_name = "rotting tumour." From 51d7d6237974c0f2073f861069428f1096614889 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 22:31:16 +0100 Subject: [PATCH 049/608] Midfix --- .../chemistry/Fermi_Chemistry_notes.txt | 6 +-- code/modules/reagents/chemistry/holder.dm | 3 +- .../code/datums/status_effects/chems.dm | 39 ++++++++------ .../chemistry/reagents/fermi_reagents.dm | 52 +++++++++++-------- 4 files changed, 58 insertions(+), 42 deletions(-) diff --git a/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt b/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt index 541c3e71b3..efcd9b748f 100644 --- a/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt +++ b/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt @@ -38,9 +38,9 @@ How the end state should look:{ ThermicConstant = -2.5 //Temperature change per 1u produced HIonRelease = 0.01 //pH change per 1u reaction RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect - optional: - mix_message = "The mixture yields a fine black powder." - required_catalysts = list("plasma" = 5) + //optional: + mix_message = "The mixture yields a fine black powder." + required_catalysts = list("plasma" = 5) edit: required_temp = 380 diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 986d2bce94..2ec63bd19d 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -839,7 +839,8 @@ R.volume = amount if(data) R.data = data - R.on_new(data) + R.on_new(data) + R.loc = holder.loc if(isliving(my_atom)) R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 90eca8d7c8..120f14317c 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -1,28 +1,35 @@ /datum/status_effect/chem/SGDF id = "SGDF" - var/mob/living/carbon/human/fermi_Clone = null + var/mob/living/fermi_Clone -/datum/status_effect/chem/SGDF/on_apply(mob/living/M) + +/datum/status_effect/chem/SGDF/on_apply() message_admins("SGDF status appied") - var/typepath - fermi_Clone = new typepath(get_turf(M)) - //var/mob/living/carbon/M = owner + var/typepath = owner.type + fermi_Clone = new typepath(owner.loc) + var/mob/living/carbon/M = owner + var/mob/living/carbon/C = fermi_Clone + + //fermi_Clone = new typepath(get_turf(M)) //var/mob/living/carbon/C = fermi_Clone - if(istype(fermi_Clone) && istype(M)) - fermi_Clone.real_name = M.real_name - M.dna.transfer_identity(fermi_Clone, transfer_SE=1) - fermi_Clone.updateappearance(mutcolor_update=1) + //var/mob/living/carbon/SM = fermi_Gclone + + if(istype(C) && istype(M)) + C.real_name = M.real_name + M.dna.transfer_identity(C, transfer_SE=1) + C.updateappearance(mutcolor_update=1) return ..() -/datum/status_effect/chem/SGDF/tick(mob/living/M) +/datum/status_effect/chem/SGDF/tick() message_admins("SDGF ticking") - if(M.stat == DEAD) + if(owner.stat == DEAD) message_admins("SGDF status swapping") if(fermi_Clone && fermi_Clone.stat != DEAD) - if(M.mind) - M.mind.transfer_to(fermi_Clone) - M.visible_message("Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") - fermi_Clone = null - //if(!clone || clone.stat == DEAD) + if(owner.mind) + owner.mind.transfer_to(fermi_Clone) + owner.visible_message("Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") + fermi_Clone.visible_message("Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") + fermi_Clone = null + owner.remove_status_effect(src) // to_chat(owner, "[linked_extract] desperately tries to move your soul to a living body, but can't find one!") ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 9c7cedecbf..343ec50578 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -35,7 +35,7 @@ addiction_threshold = 20 metabolization_rate = 0.5 * REAGENTS_METABOLISM addiction_stage2_end = 30 - addiction_stage3_end = 41 + addiction_stage3_end = 40 addiction_stage4_end = 43 //Incase it's too long var/turf/open/location_created = null var/turf/open/location_return = null @@ -45,33 +45,36 @@ var/addictCyc4 = 1 var/mob/living/fermi_Tclone = null var/teleBool = FALSE + mob/living/carbon/purgeBody -///obj/item/reagent/fermi/eigenstate/Initialize() -/datum/reagent/fermi/eigenstate/on_new() +/* +/datum/reagent/fermi/eigenstate/oew() . = ..() //Needed! location_created = get_turf(src) //Sets up coordinate of where it was created message_admins("Attempting to get creation location from on_new() [location_created]") //..()s - -/datum/reagent/fermi/eigenstate/New() +*/ +/datum/reagent/fermi/eigenstate/on_new() +//obj/item/reagent/fermi/eigenstate/Initialize() +//datum/reagent/fermi/eigenstate/Initialize() . = ..() //Needed! //if(holder && holder.my_atom) - location_created = get_turf(mob/living/M) //Sets up coordinate of where it was created - message_admins("Attempting to get creation location from New() [location_created]") + location_created = get_turf(holder) //Sets up coordinate of where it was created + message_admins("Attempting to get creation location from init() [location_created]") //..() /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! switch(current_cycle) - if(1) + if(0) location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") do_sparks(5,FALSE,M) do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg') //M.forceMove(location_created) //Teleports to creation location do_sparks(5,FALSE,M) - if(prob(20))s + if(prob(20)) do_sparks(5,FALSE,M) message_admins("eigenstate state: [current_cycle]") ..() @@ -92,7 +95,7 @@ do_sparks(5,FALSE,src) do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) - M.reagents.remove_reagent("eigenstate",0.5)//So you're not stuck for 10 minutes teleporting + holder.remove_reagent("eigenstate",0.5)//So you're not stuck for 10 minutes teleporting ..() //loop function @@ -126,10 +129,10 @@ //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in switch(src.addictCyc3) - if(1) + if(0) M.Jitter(100) to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the eigenstate event horizon.") - if(2) + if(1) var/typepath = M.type fermi_Tclone = new typepath(M.loc) var/mob/living/carbon/C = fermi_Tclone @@ -144,13 +147,13 @@ M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! O� suis-je?!", "Yee haw!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "Ciekawe co na obiad?", "You fool! You took too much eigenstasium! You've doomed us all!", "Watashi no nihon'noanime no yona monodesu!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Detta �r sista g�ngen jag dricker beepsky smash.", "Now neither of us will be virgins!")]\"") message_admins("Fermi T Clone: [fermi_Tclone] teleport attempt") - if(3) + if(2) var/mob/living/carbon/C = fermi_Tclone do_sparks(5,FALSE,C) qdel(C) //Deletes CLONE, or at least I hope it is. message_admins("Fermi T Clone: [fermi_Tclone] deletion attempt") M.visible_message("[M] is snapped across to a different alternative reality!") - src.addictCyc3 = 1 //counter + src.addictCyc3 = 0 //counter fermi_Tclone = null src.addictCyc3++ message_admins("[src.addictCyc3]") @@ -197,21 +200,26 @@ //var/mob/living/split_personality/owner //var/mob/living/carbon/SM +/datum/reagent/fermi/SDGF/on_mob_add(mob/living/carbon/M) + src.candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 300, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies + message_admins("Attempting to poll") + + /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone switch(current_cycle) - if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. - src.candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 300, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies - message_admins("Attempting to poll") + //if(0) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. + // src.candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 300, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies + // message_admins("Attempting to poll") if(10 to INFINITY) message_admins("Number of candidates [LAZYLEN(src.candidates)]") - if(LAZYLEN(src.candidates)) //If there's candidates, clone the person and put them in there! + if(LAZYLEN(src.candidates) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! message_admins("Candidate found!") //var/typepath = owner.type //clone = new typepath(owner.loc) - //var/typepath = M.type + var/typepath = M.type var/mob/living/carbon/fermi_Gclone = new typepath(M.loc) //var/mob/living/carbon/SM = owner //var/mob/living/carbon/M = M @@ -276,7 +284,7 @@ to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) if(77 to INFINITY) - M.reagents.remove_reagent("SGDF", 5)//removes SGDF on completion. + holder.remove_reagent("SGDF", 5)//removes SGDF on completion. message_admins("Purging SGDF [volume]") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") @@ -348,7 +356,7 @@ var/mob/living/simple_animal/hostile/zombie/ZI = new(get_turf(M.loc)) ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) ZI.real_name = M.real_name//Give your offspring a big old kiss. - M.reagents.remove_reagent("SGZF", 50) + holder.remove_reagent("SGZF", 50) else to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") if(77 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. @@ -356,7 +364,7 @@ var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) S.real_name = "rotting tumour." - M.reagents.remove_reagent("SGZF", 50) + holder.remove_reagent("SGZF", 50) M.adjustToxLoss(10, 0) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") From 492f3fde885955351ef4f6abf5008d4d3393849d Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 22:38:18 +0100 Subject: [PATCH 050/608] Commited uncompliedable code (oops) --- code/modules/reagents/chemistry/holder.dm | 5 +++-- code/modules/reagents/chemistry/reagents.dm | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 2ec63bd19d..fb14cab18f 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -837,10 +837,11 @@ cached_reagents += R R.holder = src R.volume = amount + R.loc = get_turf(my_atom) if(data) R.data = data - R.on_new(data) - R.loc = holder.loc + R.on_new(data) + if(isliving(my_atom)) R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 578904c096..1bf862bd5e 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -36,6 +36,7 @@ //Fermichem vars: var/purity = 1 var/impureChem = "toxin" + var/loc = null /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() From d4990d2823779b400a5dd7a4bc158272f68f915a Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 23 Apr 2019 23:05:40 +0100 Subject: [PATCH 051/608] What --- .../chemistry/reagents/fermi_reagents.dm | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 343ec50578..b9177a5795 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -60,7 +60,7 @@ //datum/reagent/fermi/eigenstate/Initialize() . = ..() //Needed! //if(holder && holder.my_atom) - location_created = get_turf(holder) //Sets up coordinate of where it was created + location_created = get_turf(loc) //Sets up coordinate of where it was created message_admins("Attempting to get creation location from init() [location_created]") //..() @@ -200,19 +200,15 @@ //var/mob/living/split_personality/owner //var/mob/living/carbon/SM -/datum/reagent/fermi/SDGF/on_mob_add(mob/living/carbon/M) - src.candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 300, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies - message_admins("Attempting to poll") - - /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone - - switch(current_cycle) - //if(0) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. - // src.candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 300, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies - // message_admins("Attempting to poll") + if(0) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. + src.candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 300, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies + message_admins("Attempting to poll") + if(15) + src.candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 300, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies + message_admins("Attempting to poll2") if(10 to INFINITY) message_admins("Number of candidates [LAZYLEN(src.candidates)]") if(LAZYLEN(src.candidates) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! @@ -244,6 +240,9 @@ M.visible_message("[M] suddenly shudders, and splits into two identical twins!") SM.copy_known_languages_from(M, FALSE) src.playerClone = TRUE + + M.next_move_modifier = 1 + M.nutrition = 150 //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? //after_success(user, SM) From f8ae8b325fdb29ee595e0258d2e537d9d33b3da8 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Tue, 23 Apr 2019 18:52:51 -0400 Subject: [PATCH 052/608] Update fermi_reagents.dm --- .../chemistry/reagents/fermi_reagents.dm | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index b9177a5795..da2206a1f1 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -386,3 +386,23 @@ if(M.gender == FEMALE) M.gender = MALE M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") + +//Nanite removal +/datum/reagent/fermi/naninte_b_gone + name = "Naninte bain" + id = "naninte_b_gone" + description = "A rather simple toxin to small nano machines that will kill them off at a rapid rate well in system." + color = "#5a7267" // rgb: 90, 114, 103 + overdose_threshold = 25 + +/datum/reagent/fermi/naninte_b_gone/on_mob_life(mob/living/carbon/C) + if(C./datum/component/nanites) + regen_rate = -5.0 + else + retrun + +/datum/reagent/fermi/naninte_b_gone/overdose_start(mob/living/carbon/C) + if(C./datum/component/nanites) + regen_rate = -7.5 + else + retrun From 946191ae673f54b39c5921f257dfc2f711fa36f7 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Tue, 23 Apr 2019 19:08:11 -0400 Subject: [PATCH 053/608] Update fermi.dm --- .../reagents/chemistry/recipes/fermi.dm | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 481c7925cf..22814de64c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -66,3 +66,27 @@ HIonRelease = 0.01 //pH change per 1u reaction RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE + +//Nano-b-gone +/datum/chemical_reaction/naninte_b_gone + name = "Naninte bain" + id = "naninte_b_gone" + results = list("naninte_b_gone" = 5) + required_reagents = list("synthflesh" = 5, "blood" = 3, "sugar" = 1, "salglu_solution" = 3) + mix_message = "the blood and sugar mixes catalysting a hard coating around the synth flesh" + //FermiChem vars: + OptimalTempMin = 450 + OptimalTempMax = 600 + ExplodeTemp = 700 + OptimalpHMin = 6 + OptimalpHMax = 8 + ReactpHLim = 1 + CatalystFact = 1 + CurveSharpT = 4 + CurveSharppH = 2 + ThermicConstant = -2.5 + HIonRelease = 0.01 + RateUpLim = 5 + FermiChem = TRUE + FermiExplode = FALSE + ImpureChem = "carpotoxin" From 1ffc1414703aab2d437e37e4c5b5a512806a6168 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Tue, 23 Apr 2019 19:08:51 -0400 Subject: [PATCH 054/608] fixed --- .../code/modules/reagents/chemistry/recipes/fermi.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 22814de64c..966e1d4910 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -81,7 +81,7 @@ OptimalpHMin = 6 OptimalpHMax = 8 ReactpHLim = 1 - CatalystFact = 1 + CatalystFact = 0 //To do 1 CurveSharpT = 4 CurveSharppH = 2 ThermicConstant = -2.5 From 682bf09cd5cde614b9849cac2774ad6a6ed0c585 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 24 Apr 2019 00:31:14 +0100 Subject: [PATCH 055/608] Mintor tests --- .../chemistry/reagents/fermi_reagents.dm | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index b9177a5795..6413e6c58b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -130,9 +130,11 @@ //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in switch(src.addictCyc3) if(0) + if(1) M.Jitter(100) to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the eigenstate event horizon.") if(1) + if(2) var/typepath = M.type fermi_Tclone = new typepath(M.loc) var/mob/living/carbon/C = fermi_Tclone @@ -200,18 +202,19 @@ //var/mob/living/split_personality/owner //var/mob/living/carbon/SM +/datum/reagent/fermi/SDGF/New(mob/living/carbon/M) + candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies + message_admins("Attempting to poll") + /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone switch(current_cycle) - if(0) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. - src.candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 300, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies + if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. + src.candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies message_admins("Attempting to poll") - if(15) - src.candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 300, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm, should allow admins to ban greifers or bullies - message_admins("Attempting to poll2") if(10 to INFINITY) message_admins("Number of candidates [LAZYLEN(src.candidates)]") - if(LAZYLEN(src.candidates) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! + if(LAZYLEN(candidates) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! message_admins("Candidate found!") //var/typepath = owner.type //clone = new typepath(owner.loc) @@ -224,7 +227,7 @@ SM.real_name = M.real_name M.dna.transfer_identity(SM) SM.updateappearance(mutcolor_update=1) - var/mob/dead/observer/C = pick(src.candidates) + var/mob/dead/observer/C = pick(candidates) SM.key = C.key SM.mind.enslave_mind_to_creator(M) @@ -239,7 +242,7 @@ to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") M.visible_message("[M] suddenly shudders, and splits into two identical twins!") SM.copy_known_languages_from(M, FALSE) - src.playerClone = TRUE + playerClone = TRUE M.next_move_modifier = 1 M.nutrition = 150 @@ -271,6 +274,7 @@ if(40) to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! + candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies if(41 to 69) M.nutrition = M.nutrition + (M.nutrition/2) if(70) @@ -283,7 +287,7 @@ to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) if(77 to INFINITY) - holder.remove_reagent("SGDF", 5)//removes SGDF on completion. + holder.remove_reagent("SGDF", 1)//removes SGDF on completion. message_admins("Purging SGDF [volume]") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") From 120d8177ab613d98a87712ea45f4bfb5f252453e Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 24 Apr 2019 00:57:42 +0100 Subject: [PATCH 056/608] aaaaa --- .../chemistry/reagents/fermi_reagents.dm | 22 ++++++++++--------- .../reagents/chemistry/recipes/fermi.dm | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index f1e7417f0d..c85a904c0c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -201,11 +201,12 @@ //var/mob/living/split_personality/clone//there's two so they can swap without overwriting //var/mob/living/split_personality/owner //var/mob/living/carbon/SM - -/datum/reagent/fermi/SDGF/New(mob/living/carbon/M) - candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies +/* +/datum/reagent/fermi/SDGF/New() + candidates = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies message_admins("Attempting to poll") - +^^^breaks everything +*/ /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone switch(current_cycle) @@ -274,13 +275,13 @@ if(40) to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! - candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies + //candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies if(41 to 69) M.nutrition = M.nutrition + (M.nutrition/2) if(70) to_chat(M, "The cells begin to precipitate outwards of your body, you feel like you'll split soon...") if (M.nutrition < 20000) - M.nutrition = 20000 + M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI if(76)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE M.next_move_modifier = 1 @@ -343,7 +344,7 @@ if(64) to_chat(M, "The cells begin to precipitate outwards of your body, but... something is wrong, the sythetic cells are beginnning to rot...") if (M.nutrition < 20000) - M.nutrition = 20000 + M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI if(65 to 75) M.adjustToxLoss(1, 0)// the warning! if(76) @@ -390,7 +391,7 @@ if(M.gender == FEMALE) M.gender = MALE M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") - +/* //Nanite removal /datum/reagent/fermi/naninte_b_gone name = "Naninte bain" @@ -403,10 +404,11 @@ if(C./datum/component/nanites) regen_rate = -5.0 else - retrun + return /datum/reagent/fermi/naninte_b_gone/overdose_start(mob/living/carbon/C) if(C./datum/component/nanites) regen_rate = -7.5 else - retrun + return +*/ diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 966e1d4910..d4cbf6847a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -72,7 +72,7 @@ name = "Naninte bain" id = "naninte_b_gone" results = list("naninte_b_gone" = 5) - required_reagents = list("synthflesh" = 5, "blood" = 3, "sugar" = 1, "salglu_solution" = 3) + required_reagents = list("synthflesh" = 5, "blood" = 3, "uranium" = 1, "salglu_solution" = 3) mix_message = "the blood and sugar mixes catalysting a hard coating around the synth flesh" //FermiChem vars: OptimalTempMin = 450 From 6ee338b66f65573e2cd4db9bead7f4be11012b42 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 24 Apr 2019 03:09:29 +0100 Subject: [PATCH 057/608] MONSTER, BUT FUNCTIONAl, SDGF CODE! --- .../code/datums/status_effects/chems.dm | 9 ++++ .../chemistry/reagents/fermi_reagents.dm | 54 +++++++++++++++---- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 120f14317c..6f3d4c99ae 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -33,3 +33,12 @@ owner.remove_status_effect(src) // to_chat(owner, "[linked_extract] desperately tries to move your soul to a living body, but can't find one!") ..() + +/datum/status_effect/chem/SDGF/candidates + id = "SGDFCandi" + var/mob/living/fermi_Clone + var/list/candies = list() + +/datum/status_effect/chem/SDGF/candidates/on_apply() + candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies + return ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index c85a904c0c..1b761341f5 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -195,7 +195,12 @@ color = "#60A584" // rgb: 96, 0, 255 var/playerClone = FALSE var/unitCheck = FALSE - var/list/candidates = list() + metabolization_rate = 0.25 * REAGENTS_METABOLISM + //var/datum/status_effect/chem/SDGF/candidates/candies + var/list/candies = list() + var/polling = FALSE + var/list/result = list() + var/list/group = null //var/fClone_current_controller = OWNER //var/mob/living/split_personality/clone//there's two so they can swap without overwriting @@ -207,15 +212,37 @@ message_admins("Attempting to poll") ^^^breaks everything */ +/datum/reagent/fermi/proc/sepPoll() + var/list/procCandies = list() + procCandies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 20) // see poll_ignore.dm, should allow admins to ban greifers or bullies + return procCandies + + /*if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. + M.apply_status_effect(/datum/status_effect/chem/SDGF/candidates) + /datum/status_effect/chem/SDGF/candidates/candies = new /datum/status_effect/chem/SDGF/candidates + ///datum/status_effect/chem/SDGF/candidates/candies = M.apply_status_effect(/datum/status_effect/chem/SDGF/candidates) + //candies = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies + message_admins("Attempting to poll")*/ + /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone + if(polling == FALSE) + for(var/mob/dead/observer/G in GLOB.player_list) + group += G + for(var/m in group) + var/mob/W = m + message_admins("Attempting to poll") + polling = TRUE + showCandidatePollWindow(M, 20, "Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.", result, null, current_cycle, TRUE) switch(current_cycle) - if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. - src.candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies - message_admins("Attempting to poll") - if(10 to INFINITY) - message_admins("Number of candidates [LAZYLEN(src.candidates)]") - if(LAZYLEN(candidates) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! + if(19) + for(var/mob/W in result) + if(!W.key || !W.client) + result -= W + candies = result + if(20 to INFINITY) + message_admins("Number of candidates [LAZYLEN(candies)]") + if(LAZYLEN(candies) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! message_admins("Candidate found!") //var/typepath = owner.type //clone = new typepath(owner.loc) @@ -228,7 +255,7 @@ SM.real_name = M.real_name M.dna.transfer_identity(SM) SM.updateappearance(mutcolor_update=1) - var/mob/dead/observer/C = pick(candidates) + var/mob/dead/observer/C = pick(candies) SM.key = C.key SM.mind.enslave_mind_to_creator(M) @@ -273,7 +300,7 @@ if(21 to 39) M.nutrition = M.nutrition + (M.nutrition/5) if(40) - to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") + to_chat(M, "The synthetic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! //candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies if(41 to 69) @@ -323,6 +350,7 @@ id = "SDZF" description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" color = "#60A584" // rgb: 96, 0, 255 + metabolization_rate = 0.25 * REAGENTS_METABOLISM var/fermi_Zombie /datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. @@ -360,14 +388,18 @@ var/mob/living/simple_animal/hostile/zombie/ZI = new(get_turf(M.loc)) ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) ZI.real_name = M.real_name//Give your offspring a big old kiss. + ZI.name = M.real_name + //ZI.updateappearance(mutcolor_update=1) holder.remove_reagent("SGZF", 50) else to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") if(77 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. M.nutrition -= 100 var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") - S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - S.real_name = "rotting tumour." + S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + S.name = "Living teratoma" + S.real_name = "Living teratoma" + //S.updateappearance(mutcolor_update=1) holder.remove_reagent("SGZF", 50) M.adjustToxLoss(10, 0) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") From 2e57f4dacf2724f99fdc9a14be52ae5e931ad76b Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 24 Apr 2019 03:13:37 +0100 Subject: [PATCH 058/608] Quick test and fix --- .../reagents/chemistry/reagents/fermi_reagents.dm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 1b761341f5..c2fcf8f94a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -198,7 +198,7 @@ metabolization_rate = 0.25 * REAGENTS_METABOLISM //var/datum/status_effect/chem/SDGF/candidates/candies var/list/candies = list() - var/polling = FALSE + //var/polling = FALSE var/list/result = list() var/list/group = null @@ -226,15 +226,14 @@ /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone - if(polling == FALSE) + switch(current_cycle) + if(1) for(var/mob/dead/observer/G in GLOB.player_list) group += G for(var/m in group) var/mob/W = m message_admins("Attempting to poll") - polling = TRUE - showCandidatePollWindow(M, 20, "Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.", result, null, current_cycle, TRUE) - switch(current_cycle) + showCandidatePollWindow(M, 190, "Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.", result, null, current_cycle, TRUE) if(19) for(var/mob/W in result) if(!W.key || !W.client) From 06cabb1e0ad618f657c0bba440fed01692459e7e Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 24 Apr 2019 03:14:24 +0100 Subject: [PATCH 059/608] Who said don't commit before compile testing? --- .../reagents/chemistry/reagents/fermi_reagents.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index c2fcf8f94a..1d1dbdefd6 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -228,12 +228,12 @@ //Setup clone switch(current_cycle) if(1) - for(var/mob/dead/observer/G in GLOB.player_list) - group += G - for(var/m in group) - var/mob/W = m - message_admins("Attempting to poll") - showCandidatePollWindow(M, 190, "Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.", result, null, current_cycle, TRUE) + for(var/mob/dead/observer/G in GLOB.player_list) + group += G + for(var/m in group) + var/mob/W = m + message_admins("Attempting to poll") + showCandidatePollWindow(M, 190, "Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.", result, null, current_cycle, TRUE) if(19) for(var/mob/W in result) if(!W.key || !W.client) From 52c9a9d6805c716df4d5fce3a462202a92e08b29 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 24 Apr 2019 04:35:38 +0100 Subject: [PATCH 060/608] Fixed dumb bugs --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 1d1dbdefd6..9f13ac4d4c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -130,11 +130,9 @@ //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in switch(src.addictCyc3) if(0) - if(1) M.Jitter(100) to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the eigenstate event horizon.") if(1) - if(2) var/typepath = M.type fermi_Tclone = new typepath(M.loc) var/mob/living/carbon/C = fermi_Tclone @@ -174,7 +172,12 @@ M.Knockdown(0) to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) + M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1) + for(var/i in M.mood_events) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, i.id) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) + + if(prob(20)) do_sparks(5,FALSE,M) src.addictCyc4++ From 8525eeb2b7fa5093b309fc652da62eb7635529db Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 23 Apr 2019 21:03:39 -0700 Subject: [PATCH 061/608] holder --- .../subsystem/processing/chemistry.dm | 5 + code/modules/reagents/chemistry/holder.dm | 518 ++++++------------ tgstation.dme | 1 + 3 files changed, 183 insertions(+), 341 deletions(-) create mode 100644 code/controllers/subsystem/processing/chemistry.dm diff --git a/code/controllers/subsystem/processing/chemistry.dm b/code/controllers/subsystem/processing/chemistry.dm new file mode 100644 index 0000000000..da31d65fb3 --- /dev/null +++ b/code/controllers/subsystem/processing/chemistry.dm @@ -0,0 +1,5 @@ +PROCESSING_SUBSYSTEM_DEF(chemistry) + wait = 5 + flags = SS_KEEP_TIMING + + diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index fb14cab18f..c2a10a3be6 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -53,10 +53,6 @@ var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() var/reagents_holder_flags - var/targetVol = 0 - var/reactedVol = 0 - var/fermiIsReacting = FALSE - var/fermiReactID = null /datum/reagents/New(maximum=100) maximum_volume = maximum @@ -341,358 +337,198 @@ R.on_update (A) update_total() -/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar - if(fermiIsReacting == TRUE) - //reagents_holder_flags |= REAGENT_NOREACT unsure if this is needed - return - var/list/cached_reagents = reagent_list //a list of the reagents? - var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? - var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! - if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. - return //Yup, no reactions here. No siree. - - var/reaction_occurred = 0 // checks if reaction, binary variable - var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. - - //if(fermiIsReacting == TRUE) - /* if (reactedVol >= targetVol && targetVol != 0) - STOP_PROCESSING(SSprocessing, src) - fermiIsReacting = FALSE - message_admins("FermiChem processing stopped in reaction handler") - reaction_occurred = 1 - return - else - message_admins("FermiChem processing passed in reaction handler") - return - */ - - - do //What does do do in byond? It sounds very redundant? is it a while loop? - var/list/possible_reactions = list() //init list - reaction_occurred = 0 // sets it back to 0? - for(var/reagent in cached_reagents) //for reagent in beaker/holder - var/datum/reagent/R = reagent //check to make sure that reagent is there for the reaction list - for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id - if(!reaction) - continue - - var/datum/chemical_reaction/C = reaction - var/list/cached_required_reagents = C.required_reagents - var/total_required_reagents = cached_required_reagents.len - var/total_matching_reagents = 0 - var/list/cached_required_catalysts = C.required_catalysts - var/total_required_catalysts = cached_required_catalysts.len - var/total_matching_catalysts= 0 - var/matching_container = 0 - var/matching_other = 0 - var/required_temp = C.required_temp - var/is_cold_recipe = C.is_cold_recipe - var/meets_temp_requirement = 0 - var/has_special_react = C.special_react - var/can_special_react = 0 - - - for(var/B in cached_required_reagents) - if(!has_reagent(B, cached_required_reagents[B])) - break - total_matching_reagents++ - for(var/B in cached_required_catalysts) - if(!has_reagent(B, cached_required_catalysts[B])) - break - total_matching_catalysts++ - if(cached_my_atom) - if(!C.required_container) - matching_container = 1 +/datum/reagents/process() + var/occured = handle_reactions(TRUE) + if(!occured) + return PROCESS_KILL +/datum/reagents/proc/handle_reactions(fermi_chem_react = FALSE)//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar + if(reagents_holder_flags & REAGENT_NOREACT) + return //don't react + //cache things for performance + var/list/cached_reagents = reagent_list + var/list/cached_reactions = GLOB.chemical_reactions_list + var/datum/cached_my_atom = my_atom + var/reaction_occurred //if a reaction happened + var/list/fermichem_reacted //keeps track of fermichem reactions that already reacted to prevent it from being instant + do + var/list/possible_reactions + reaction_occurred = FALSE + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + check_possible_reaction: + for(var/reaction in cached_reactions[R.id]) + if(!reaction) + continue + var/datum/chemical_reaction/C = reaction + var/list/cached_required_reagents = C.required_reagents + var/list/cached_required_catalysts = C.required_catalysts + var/required_temp = C.required_temp + var/is_cold_recipe = C.is_cold_recipe + var/has_special_react = C.special_react + for(var/B in cached_required_reagents) + if(!has_reagent(B, cached_required_reagents[B])) + continue check_possible_reaction + for(var/B in cached_required_catalysts) + if(!has_reagent(B, cached_required_catalysts[B])) + continue check_possible_reaction + if(cached_my_atom) + if(C.required_container && C.required_container != cached_my_atom.type) + continue check_possible_reaction + if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs + continue check_possible_reaction + if(C.required_other) //Checks for other things required + if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem + var/obj/item/slime_extract/M = cached_my_atom + if(M.Uses <= 0) // added a limit to slime cores -- Muskets requested this + continue check_possible_reaction else - if(cached_my_atom.type == C.required_container)//if the suspected container is a container - matching_container = 1 - if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs - return - if(!C.required_other)//Checks for other things required - matching_other = 1//binary check passes - - else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem - var/obj/item/slime_extract/M = cached_my_atom - - if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1 - else - if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? Oh, cyro. - matching_container = 1 - if(!C.required_other) - matching_other = 1 - - //FermiChem - /* - if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! - if (C.FermiExplode == TRUE) - //To be added! - else - FermiExplode() - //explode function!! - */ - - if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! - meets_temp_requirement = 1//binary pass - - if(!has_special_react || C.check_special_react(src)) - can_special_react = 1 - - if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react) - possible_reactions += C - - if(possible_reactions.len)//does list exist? + if(C.required_container || C.required_other) + continue check_possible_reaction + if(required_temp && (is_cold_recipe? (chem_temp > required_temp) : (chem_temp < required_temp))) + continue check_possible_reaction + if(has_special_react && !C.check_special_react(src)) + continue check_possible_reaction + if(C.FermiChem) //fermichem checks + if(chem_temp < C.OptimalTempMin) //too low temperature + continue check_possible_reaction + if(LAZYACCESS(fermichem_reacted, C)) //fermichems don't keep reacting instantly + continue check_possible_reaction + START_PROCESSING(SSchemistry, src) //start processing + if(!fermi_chem_react) //only react fermichems on process icks + continue check_possible_reaction + LAZYADD(possible_reactions, C) + if(length(possible_reactions)) //does list exist? var/datum/chemical_reaction/selected_reaction = possible_reactions[1] - //select the reaction with the most extreme temperature requirements - for(var/V in possible_reactions)//why V, surely that would indicate volume? V is the reaction potential. - var/datum/chemical_reaction/competitor = V //competitor? I think this is theres two of them. Troubling..! - if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. - if(competitor.required_temp <= selected_reaction.required_temp)//only returns with lower if reaction "is cold" var. - selected_reaction = competitor - else - if(competitor.required_temp >= selected_reaction.required_temp) //will return with the hotter reacting first. - selected_reaction = competitor + for(var/I in possible_reactions) + var/datum/chemical_reaction/competitor = I + if(selected_reaction.is_cold_recipe? competitor.required_temp < selected_reaction.required_temp : competitor.required_temp > selected_reaction.required_temp) + selected_reaction = competitor var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list var/list/cached_results = selected_reaction.results//resultant chemical list - var/special_react_result = selected_reaction.check_special_react(src) - var/list/multiplier = INFINITY //Wat - - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - + var/special_react_result = selected_reaction.special_react //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. //FermiChem relies on two additional properties; pH and impurity //Temperature plays into a larger role too. //BRANCH HERE - //if(selected_reaction) - var/datum/chemical_reaction/C = selected_reaction - - if (C.FermiChem == TRUE && !continue_reacting) - message_admins("FermiChem Proc'd") - - for(var/P in selected_reaction.results) - targetVol = cached_results[P]*multiplier - message_admins("FermiChem target volume: [targetVol]") - - if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions - //if (reactedVol < targetVol) - if (fermiIsReacting == TRUE) - return 0 - else - //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) - START_PROCESSING(SSprocessing, src) - message_admins("FermiChem processing started") - fermiIsReacting = TRUE - fermiReactID = selected_reaction - reaction_occurred = 1 - //else - // fermiIsReacting = FALSE - // STOP_PROCESSING(SSfastprocess, src) - else - return 0 - - - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log - - //Standard reaction mechanics: - else - - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - + var/multiplier = INFINITY //the multiplier of the stnadard "1 reaction" we managed to do this cycle + if(!selected_reaction.FermiChem) //it's a normal ss13 chem reaction, instant reactions. for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) //cap by the multiplier of the required you can get out of this + //remove reactants + for(var/B in cached_required_reagents) + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = TRUE) + //add products + for(var/P in cached_results) multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log - add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P] * multiplier, P) + add_reagent(P, cached_results[P]*multiplier, null, chem_temp) + else //FermiiiCheeeem! + //FERMICHEM BEGIN + //--CHECKS + message_admins("FermiChem Proc'd") + var/target_volume = 0 + for(var/result_id in cached_results) + target_volume += multiplier * cached_results[result_id] + message_admins("FermiChem target volume: [target_volume]") + //--PROCESS + message_admins("FermiChem processing started") + //--REACTION + //set up fermichem variables + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmount = 0 + var/purity = 1 + //For now, purity is handled elsewhere + //check extremes first + if(chem_temp > selected_reaction.ExplodeTemp) + FermiExplode(selected_reaction) + else if(!ISINRANGE(pH, 0, 14)) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + FermiExplode() + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < selected_reaction.OptimalTempMax && chem_temp >= selected_reaction.OptimalTempMin) + deltaT = (((selected_reaction.OptimalTempMin - chem_temp)**selected_reaction.CurveSharpT)/((selected_reaction.OptimalTempMax - selected_reaction.OptimalTempMin)**selected_reaction.CurveSharpT)) + else if (chem_temp >= selected_reaction.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + message_admins("calculating temperature factor, min: [selected_reaction.OptimalTempMin], max: [selected_reaction.OptimalTempMax], Exponential: [selected_reaction.CurveSharpT], deltaT: [deltaT]") + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < selected_reaction.OptimalpHMin) + if (pH < (selected_reaction.OptimalpHMin - selected_reaction.ReactpHLim)) + deltapH = 0 + else + deltapH = (((pH - (selected_reaction.OptimalpHMin - selected_reaction.ReactpHLim))**selected_reaction.CurveSharppH)/(selected_reaction.ReactpHLim**selected_reaction.CurveSharppH)) + //Upper range + else if (pH > selected_reaction.OptimalpHMin) + if (pH > (selected_reaction.OptimalpHMin + selected_reaction.ReactpHLim)) + deltapH = 0 + else + deltapH = ((selected_reaction.ReactpHLim -(pH - (selected_reaction.OptimalpHMax + selected_reaction.ReactpHLim))+selected_reaction.ReactpHLim)/(selected_reaction.ReactpHLim**selected_reaction.CurveSharppH)) + //Within mid range + else if (pH >= selected_reaction.OptimalpHMin && pH <= selected_reaction.OptimalpHMax) + deltapH = 1 + //This should never proc: + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[selected_reaction.id]' which broke for some reason! ([usr])") + //TODO Add CatalystFact + message_admins("calculating pH factor(purity), pH: [pH], min: [selected_reaction.OptimalpHMin]-[selected_reaction.ReactpHLim], max: [selected_reaction.OptimalpHMax]+[selected_reaction.ReactpHLim], deltapH: [deltapH]") + stepChemAmount = target_volume * deltaT + if (stepChemAmount > selected_reaction.RateUpLim) + stepChemAmount = selected_reaction.RateUpLim + else if (stepChemAmount <= 0.01) + message_admins("stepChem underflow [stepChemAmount]") + stepChemAmount = 0.02 + purity = deltapH + message_admins("cached_results: [cached_results], stepChemAmount [stepChemAmount]") + if(stepChemAmount > multiplier) //too much + message_admins("stepChemAmount was over multiplier for some reason..?") + for(var/B in cached_required_reagents) + message_admins("cached_required_reagents(B): [cached_required_reagents[B]], base stepChemAmount [stepChemAmount]") + remove_reagent(B, (stepChemAmount * cached_required_reagents[B]), safety = TRUE)//safety? removes reagents from beaker using remove function. + for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? + //reactedVol = max(reactedVol, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmount, P)//log + add_reagent(P, cached_results[P] * stepChemAmount, null, chem_temp)//add reagent function!! I THINK I can do this: + message_admins("purity: [purity], purity of beaker") + message_admins("Temp before change: [chem_temp], pH after change: [pH]") + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (selected_reaction.ThermicConstant * stepChemAmount) + pH += (selected_reaction.HIonRelease * stepChemAmount) + message_admins("Temp after change: [chem_temp], pH after change: [pH]") + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", multiplier, selected_reaction.id)//log + //ensure the same thing doesn't happen in the same tick + LAZYSET(fermichem_reacted, selected_reaction, TRUE) + //FERMICHEM END + //reaction is done, do the effects. + var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers + var/iconhtml = icon2html(cached_my_atom, seen) + if(cached_my_atom) + if(!ismob(cached_my_atom)) // No bubbling mobs + if(selected_reaction.mix_sound) + playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) - var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers - var/iconhtml = icon2html(cached_my_atom, seen) - if(cached_my_atom) - if(!ismob(cached_my_atom)) // No bubbling mobs - if(selected_reaction.mix_sound) - playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. + var/obj/item/slime_extract/ME2 = my_atom + ME2.Uses-- + if(ME2.Uses <= 0) // give the notification that the slime core is dead for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") - - if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." - - selected_reaction.on_reaction(src, multiplier, special_react_result) - reaction_occurred = 1 - continue_reacting = TRUE - - while(reaction_occurred)//while do nothing? - update_total()//Don't know waht this does. - return 0//end! - -/datum/reagents/process() - var/datum/chemical_reaction/C = fermiReactID - var/list/cached_required_reagents = C.required_reagents//update reagents list - var/list/cached_results = C.results//resultant chemical list - var/multiplier = INFINITY - - message_admins("updating targetVol from [targetVol]") - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) - if (multiplier == 0) - STOP_PROCESSING(SSprocessing, src) - fermiIsReacting = FALSE - message_admins("FermiChem STOPPED due to reactant removal! Reacted vol: [reactedVol] of [targetVol]") - reactedVol = 0 - targetVol = 0 - handle_reactions() - update_total() - return - for(var/P in cached_results) - targetVol = cached_results[P]*multiplier - - message_admins("to [targetVol]") - - if (fermiIsReacting == FALSE) - message_admins("THIS SHOULD NEVER APPEAR!") - - if (chem_temp > C.OptimalTempMin && fermiIsReacting == TRUE)//To prevent pointless reactions - if (reactedVol < targetVol) - reactedVol = FermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results) - message_admins("FermiChem tick activated started, Reacted vol: [reactedVol] of [targetVol]") - else - STOP_PROCESSING(SSprocessing, src) - fermiIsReacting = FALSE - message_admins("FermiChem STOPPED due to volume reached! Reacted vol: [reactedVol] of [targetVol]") - reactedVol = 0 - targetVol = 0 - handle_reactions() - update_total() - return - else - STOP_PROCESSING(SSprocessing, src) - message_admins("FermiChem STOPPED due to temperature! Reacted vol: [reactedVol] of [targetVol]") - fermiIsReacting = FALSE - reactedVol = 0 - targetVol = 0 - handle_reactions() - update_total() - return - - //handle_reactions() - -/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results) - var/datum/chemical_reaction/C = selected_reaction - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmmount = 0 - //var/ammoReacted = 0 - //get purity from combined beaker reactant purities HERE. - var/purity = 1 - //var/tempVol = totalVol - - message_admins("Loop beginning") - //Begin Parse - - //Check extremes first - if (chem_temp > C.ExplodeTemp) - //go to explode proc - message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") - FermiExplode() - - if (pH > 14 || pH < 0) - //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - message_admins("pH is lover limit, cur pH: [pH]") - FermiExplode() - - //For now, purity is handled elsewhere - - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) - else if (chem_temp >= C.OptimalTempMax) - deltaT = 1 - else - deltaT = 0 - message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") - - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < C.OptimalpHMin) - if (pH < (C.OptimalpHMin - C.ReactpHLim)) - deltapH = 0 - else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) - //Upper range - else if (pH > C.OptimalpHMin) - if (pH > (C.OptimalpHMin + C.ReactpHLim)) - deltapH = 0 - else - deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) - //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) - deltapH = 1 - //This should never proc: - else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") - WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") - //TODO Add CatalystFact - message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") - - stepChemAmmount = targetVol * deltaT - if (stepChemAmmount > C.RateUpLim) - stepChemAmmount = C.RateUpLim - else if (stepChemAmmount <= 0.01) - message_admins("stepChem underflow [stepChemAmmount]") - stepChemAmmount = 0.02 - - if ((reactedVol + stepChemAmmount) > targetVol) - stepChemAmmount = targetVol - reactedVol - message_admins("target volume reached. Reaction should stop after this loop. stepChemAmmount: [stepChemAmmount] + reactedVol: [reactedVol] = targetVol [targetVol]") - - if (reactedVol > 0) - purity = ((purity * reactedVol) + (deltapH * stepChemAmmount)) /((reactedVol+ stepChemAmmount)) //This should add the purity to the product - else - purity = deltapH - - // End. - /* - for(var/B in cached_required_reagents) // - tempVol = min(reactedVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - */ - message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]") - - - - for(var/B in cached_required_reagents) - message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]") - remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - - for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? - //reactedVol = max(reactedVol, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: - - message_admins("purity: [purity], purity of beaker") - message_admins("Temp before change: [chem_temp], pH after change: [pH]") - //Apply pH changes and thermal output of reaction to beaker - chem_temp += (C.ThermicConstant * stepChemAmmount) - pH += (C.HIonRelease * stepChemAmmount) - message_admins("Temp after change: [chem_temp], pH after change: [pH]") - - - reactedVol = reactedVol + stepChemAmmount - - - return (reactedVol) + to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") + ME2.name = "used slime extract" + ME2.desc = "This extract has been used up." + selected_reaction.on_reaction(src, multiplier, special_react_result) + reaction_occurred = TRUE + while(reaction_occurred) + update_total() + return reaction_occurred /datum/reagents/proc/FermiExplode() return diff --git a/tgstation.dme b/tgstation.dme index 1610d0354d..59e73f45d8 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -274,6 +274,7 @@ #include "code\controllers\subsystem\vore.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" +#include "code\controllers\subsystem\processing\chemistry.dm" #include "code\controllers\subsystem\processing\circuit.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\fields.dm" From b21599a151e7ae34ccdf653068b389d578911f1a Mon Sep 17 00:00:00 2001 From: Thalpy <33956696+Thalpy@users.noreply.github.com> Date: Wed, 24 Apr 2019 17:35:07 +0100 Subject: [PATCH 062/608] Don't overwrite admins --- config/admins.txt | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 config/admins.txt diff --git a/config/admins.txt b/config/admins.txt deleted file mode 100644 index ff2d1362e0..0000000000 --- a/config/admins.txt +++ /dev/null @@ -1,12 +0,0 @@ -############################################################################################### -# Basically, ckey goes first. Rank goes after the "=" # -# Case is not important for ckey. # -# Case IS important for the rank. # -# All punctuation (spaces etc) EXCEPT '-', '_' and '@' will be stripped from rank names. # -# Ranks can be anything defined in admin_ranks.txt # -# NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn # -# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # -############################################################################################### - -yourckeygoeshere = Host -Useroth = Game Master From 5430a9b673121e7dc7b688dba9ad5f12f26e046b Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 24 Apr 2019 20:15:01 -0700 Subject: [PATCH 063/608] damnit --- code/modules/reagents/chemistry/holder.dm | 89 ++++++++++++----------- 1 file changed, 48 insertions(+), 41 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index c2a10a3be6..f68f51999f 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -343,6 +343,7 @@ return PROCESS_KILL /datum/reagents/proc/handle_reactions(fermi_chem_react = FALSE)//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar + return if(reagents_holder_flags & REAGENT_NOREACT) return //don't react //cache things for performance @@ -356,48 +357,54 @@ reaction_occurred = FALSE for(var/reagent in cached_reagents) var/datum/reagent/R = reagent - check_possible_reaction: - for(var/reaction in cached_reactions[R.id]) - if(!reaction) + for(var/reaction in cached_reactions[R.id]) + if(!reaction) + continue + var/datum/chemical_reaction/C = reaction + var/list/cached_required_reagents = C.required_reagents + var/list/cached_required_catalysts = C.required_catalysts + var/required_temp = C.required_temp + var/is_cold_recipe = C.is_cold_recipe + var/has_special_react = C.special_react + var/fail = FALSE + for(var/B in cached_required_reagents) + if(!has_reagent(B, cached_required_reagents[B])) + fail = TRUE + break + if(fail) + continue + for(var/B in cached_required_catalysts) + if(!has_reagent(B, cached_required_catalysts[B])) + fail = TRUE + break + if(fail) + continue + if(cached_my_atom) + if(C.required_container && C.required_container != cached_my_atom.type) continue - var/datum/chemical_reaction/C = reaction - var/list/cached_required_reagents = C.required_reagents - var/list/cached_required_catalysts = C.required_catalysts - var/required_temp = C.required_temp - var/is_cold_recipe = C.is_cold_recipe - var/has_special_react = C.special_react - for(var/B in cached_required_reagents) - if(!has_reagent(B, cached_required_reagents[B])) - continue check_possible_reaction - for(var/B in cached_required_catalysts) - if(!has_reagent(B, cached_required_catalysts[B])) - continue check_possible_reaction - if(cached_my_atom) - if(C.required_container && C.required_container != cached_my_atom.type) - continue check_possible_reaction - if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs - continue check_possible_reaction - if(C.required_other) //Checks for other things required - if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem - var/obj/item/slime_extract/M = cached_my_atom - if(M.Uses <= 0) // added a limit to slime cores -- Muskets requested this - continue check_possible_reaction - else - if(C.required_container || C.required_other) - continue check_possible_reaction - if(required_temp && (is_cold_recipe? (chem_temp > required_temp) : (chem_temp < required_temp))) - continue check_possible_reaction - if(has_special_react && !C.check_special_react(src)) - continue check_possible_reaction - if(C.FermiChem) //fermichem checks - if(chem_temp < C.OptimalTempMin) //too low temperature - continue check_possible_reaction - if(LAZYACCESS(fermichem_reacted, C)) //fermichems don't keep reacting instantly - continue check_possible_reaction - START_PROCESSING(SSchemistry, src) //start processing - if(!fermi_chem_react) //only react fermichems on process icks - continue check_possible_reaction - LAZYADD(possible_reactions, C) + if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs + continue + if(C.required_other) //Checks for other things required + if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem + var/obj/item/slime_extract/M = cached_my_atom + if(M.Uses <= 0) // added a limit to slime cores -- Muskets requested this + continue + else + if(C.required_container || C.required_other) + continue + if(required_temp && (is_cold_recipe? (chem_temp > required_temp) : (chem_temp < required_temp))) + continue + if(has_special_react && !C.check_special_react(src)) + continue + if(C.FermiChem) //fermichem checks + if(chem_temp < C.OptimalTempMin) //too low temperature + continue + if(LAZYACCESS(fermichem_reacted, C)) //fermichems don't keep reacting instantly + continue + START_PROCESSING(SSchemistry, src) //start processing + if(!fermi_chem_react) //only react fermichems on process icks + continue + LAZYADD(possible_reactions, C) if(length(possible_reactions)) //does list exist? var/datum/chemical_reaction/selected_reaction = possible_reactions[1] for(var/I in possible_reactions) From 2a412ad9b53f95cf3fa7e234700d8eeb8c7e9bd9 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 26 Apr 2019 03:05:44 +0100 Subject: [PATCH 064/608] Fixed a few bugs in SGDF and Eigen. Added more function to BElarger --- .../chemistry/reagents/fermi_reagents.dm | 75 +++++++++++++------ 1 file changed, 53 insertions(+), 22 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 9f13ac4d4c..e308b966ad 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -95,7 +95,7 @@ do_sparks(5,FALSE,src) do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) - holder.remove_reagent("eigenstate",0.5)//So you're not stuck for 10 minutes teleporting + holder.remove_reagent("eigenstate", 0.5, FALSE)//So you're not stuck for 10 minutes teleporting ..() //loop function @@ -172,9 +172,9 @@ M.Knockdown(0) to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) - M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1) - for(var/i in M.mood_events) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, i.id) + M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) + for(var/datum/mood_event/i) + clear_event(null, i) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) @@ -230,6 +230,7 @@ /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone switch(current_cycle) + /* if(1) for(var/mob/dead/observer/G in GLOB.player_list) group += G @@ -242,6 +243,8 @@ if(!W.key || !W.client) result -= W candies = result + */ + candies = pollGhostCandidates() if(20 to INFINITY) message_admins("Number of candidates [LAZYLEN(candies)]") if(LAZYLEN(candies) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! @@ -285,39 +288,41 @@ message_admins("Failed to find clone Candidate") src.unitCheck = TRUE if(M.has_status_effect(/datum/status_effect/chem/SGDF)) // Heal the user if they went to all this trouble to make it and can't get a clone, the poor fellow. - to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). - M.adjustCloneLoss(-2, 0) - M.adjustBruteLoss(-2, 0) - M.adjustFireLoss(-2, 0) - M.heal_bodypart_damage(1,1) - M.remove_trait(TRAIT_DISFIGURED, TRAIT_GENERIC) + switch(current_cycle) + if(21) + to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). + M.remove_trait(TRAIT_DISFIGURED, TRAIT_GENERIC) + M.adjustCloneLoss(-1, 0) + M.adjustBruteLoss(-1, 0) + M.adjustFireLoss(-1, 0) + M.heal_bodypart_damage(1,1) else //If there's no ghosts, but they've made a large amount, then proceed to make flavourful clone, where you become fat and useless until you split. switch(current_cycle) - if(10) + if(21) to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") - if(11 to 19) + if(21 to 29) M.nutrition = M.nutrition + (M.nutrition/10) - if(20) + if(30) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") - if(21 to 39) + if(30 to 49) M.nutrition = M.nutrition + (M.nutrition/5) - if(40) + if(50) to_chat(M, "The synthetic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! //candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies - if(41 to 69) + if(50 to 79) M.nutrition = M.nutrition + (M.nutrition/2) - if(70) + if(80) to_chat(M, "The cells begin to precipitate outwards of your body, you feel like you'll split soon...") if (M.nutrition < 20000) M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI - if(76)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. + if(86)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE M.next_move_modifier = 1 to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) - if(77 to INFINITY) - holder.remove_reagent("SGDF", 1)//removes SGDF on completion. + if(87 to INFINITY) + holder.remove_reagent("SGDF", 1, FALSE)//removes SGDF on completion. message_admins("Purging SGDF [volume]") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") @@ -392,7 +397,7 @@ ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name //ZI.updateappearance(mutcolor_update=1) - holder.remove_reagent("SGZF", 50) + holder.remove_reagent("SGZF", 50, FALSE) else to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") if(77 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. @@ -402,7 +407,7 @@ S.name = "Living teratoma" S.real_name = "Living teratoma" //S.updateappearance(mutcolor_update=1) - holder.remove_reagent("SGZF", 50) + holder.remove_reagent("SGZF", 50, FALSE) M.adjustToxLoss(10, 0) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") @@ -417,6 +422,32 @@ color = "#60A584" // rgb: 96, 0, 255 overdose_threshold = 12 +/datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size + if(!M.getorganslot("breasts")) + var/obj/item/organ/genital/breasts/B = new + B.insert(M) + if(B) + if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) + B.color = skintone2hex(skin_tone) + else + B.color = "#[dna.features["breasts_color"]]" + B.size = 0 + B.update() + to_chat(user, "Your chest feels warm, tingling with newfound sensitivity.") + else + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + B.size += 0.1 + if (B.size > 8.5) + to_chat(user, "Your breasts begin to strain against your clothes tightly!") + M.adjustOxyLoss(10, 0) + M.adjustBruteLoss(2, 0) + if B.size > 9 + M.adjustOxyLoss(-50, 0) + to_chat(user, "Your clothes give, ripping into peices under the strain of your swelling breasts!") + playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + + + /datum/reagent/fermi/BElarger/overdose_start(mob/living/M) //Turns you into a female if male and ODing if(M.gender == MALE) M.gender = FEMALE From e6e5866677bb9145f8f4cafb81413c9bcdfd7b46 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 26 Apr 2019 04:18:29 +0100 Subject: [PATCH 065/608] Futher functionality to BElarger --- .../code/modules/arousal/organs/breasts.dm | 4 +- .../chemistry/reagents/fermi_reagents.dm | 39 +++++++++++++++---- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index a9e8744975..ab0e8023c1 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -44,8 +44,10 @@ desc = "You see a pair of breasts." else desc = "You see some breasts, they seem to be quite exotic." - if (size) + if (size <= 8.5) desc += " You estimate that they're [uppertext(size)]-cups." + else if (size > 8.5) + B.desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [B.size]cm in diameter." else desc += " You wouldn't measure them in cup sizes." if(producing && aroused_state) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index e308b966ad..4d9a1d360c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -29,7 +29,7 @@ name = "Eigenstasium" id = "eigenstate" description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" - taste_description = "." + taste_description = "wiggly" color = "#60A584" // rgb: 96, 0, 255 overdose_threshold = 15 addiction_threshold = 20 @@ -308,7 +308,7 @@ M.nutrition = M.nutrition + (M.nutrition/5) if(50) to_chat(M, "The synthetic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") - M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! + M.next_move_modifier += 4//If this makes you fast then please fix it, it should make you slow!! //candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies if(50 to 79) M.nutrition = M.nutrition + (M.nutrition/2) @@ -318,7 +318,7 @@ M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI if(86)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE - M.next_move_modifier = 1 + M.next_move_modifier -= 4 to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) if(87 to INFINITY) @@ -419,8 +419,13 @@ name = "Sucubus Draft" id = "BEenlager" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." - color = "#60A584" // rgb: 96, 0, 255 + color = "#E60584" // rgb: 96, 0, 255 overdose_threshold = 12 + var/obj/item/organ/genital/penis/B = M.getorganslot("breasts") + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") + var/obj/item/organ/genital/penis/T = M.getorganslot("testicles") + var/obj/item/organ/genital/penis/V = M.getorganslot("vagina") + var/obj/item/organ/genital/penis/W = M.getorganslot("womb") /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size if(!M.getorganslot("breasts")) @@ -443,16 +448,36 @@ M.adjustBruteLoss(2, 0) if B.size > 9 M.adjustOxyLoss(-50, 0) - to_chat(user, "Your clothes give, ripping into peices under the strain of your swelling breasts!") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts!") playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - + M.physical/speed += 0.1//big breasts are cumbersome + M.next_move_modifier += 0.1 + ..() -/datum/reagent/fermi/BElarger/overdose_start(mob/living/M) //Turns you into a female if male and ODing + +/datum/reagent/fermi/BElarger/overdose_start(mob/living/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. if(M.gender == MALE) M.gender = FEMALE M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") + if(P) + P.size -= 0.2 + if (P.size < 0.5) + to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") + qdel(P) + if(T) + if (P.size < 0.5 || !P) + qdel(T) + if(!V) + var/obj/item/organ/genital/vagina/V = new + V.Insert(M) + if(!W) + var/obj/item/organ/genital/womb/W = new + W.Insert(M) + update() + + if(M.gender == FEMALE) M.gender = MALE M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") From bc7b3e4d9524c911bd4159f1f6a374ac845a1972 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 26 Apr 2019 08:37:51 +0100 Subject: [PATCH 066/608] BE and PE chems added. --- .../code/modules/arousal/organs/breasts.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 168 +++++++++++++----- 2 files changed, 121 insertions(+), 49 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index ab0e8023c1..19f6fee319 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -47,7 +47,7 @@ if (size <= 8.5) desc += " You estimate that they're [uppertext(size)]-cups." else if (size > 8.5) - B.desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [B.size]cm in diameter." + desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [B.size]cm in diameter." else desc += " You wouldn't measure them in cup sizes." if(producing && aroused_state) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 4d9a1d360c..35e8e702eb 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -173,8 +173,8 @@ to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) - for(var/datum/mood_event/i) - clear_event(null, i) + for (var/datum/mood_event/i in M) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, i) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) @@ -230,8 +230,8 @@ /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone switch(current_cycle) - /* if(1) + /* for(var/mob/dead/observer/G in GLOB.player_list) group += G for(var/m in group) @@ -244,7 +244,7 @@ result -= W candies = result */ - candies = pollGhostCandidates() + candies = pollGhostCandidates() if(20 to INFINITY) message_admins("Number of candidates [LAZYLEN(candies)]") if(LAZYLEN(candies) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! @@ -358,31 +358,30 @@ description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" color = "#60A584" // rgb: 96, 0, 255 metabolization_rate = 0.25 * REAGENTS_METABOLISM - var/fermi_Zombie /datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. message_admins("SGZF ingested") switch(current_cycle)//Pretends to be normal - if(10) - to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") - if(11 to 19) - M.nutrition = M.nutrition + (M.nutrition/10) if(20) + to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") + if(21 to 29) + M.nutrition = M.nutrition + (M.nutrition/10) + if(30) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") - if(21 to 39) + if(31 to 49) M.nutrition = M.nutrition + (M.nutrition/5) - if(40) + if(50) to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! - if(41 to 63) + if(51 to 73) M.nutrition = M.nutrition + (M.nutrition/2) - if(64) + if(74) to_chat(M, "The cells begin to precipitate outwards of your body, but... something is wrong, the sythetic cells are beginnning to rot...") if (M.nutrition < 20000) M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI - if(65 to 75) + if(75 to 85) M.adjustToxLoss(1, 0)// the warning! - if(76) + if(86) if (!holder.has_reagent("pen_acid"))//Counterplay is pent.) message_admins("Zombie spawned at [M.loc]") M.nutrition -= 18500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE @@ -391,7 +390,6 @@ M.visible_message("[M] suddenly shudders, and splits into a funky smelling copy of themselves!") M.emote("scream") M.adjustToxLoss(30, 0) - //fermi_Zombie = new typepath(M.loc) var/mob/living/simple_animal/hostile/zombie/ZI = new(get_turf(M.loc)) ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) ZI.real_name = M.real_name//Give your offspring a big old kiss. @@ -414,49 +412,54 @@ ..() -//Breast englargement -/datum/reagent/fermi/BElarger +//breast englargement +//Honestly the most requested chems +/datum/reagent/fermi/BElarger() name = "Sucubus Draft" id = "BEenlager" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." color = "#E60584" // rgb: 96, 0, 255 + taste_description = "melted ice cream" overdose_threshold = 12 - var/obj/item/organ/genital/penis/B = M.getorganslot("breasts") + var/mob/living/carbon/M + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") var/obj/item/organ/genital/penis/P = M.getorganslot("penis") - var/obj/item/organ/genital/penis/T = M.getorganslot("testicles") - var/obj/item/organ/genital/penis/V = M.getorganslot("vagina") - var/obj/item/organ/genital/penis/W = M.getorganslot("womb") + var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") + var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") + var/obj/item/organ/genital/womb/W = M.getorganslot("womb") + var/mob/living/carbon/human/H = M /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size - if(!M.getorganslot("breasts")) - var/obj/item/organ/genital/breasts/B = new - B.insert(M) - if(B) + if(!M.getorganslot("breasts")) //If they don't have breasts, give them breasts. + var/obj/item/organ/genital/breasts/nB = new + nB.Insert(M) + if(nB) if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) - B.color = skintone2hex(skin_tone) + nB.color = skintone2hex(M.skin_tone) else - B.color = "#[dna.features["breasts_color"]]" - B.size = 0 - B.update() - to_chat(user, "Your chest feels warm, tingling with newfound sensitivity.") - else - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + nB.color = "#[M.dna.features["breasts_color"]]" + nB.size = 0 + to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") + B = nB + else //If they have them, increase size. If size is comically big, limit movement and rip clothes. B.size += 0.1 if (B.size > 8.5) - to_chat(user, "Your breasts begin to strain against your clothes tightly!") + to_chat(M, "Your breasts begin to strain against your clothes tightly!") M.adjustOxyLoss(10, 0) M.adjustBruteLoss(2, 0) - if B.size > 9 - M.adjustOxyLoss(-50, 0) - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts!") - playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + if (B.size > (9 + M.armour)) + M.adjustOxyLoss((-50 - (M.armour * 10)), 0) + if(H.w_uniform || H.wear_suit) + M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + M.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) M.physical/speed += 0.1//big breasts are cumbersome M.next_move_modifier += 0.1 - ..() + M.update() + ..() - - -/datum/reagent/fermi/BElarger/overdose_start(mob/living/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. +/datum/reagent/fermi/BElarger/overdose_start(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. if(M.gender == MALE) M.gender = FEMALE M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") @@ -466,21 +469,90 @@ if (P.size < 0.5) to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") qdel(P) + else if (P.size > (9 + M.armour)) + M.physical/speed -= 0.1//Liberation from comical size + M.next_move_modifier -= 0.1 + M.no_equip -= list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + + if(T) - if (P.size < 0.5 || !P) + if (P.size < 0.1 || !P) qdel(T) if(!V) - var/obj/item/organ/genital/vagina/V = new - V.Insert(M) + var/obj/item/organ/genital/vagina/nV = new + nV.Insert(M) if(!W) - var/obj/item/organ/genital/womb/W = new - W.Insert(M) - update() + var/obj/item/organ/genital/womb/nW = new + nW.Insert(M) + M.update() + ..() +/datum/reagent/fermi/PElarger() // Due to popular demand...! + name = "Bluespace Viagra" + id = "PElarger" + description = "A volatile collodial mixture derived from toxic masculinity that encourages a larger gentleman's package via a potent testosterone mix." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? + color = "#E60584" // rgb: 96, 0, 255 + taste_description = "meaty oil" + overdose_threshold = 12 + var/mob/living/carbon/M + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") + var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") + var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") + var/obj/item/organ/genital/womb/W = M.getorganslot("womb") + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + var/mob/living/carbon/human/H = M + +/datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size + if(!M.getorganslot("penis")) + var/obj/item/organ/genital/penis/nP = new + nP.Insert(M) + if(nP) + if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) + nP.color = skintone2hex(M.skin_tone) + else + nP.color = "#[M.dna.features["cock_color"]]" + nP.size = 0 + to_chat(M, "Your groin feels warm, as you feel a new bulge down below.") + P = nP + else + var/obj/item/organ/genital/penis/P = M.getorganslot("breasts") + P.size += 0.1 + if (P.size > 8.5) + to_chat(M, "Your cock begin to strain against your clothes tightly!") + M.adjustBruteLoss(5, 0) + if (P.size > (9 + M.armour)) + if(H.w_uniform || H.wear_suit) + M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") + playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + M.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + M.physical/speed += 0.1//big breasts are cumbersome + M.next_move_modifier += 0.1 + M.update() + ..() + +/datum/reagent/fermi/PElarger/overdose_start(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. if(M.gender == FEMALE) M.gender = MALE M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") + + if(!P) + var/obj/item/organ/genital/penis/nP = new + nP.Insert(M) + if(!T) + var/obj/item/organ/genital/testicles/nT = new + nT.Insert(M) + M.update() + ..() + + + + if(B) + B.size -= 0.2 + if (B.size < 0.1) + to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") + qdel(B) /* //Nanite removal /datum/reagent/fermi/naninte_b_gone From 207b606f75985cd060c79a6e1ac311c02654e162 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 26 Apr 2019 10:01:14 +0100 Subject: [PATCH 067/608] Fixing compiling errors. 3 majors ones remain. --- .../code/modules/arousal/organs/breasts.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 55 ++++++++++++------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 19f6fee319..e9ab51baa7 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -47,7 +47,7 @@ if (size <= 8.5) desc += " You estimate that they're [uppertext(size)]-cups." else if (size > 8.5) - desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [B.size]cm in diameter." + desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." else desc += " You wouldn't measure them in cup sizes." if(producing && aroused_state) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 35e8e702eb..0b4343ac8d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -292,10 +292,11 @@ if(21) to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). M.remove_trait(TRAIT_DISFIGURED, TRAIT_GENERIC) - M.adjustCloneLoss(-1, 0) - M.adjustBruteLoss(-1, 0) - M.adjustFireLoss(-1, 0) - M.heal_bodypart_damage(1,1) + if(22 to INFINITY) + M.adjustCloneLoss(-1, 0) + M.adjustBruteLoss(-1, 0) + M.adjustFireLoss(-1, 0) + M.heal_bodypart_damage(1,1) else //If there's no ghosts, but they've made a large amount, then proceed to make flavourful clone, where you become fat and useless until you split. switch(current_cycle) if(21) @@ -414,7 +415,7 @@ //breast englargement //Honestly the most requested chems -/datum/reagent/fermi/BElarger() +/datum/reagent/fermi/BElarger name = "Sucubus Draft" id = "BEenlager" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." @@ -422,12 +423,14 @@ taste_description = "melted ice cream" overdose_threshold = 12 var/mob/living/carbon/M + var/mob/living/carbon/human/H = M + var/species/S var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") var/obj/item/organ/genital/penis/P = M.getorganslot("penis") var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") var/obj/item/organ/genital/womb/W = M.getorganslot("womb") - var/mob/living/carbon/human/H = M + /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size if(!M.getorganslot("breasts")) //If they don't have breasts, give them breasts. @@ -435,7 +438,7 @@ nB.Insert(M) if(nB) if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) - nB.color = skintone2hex(M.skin_tone) + nB.color = skintone2hex(H.skin_tone) else nB.color = "#[M.dna.features["breasts_color"]]" nB.size = 0 @@ -447,14 +450,14 @@ to_chat(M, "Your breasts begin to strain against your clothes tightly!") M.adjustOxyLoss(10, 0) M.adjustBruteLoss(2, 0) - if (B.size > (9 + M.armour)) - M.adjustOxyLoss((-50 - (M.armour * 10)), 0) + if (B.size > 9) + //M.adjustOxyLoss((-50, 0) if(H.w_uniform || H.wear_suit) M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - M.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - M.physical/speed += 0.1//big breasts are cumbersome + S.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + M.physical.speed += 0.1//big breasts are cumbersome M.next_move_modifier += 0.1 M.update() ..() @@ -469,10 +472,10 @@ if (P.size < 0.5) to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") qdel(P) - else if (P.size > (9 + M.armour)) - M.physical/speed -= 0.1//Liberation from comical size + else if (P.size > 9 ) + M.physical.speed -= 0.1//Liberation from comical size M.next_move_modifier -= 0.1 - M.no_equip -= list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + S.no_equip -= list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) if(T) @@ -487,7 +490,7 @@ M.update() ..() -/datum/reagent/fermi/PElarger() // Due to popular demand...! +/datum/reagent/fermi/PElarger // Due to popular demand...! name = "Bluespace Viagra" id = "PElarger" description = "A volatile collodial mixture derived from toxic masculinity that encourages a larger gentleman's package via a potent testosterone mix." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? @@ -495,6 +498,7 @@ taste_description = "meaty oil" overdose_threshold = 12 var/mob/living/carbon/M + var/species/S var/obj/item/organ/genital/penis/P = M.getorganslot("penis") var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") @@ -507,26 +511,25 @@ var/obj/item/organ/genital/penis/nP = new nP.Insert(M) if(nP) - if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) - nP.color = skintone2hex(M.skin_tone) + if(M.dna.species.use_skintones && H.dna.features["genitals_use_skintone"]) + nP.color = skintone2hex(H.skin_tone) else nP.color = "#[M.dna.features["cock_color"]]" nP.size = 0 to_chat(M, "Your groin feels warm, as you feel a new bulge down below.") P = nP else - var/obj/item/organ/genital/penis/P = M.getorganslot("breasts") P.size += 0.1 if (P.size > 8.5) to_chat(M, "Your cock begin to strain against your clothes tightly!") M.adjustBruteLoss(5, 0) - if (P.size > (9 + M.armour)) + if (P.size > 9) if(H.w_uniform || H.wear_suit) M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - M.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - M.physical/speed += 0.1//big breasts are cumbersome + S.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + M.physical.speed += 0.1//big breasts are cumbersome M.next_move_modifier += 0.1 M.update() ..() @@ -553,6 +556,16 @@ if (B.size < 0.1) to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") qdel(B) + + +/* +/mob/living/simple_animal/hostile/retaliate/ghost +incorporeal_move = 1 +name +alpha = 20 +reduce viewrange? +*/ + /* //Nanite removal /datum/reagent/fermi/naninte_b_gone From b10bf5b69fc945db07084d0d0f52ec9670df45ad Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 27 Apr 2019 05:01:14 +0100 Subject: [PATCH 068/608] Futher fixing to PE and BE chems --- .../code/modules/arousal/organs/breasts.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 126 +++++++++++------- 2 files changed, 80 insertions(+), 48 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index e9ab51baa7..b17cb9be72 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -44,7 +44,7 @@ desc = "You see a pair of breasts." else desc = "You see some breasts, they seem to be quite exotic." - if (size <= 8.5) + if (size >= 8.5) desc += " You estimate that they're [uppertext(size)]-cups." else if (size > 8.5) desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 0b4343ac8d..840e3be877 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -217,7 +217,8 @@ */ /datum/reagent/fermi/proc/sepPoll() var/list/procCandies = list() - procCandies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 20) // see poll_ignore.dm, should allow admins to ban greifers or bullies + procCandies = pollGhostCandidates(, "FermiClone", null, ROLE_SENTIENCE, 20) // see poll_ignore.dm, should allow admins to ban greifers or bullies + sleep return procCandies /*if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. @@ -231,6 +232,8 @@ //Setup clone switch(current_cycle) if(1) + candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") + sleep(300) /* for(var/mob/dead/observer/G in GLOB.player_list) group += G @@ -244,7 +247,8 @@ result -= W candies = result */ - candies = pollGhostCandidates() + + if(20 to INFINITY) message_admins("Number of candidates [LAZYLEN(candies)]") if(LAZYLEN(candies) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! @@ -279,6 +283,7 @@ M.next_move_modifier = 1 M.nutrition = 150 + holder.remove_reagent("SGDF", 999, FALSE) //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? //after_success(user, SM) @@ -422,25 +427,35 @@ color = "#E60584" // rgb: 96, 0, 255 taste_description = "melted ice cream" overdose_threshold = 12 - var/mob/living/carbon/M - var/mob/living/carbon/human/H = M - var/species/S - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - var/obj/item/organ/genital/penis/P = M.getorganslot("penis") - var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") - var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") - var/obj/item/organ/genital/womb/W = M.getorganslot("womb") + //var/mob/living/carbon/M + var/mob/living/carbon/human/H + //var/mob/living/carbon/human/species/S + /* + var/obj/item/organ/genital/breasts/B + var/obj/item/organ/genital/penis/P + var/obj/item/organ/genital/testicles/T + var/obj/item/organ/genital/vagina/V + var/obj/item/organ/genital/womb/W + */ /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size - if(!M.getorganslot("breasts")) //If they don't have breasts, give them breasts. + switch(current_cycle) + if(0) + + + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + if(!B) //If they don't have breasts, give them breasts. + message_admins("No breasts found!") var/obj/item/organ/genital/breasts/nB = new nB.Insert(M) if(nB) if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) nB.color = skintone2hex(H.skin_tone) - else + else if(M.dna.features["breasts_color"]) nB.color = "#[M.dna.features["breasts_color"]]" + else + nB.color = skintone2hex(H.skin_tone) nB.size = 0 to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") B = nB @@ -456,38 +471,44 @@ M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - S.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - M.physical.speed += 0.1//big breasts are cumbersome + H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + M.add_movespeed_modifier("hugebreasts", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1)) M.next_move_modifier += 0.1 - M.update() + //M.update() ..() /datum/reagent/fermi/BElarger/overdose_start(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. + + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") + var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") + var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") + var/obj/item/organ/genital/womb/W = M.getorganslot("womb") + if(M.gender == MALE) M.gender = FEMALE M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") if(P) P.size -= 0.2 - if (P.size < 0.5) + if (P.size <= 0.1) to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") qdel(P) + if(T) + qdel(T) else if (P.size > 9 ) - M.physical.speed -= 0.1//Liberation from comical size + M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.size - 8.1))//Via la liberation M.next_move_modifier -= 0.1 - S.no_equip -= list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - - if(T) - if (P.size < 0.1 || !P) - qdel(T) if(!V) var/obj/item/organ/genital/vagina/nV = new nV.Insert(M) + V = nV if(!W) var/obj/item/organ/genital/womb/nW = new nW.Insert(M) - M.update() + W = nV + //M.update() ..() /datum/reagent/fermi/PElarger // Due to popular demand...! @@ -497,24 +518,35 @@ color = "#E60584" // rgb: 96, 0, 255 taste_description = "meaty oil" overdose_threshold = 12 - var/mob/living/carbon/M - var/species/S - var/obj/item/organ/genital/penis/P = M.getorganslot("penis") - var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") - var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") - var/obj/item/organ/genital/womb/W = M.getorganslot("womb") - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - var/mob/living/carbon/human/H = M + //var/mob/living/carbon/M + //var/mob/living/carbon/human/species/S + /* + var/obj/item/organ/genital/penis/P + var/obj/item/organ/genital/testicles/T + var/obj/item/organ/genital/vagina/V + var/obj/item/organ/genital/womb/W + var/obj/item/organ/genital/breasts/B + */ + var/mob/living/carbon/human/H /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size - if(!M.getorganslot("penis")) + switch(current_cycle) + if(0) + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + + + var/obj/item/organ/genital/penis/P = M.getorganslot("penis)") + if(!P) + message_admins("No penis found!") var/obj/item/organ/genital/penis/nP = new nP.Insert(M) if(nP) if(M.dna.species.use_skintones && H.dna.features["genitals_use_skintone"]) nP.color = skintone2hex(H.skin_tone) - else + else if(M.dna.features["cock_color"]) nP.color = "#[M.dna.features["cock_color"]]" + else + nP.color = skintone2hex(H.skin_tone) nP.size = 0 to_chat(M, "Your groin feels warm, as you feel a new bulge down below.") P = nP @@ -528,10 +560,11 @@ M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - S.no_equip += list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - M.physical.speed += 0.1//big breasts are cumbersome + H.dna.species.no_equip = list() + M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.size - 8.1)) M.next_move_modifier += 0.1 - M.update() + //H.update() + message_admins("P size: [P.size]") ..() /datum/reagent/fermi/PElarger/overdose_start(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. @@ -540,23 +573,22 @@ M.gender = MALE M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") - if(!P) - var/obj/item/organ/genital/penis/nP = new - nP.Insert(M) - if(!T) - var/obj/item/organ/genital/testicles/nT = new - nT.Insert(M) - M.update() - ..() - - - if(B) B.size -= 0.2 if (B.size < 0.1) to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") qdel(B) + if(!T) + var/obj/item/organ/genital/testicles/nT = new + nT.Insert(M) + //H.update() + ..() + + + + + /* /mob/living/simple_animal/hostile/retaliate/ghost From 93fef732b160e783e1eab9f320181b997e0c0bd6 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 27 Apr 2019 05:46:47 +0100 Subject: [PATCH 069/608] Blased breasts being letters. --- .../chemistry/reagents/fermi_reagents.dm | 115 ++++++++++++------ 1 file changed, 80 insertions(+), 35 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 840e3be877..2fe5712e91 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -218,7 +218,7 @@ /datum/reagent/fermi/proc/sepPoll() var/list/procCandies = list() procCandies = pollGhostCandidates(, "FermiClone", null, ROLE_SENTIENCE, 20) // see poll_ignore.dm, should allow admins to ban greifers or bullies - sleep + sleep(300) return procCandies /*if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. @@ -233,7 +233,7 @@ switch(current_cycle) if(1) candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") - sleep(300) + /* for(var/mob/dead/observer/G in GLOB.player_list) group += G @@ -401,7 +401,7 @@ ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name //ZI.updateappearance(mutcolor_update=1) - holder.remove_reagent("SGZF", 50, FALSE) + holder.remove_reagent("SGZF", 20, FALSE) else to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") if(77 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. @@ -411,7 +411,7 @@ S.name = "Living teratoma" S.real_name = "Living teratoma" //S.updateappearance(mutcolor_update=1) - holder.remove_reagent("SGZF", 50, FALSE) + holder.remove_reagent("SGZF", 20, FALSE) M.adjustToxLoss(10, 0) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") @@ -420,13 +420,15 @@ //breast englargement //Honestly the most requested chems +//I tried to make it interesting..!! /datum/reagent/fermi/BElarger - name = "Sucubus Draft" + name = "Sucubus milk" id = "BEenlager" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." color = "#E60584" // rgb: 96, 0, 255 - taste_description = "melted ice cream" + taste_description = "a milky ice cream like flavour." overdose_threshold = 12 + metabolization_rate = 0.5 * REAGENTS_METABOLISM //var/mob/living/carbon/M var/mob/living/carbon/human/H //var/mob/living/carbon/human/species/S @@ -440,9 +442,10 @@ /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size + /* switch(current_cycle) if(0) - + */ var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) //If they don't have breasts, give them breasts. @@ -456,24 +459,52 @@ nB.color = "#[M.dna.features["breasts_color"]]" else nB.color = skintone2hex(H.skin_tone) - nB.size = 0 + nB.size = "a" to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") - B = nB + holder.remove_reagent("BElarger", 2, FALSE) else //If they have them, increase size. If size is comically big, limit movement and rip clothes. - B.size += 0.1 - if (B.size > 8.5) - to_chat(M, "Your breasts begin to strain against your clothes tightly!") - M.adjustOxyLoss(10, 0) - M.adjustBruteLoss(2, 0) - if (B.size > 9) - //M.adjustOxyLoss((-50, 0) - if(H.w_uniform || H.wear_suit) - M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") - playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - M.add_movespeed_modifier("hugebreasts", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1)) - M.next_move_modifier += 0.1 + + if(B.size == "a") + B.size = "b" + to_chat(M, "You feel your breasts grow to a modest size.") + holder.remove_reagent("BElarger", 2, FALSE) + sleep(20) + if(B.size == "b") + B.size = "c" + to_chat(M, "Your breasts swell up to a substancial size.") + holder.remove_reagent("BElarger", 2, FALSE) + sleep(20) + if(B.size == "c") + B.size = "d" + to_chat(M, "Your breasts flourish into a full pair.") + holder.remove_reagent("BElarger", 2, FALSE) + sleep(20) + if(B.size == "d") + B.size = "e" + to_chat(M, "Your breasts expand into a large voluptuous pair!") + holder.remove_reagent("BElarger", 2, FALSE) + sleep(20) + if(B.size == "e") + B.size = 7 + to_chat(M, "Your breasts expand into a large voluptuous pair!") + holder.remove_reagent("BElarger", 2, FALSE) + sleep(20) + if(B.size > 7) + B.size += 0.2 + if (B.size > 9) + //M.adjustOxyLoss((-50, 0) + if(H.w_uniform || H.wear_suit) + M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) + M.add_movespeed_modifier("hugebreasts", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1)) + M.next_move_modifier += 0.1 + else if (B.size > 8.5) + to_chat(M, "Your breasts begin to strain against your clothes tightly!") + M.adjustOxyLoss(10, 0) + M.adjustBruteLoss(2, 0) + //M.update() ..() @@ -507,17 +538,18 @@ if(!W) var/obj/item/organ/genital/womb/nW = new nW.Insert(M) - W = nV + W = nW //M.update() ..() /datum/reagent/fermi/PElarger // Due to popular demand...! - name = "Bluespace Viagra" + name = "Incubus draft" id = "PElarger" - description = "A volatile collodial mixture derived from toxic masculinity that encourages a larger gentleman's package via a potent testosterone mix." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? - color = "#E60584" // rgb: 96, 0, 255 - taste_description = "meaty oil" + description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? + color = "#H60584" // rgb: 96, 0, 255 + taste_description = "a salty and sticky substance." overdose_threshold = 12 + metabolization_rate = 0.5 * REAGENTS_METABOLISM //var/mob/living/carbon/M //var/mob/living/carbon/human/species/S /* @@ -530,9 +562,10 @@ var/mob/living/carbon/human/H /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size + /* switch(current_cycle) if(0) - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + */ var/obj/item/organ/genital/penis/P = M.getorganslot("penis)") @@ -541,20 +574,18 @@ var/obj/item/organ/genital/penis/nP = new nP.Insert(M) if(nP) + /* if(M.dna.species.use_skintones && H.dna.features["genitals_use_skintone"]) nP.color = skintone2hex(H.skin_tone) else if(M.dna.features["cock_color"]) nP.color = "#[M.dna.features["cock_color"]]" - else - nP.color = skintone2hex(H.skin_tone) + else*/ + nP.color = skintone2hex(H.skin_tone) nP.size = 0 to_chat(M, "Your groin feels warm, as you feel a new bulge down below.") P = nP else - P.size += 0.1 - if (P.size > 8.5) - to_chat(M, "Your cock begin to strain against your clothes tightly!") - M.adjustBruteLoss(5, 0) + P.size += 0.2 if (P.size > 9) if(H.w_uniform || H.wear_suit) M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") @@ -563,11 +594,20 @@ H.dna.species.no_equip = list() M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.size - 8.1)) M.next_move_modifier += 0.1 + else if (P.size > 8.5) + to_chat(M, "Your cock begin to strain against your clothes tightly!") + M.adjustBruteLoss(5, 0) + //H.update() message_admins("P size: [P.size]") ..() /datum/reagent/fermi/PElarger/overdose_start(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") + var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") + var/obj/item/organ/genital/womb/W = M.getorganslot("womb") + if(M.gender == FEMALE) M.gender = MALE @@ -578,6 +618,10 @@ if (B.size < 0.1) to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") qdel(B) + if(V) + qdel(V) + if(W) + qdel(W) if(!T) var/obj/item/organ/genital/testicles/nT = new @@ -600,6 +644,7 @@ reduce viewrange? /* //Nanite removal +//Writen by Trilby!! /datum/reagent/fermi/naninte_b_gone name = "Naninte bain" id = "naninte_b_gone" From 9c4e2c8e08e7c0f3a356d53e8dceec56ad54c710 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 27 Apr 2019 06:01:36 +0100 Subject: [PATCH 070/608] I hope it works! --- .../chemistry/reagents/fermi_reagents.dm | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 2fe5712e91..d3643b8e1a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -204,6 +204,7 @@ //var/polling = FALSE var/list/result = list() var/list/group = null + var/pollStarted = FALSE //var/fClone_current_controller = OWNER //var/mob/living/split_personality/clone//there's two so they can swap without overwriting @@ -216,8 +217,9 @@ ^^^breaks everything */ /datum/reagent/fermi/proc/sepPoll() - var/list/procCandies = list() - procCandies = pollGhostCandidates(, "FermiClone", null, ROLE_SENTIENCE, 20) // see poll_ignore.dm, should allow admins to ban greifers or bullies + //var/list/procCandies = list() + //if (pollStarted == FALSE) + // procCandies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") sleep(300) return procCandies @@ -232,7 +234,10 @@ //Setup clone switch(current_cycle) if(1) - candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") + if(pollStarted = FALSE) + pollStarted = TRUE + candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") + /* for(var/mob/dead/observer/G in GLOB.player_list) @@ -335,7 +340,8 @@ ..() -/datum/reagent/fermi/SDGF/on_mob_delete(mob/living/M) //When the chem is removed, a few things can happen. +/datum/reagent/fermi/SDGF/on_mob_delete(mob/living/M) //When the chem is removed, a few things can happen, mostly consolation prizes. + pollStarted = FALSE if (playerClone == TRUE)//If the player made a clone with it, then thats all they get. playerClone = FALSE return @@ -463,7 +469,7 @@ to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") holder.remove_reagent("BElarger", 2, FALSE) else //If they have them, increase size. If size is comically big, limit movement and rip clothes. - + message_admins("Breast size: [B.size]") if(B.size == "a") B.size = "b" to_chat(M, "You feel your breasts grow to a modest size.") @@ -523,9 +529,9 @@ P.size -= 0.2 if (P.size <= 0.1) to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") - qdel(P) + P.Remove(P) if(T) - qdel(T) + T.Remove(M) else if (P.size > 9 ) M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.size - 8.1))//Via la liberation M.next_move_modifier -= 0.1 @@ -617,11 +623,11 @@ B.size -= 0.2 if (B.size < 0.1) to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") - qdel(B) + B.Remove(M) if(V) - qdel(V) + V.Remove(M) if(W) - qdel(W) + W.Remove(M) if(!T) var/obj/item/organ/genital/testicles/nT = new From ba84ef600bbfd281cd61aae11248cb75db7fb563 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 27 Apr 2019 12:00:26 +0100 Subject: [PATCH 071/608] PE and BE functionality fixed/added. --- .../code/datums/status_effects/chems.dm | 47 ++++++ .../code/modules/arousal/organs/breasts.dm | 4 +- .../chemistry/reagents/fermi_reagents.dm | 145 +++++++++--------- .../reagents/chemistry/recipes/fermi.dm | 4 + 4 files changed, 125 insertions(+), 75 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 6f3d4c99ae..43f8b18cd0 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -34,6 +34,52 @@ // to_chat(owner, "[linked_extract] desperately tries to move your soul to a living body, but can't find one!") ..() +/datum/status_effect/chem/BElarger + id = "BElarger" + var/list/items = list() + +/datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M) + var/mob/living/carbon/human/H + if(H.w_uniform || H.wear_suit) + playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) + items |= M.get_equipped_items(TRUE) + M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + M.dropItemToGround(H.wear_suit) + M.dropItemToGround(H.w_uniform) + +/datum/status_effect/chem/BElarger/tick(mob/living/carbon/M) + var/mob/living/carbon/human/H + if(H.w_uniform || H.wear_suit) + items |= M.get_equipped_items(TRUE) + to_chat(M, "Your enormous breasts are way to large to fit anything over!") + M.dropItemToGround(H.wear_suit) + M.dropItemToGround(H.w_uniform) + +/datum/status_effect/chem/PElarger + id = "PElarger" + var/list/items = list() + +/datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/M) + var/mob/living/carbon/human/H + if(H.w_uniform || H.wear_suit) + playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) + items |= M.get_equipped_items(TRUE) + M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") + M.dropItemToGround(H.wear_suit) + M.dropItemToGround(H.w_uniform) + +/datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) + var/mob/living/carbon/human/H + if(H.w_uniform || H.wear_suit) + items |= M.get_equipped_items(TRUE) + to_chat(M, "Your enormous package is way to large to fit anything over!") + M.dropItemToGround(H.wear_suit) + M.dropItemToGround(H.w_uniform) + + +/*Doesn't work /datum/status_effect/chem/SDGF/candidates id = "SGDFCandi" var/mob/living/fermi_Clone @@ -42,3 +88,4 @@ /datum/status_effect/chem/SDGF/candidates/on_apply() candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies return ..() +*/ diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index b17cb9be72..1ea7d68cfc 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -44,9 +44,9 @@ desc = "You see a pair of breasts." else desc = "You see some breasts, they seem to be quite exotic." - if (size >= 8.5) + if (size <= 7) desc += " You estimate that they're [uppertext(size)]-cups." - else if (size > 8.5) + else if (size > 7) desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." else desc += " You wouldn't measure them in cup sizes." diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index d3643b8e1a..3ed6a4fa30 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -12,10 +12,10 @@ id = "fermi" taste_description = "If affection had a taste, this would be it." -/datum/reagent/fermi/on_mob_life(mob/living/carbon/M) +///datum/reagent/fermi/on_mob_life(mob/living/carbon/M) //current_cycle++ - holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism - return ..() + //holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism + //return ..() /datum/reagent/fermi/overdose_start(mob/living/carbon/M) current_cycle++ @@ -37,7 +37,7 @@ addiction_stage2_end = 30 addiction_stage3_end = 40 addiction_stage4_end = 43 //Incase it's too long - var/turf/open/location_created = null + var/location_created var/turf/open/location_return = null var/addictCyc1 = 1 var/addictCyc2 = 1 @@ -48,26 +48,17 @@ mob/living/carbon/purgeBody + /* -/datum/reagent/fermi/eigenstate/oew() - . = ..() //Needed! - location_created = get_turf(src) //Sets up coordinate of where it was created - message_admins("Attempting to get creation location from on_new() [location_created]") - //..()s -*/ /datum/reagent/fermi/eigenstate/on_new() -//obj/item/reagent/fermi/eigenstate/Initialize() -//datum/reagent/fermi/eigenstate/Initialize() - . = ..() //Needed! - //if(holder && holder.my_atom) location_created = get_turf(loc) //Sets up coordinate of where it was created message_admins("Attempting to get creation location from init() [location_created]") //..() - +*/ /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! switch(current_cycle) - if(0) + if(1) location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") do_sparks(5,FALSE,M) @@ -216,13 +207,14 @@ message_admins("Attempting to poll") ^^^breaks everything */ +/* /datum/reagent/fermi/proc/sepPoll() //var/list/procCandies = list() //if (pollStarted == FALSE) // procCandies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") sleep(300) return procCandies - +*/ /*if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. M.apply_status_effect(/datum/status_effect/chem/SDGF/candidates) /datum/status_effect/chem/SDGF/candidates/candies = new /datum/status_effect/chem/SDGF/candidates @@ -234,7 +226,7 @@ //Setup clone switch(current_cycle) if(1) - if(pollStarted = FALSE) + if(pollStarted == FALSE) pollStarted = TRUE candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") @@ -258,6 +250,7 @@ message_admins("Number of candidates [LAZYLEN(candies)]") if(LAZYLEN(candies) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! message_admins("Candidate found!") + to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") //var/typepath = owner.type //clone = new typepath(owner.loc) var/typepath = M.type @@ -281,14 +274,16 @@ //SM.sentience_act() to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") - to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") + to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") M.visible_message("[M] suddenly shudders, and splits into two identical twins!") SM.copy_known_languages_from(M, FALSE) playerClone = TRUE M.next_move_modifier = 1 M.nutrition = 150 - holder.remove_reagent("SGDF", 999, FALSE) + + reaction_mob(SM, ) + holder.remove_reagent("SDGF", 999) //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? //after_success(user, SM) @@ -333,7 +328,7 @@ to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) if(87 to INFINITY) - holder.remove_reagent("SGDF", 1, FALSE)//removes SGDF on completion. + holder.remove_reagent("SGDF", 1)//removes SGDF on completion. message_admins("Purging SGDF [volume]") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") @@ -407,17 +402,18 @@ ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name //ZI.updateappearance(mutcolor_update=1) - holder.remove_reagent("SGZF", 20, FALSE) + M.reagents.remove_reagent("SDZF", 20) else to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") - if(77 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. + if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. M.nutrition -= 100 var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) S.name = "Living teratoma" S.real_name = "Living teratoma" + S.rabid = 1 //S.updateappearance(mutcolor_update=1) - holder.remove_reagent("SGZF", 20, FALSE) + M.reagents.remove_reagent("SDZF", 20) M.adjustToxLoss(10, 0) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") @@ -434,7 +430,7 @@ color = "#E60584" // rgb: 96, 0, 255 taste_description = "a milky ice cream like flavour." overdose_threshold = 12 - metabolization_rate = 0.5 * REAGENTS_METABOLISM + metabolization_rate = 2 //var/mob/living/carbon/M var/mob/living/carbon/human/H //var/mob/living/carbon/human/species/S @@ -467,51 +463,48 @@ nB.color = skintone2hex(H.skin_tone) nB.size = "a" to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") - holder.remove_reagent("BElarger", 2, FALSE) + M.reagents.remove_reagent(src.id, 5) else //If they have them, increase size. If size is comically big, limit movement and rip clothes. - message_admins("Breast size: [B.size]") + message_admins("Breast size: [B.size], [holder]") if(B.size == "a") B.size = "b" to_chat(M, "You feel your breasts grow to a modest size.") - holder.remove_reagent("BElarger", 2, FALSE) - sleep(20) - if(B.size == "b") + M.reagents.remove_reagent(src.id, 5) + sleep(500) + else if(B.size == "b") B.size = "c" to_chat(M, "Your breasts swell up to a substancial size.") - holder.remove_reagent("BElarger", 2, FALSE) - sleep(20) - if(B.size == "c") + M.reagents.remove_reagent(src.id, 5) + sleep(500) + else if(B.size == "c") B.size = "d" to_chat(M, "Your breasts flourish into a full pair.") - holder.remove_reagent("BElarger", 2, FALSE) - sleep(20) - if(B.size == "d") + M.reagents.remove_reagent(src.id, 5) + sleep(500) + else if(B.size == "d") B.size = "e" to_chat(M, "Your breasts expand into a large voluptuous pair!") - holder.remove_reagent("BElarger", 2, FALSE) - sleep(20) - if(B.size == "e") + M.reagents.remove_reagent(src.id, 5) + sleep(500) + else if(B.size == "e") B.size = 7 - to_chat(M, "Your breasts expand into a large voluptuous pair!") - holder.remove_reagent("BElarger", 2, FALSE) - sleep(20) - if(B.size > 7) - B.size += 0.2 + to_chat(M, "Your breasts burst forth into [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")].") + M.reagents.remove_reagent(src.id, 5) + sleep(500) + if(B.size >= 7) + B.size = B.size + 0.1 if (B.size > 9) //M.adjustOxyLoss((-50, 0) - if(H.w_uniform || H.wear_suit) - M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") - playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - M.add_movespeed_modifier("hugebreasts", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1)) + M.apply_status_effect(/datum/status_effect/chem/BElarger) + M.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1)) M.next_move_modifier += 0.1 else if (B.size > 8.5) to_chat(M, "Your breasts begin to strain against your clothes tightly!") M.adjustOxyLoss(10, 0) M.adjustBruteLoss(2, 0) + sleep(500) - //M.update() + B.update_appearance() ..() /datum/reagent/fermi/BElarger/overdose_start(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. @@ -526,17 +519,18 @@ M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") if(P) - P.size -= 0.2 - if (P.size <= 0.1) + P.length -= 0.1 + if (P.length <= 0.1) to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") P.Remove(P) if(T) T.Remove(M) - else if (P.size > 9 ) - M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.size - 8.1))//Via la liberation + else if (P.length > 7) + M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 10.1))//Via la liberation M.next_move_modifier -= 0.1 H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - + else + M.remove_status_effect(/datum/status_effect/chem/PElarger) if(!V) var/obj/item/organ/genital/vagina/nV = new nV.Insert(M) @@ -545,7 +539,7 @@ var/obj/item/organ/genital/womb/nW = new nW.Insert(M) W = nW - //M.update() + P.update_appearance() ..() /datum/reagent/fermi/PElarger // Due to popular demand...! @@ -574,7 +568,7 @@ */ - var/obj/item/organ/genital/penis/P = M.getorganslot("penis)") + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) message_admins("No penis found!") var/obj/item/organ/genital/penis/nP = new @@ -586,26 +580,23 @@ else if(M.dna.features["cock_color"]) nP.color = "#[M.dna.features["cock_color"]]" else*/ - nP.color = skintone2hex(H.skin_tone) - nP.size = 0 + //nP.color = skintone2hex(H.skin_tone) + nP.length = 0.2 to_chat(M, "Your groin feels warm, as you feel a new bulge down below.") P = nP + P.update_size() else - P.size += 0.2 - if (P.size > 9) - if(H.w_uniform || H.wear_suit) - M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") - playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) - H.dna.species.no_equip = list() - M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.size - 8.1)) + P.length = P.length + 0.1 + if (P.length > 9) + M.apply_status_effect(/datum/status_effect/chem/BElarger) + M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 10.1)) M.next_move_modifier += 0.1 - else if (P.size > 8.5) + else if (P.length > 8.5) to_chat(M, "Your cock begin to strain against your clothes tightly!") M.adjustBruteLoss(5, 0) - //H.update() - message_admins("P size: [P.size]") + P.update_appearance() + message_admins("P size: [P.length]") ..() /datum/reagent/fermi/PElarger/overdose_start(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. @@ -620,19 +611,27 @@ M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") if(B) - B.size -= 0.2 + B.size -= 0.1 if (B.size < 0.1) to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") B.Remove(M) + else if (B.size >= 9) + M.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1))//Via la liberation + M.next_move_modifier -= 0.1 + H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) if(V) V.Remove(M) if(W) W.Remove(M) + B.update_appearance() + else + M.remove_status_effect(/datum/status_effect/chem/BElarger) + if(!T) var/obj/item/organ/genital/testicles/nT = new nT.Insert(M) - //H.update() + ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index d4cbf6847a..82c495b352 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -23,6 +23,10 @@ FermiExplode = FALSE //If the chemical explodes in a special way ImpureChem = "toxin" //What chemical is produced with an inpure reaction +/datum/chemical_reaction/eigenstate/on_reaction(datum/reagents/holder) + var/location = get_turf(holder.my_atom) + var/reagent/fermi/eigenstate/location_created = location + //serum /datum/chemical_reaction/SDGF name = "synthetic-derived growth factor" From f9ead7eadb3c1beb2c261107058a4c0be6b03b1d Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 00:53:30 +0100 Subject: [PATCH 072/608] Hurghh --- .../code/datums/status_effects/chems.dm | 30 +++++-- .../code/modules/arousal/organs/breasts.dm | 42 ++++++++- .../chemistry/reagents/fermi_reagents.dm | 85 +++++-------------- 3 files changed, 83 insertions(+), 74 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 43f8b18cd0..3d5a8a99bb 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -39,7 +39,7 @@ var/list/items = list() /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M) - var/mob/living/carbon/human/H + var/mob/living/carbon/human/H = M if(H.w_uniform || H.wear_suit) playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) items |= M.get_equipped_items(TRUE) @@ -49,31 +49,47 @@ M.dropItemToGround(H.w_uniform) /datum/status_effect/chem/BElarger/tick(mob/living/carbon/M) - var/mob/living/carbon/human/H + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + var/mob/living/carbon/human/H = M if(H.w_uniform || H.wear_suit) items |= M.get_equipped_items(TRUE) to_chat(M, "Your enormous breasts are way to large to fit anything over!") M.dropItemToGround(H.wear_suit) M.dropItemToGround(H.w_uniform) + switch(round(B.cached_size)) + if(9) + if (!(B.breast_sizes[B.prev_size] == B.size)) + M.remove_movespeed_modifier("megamilk") + M.next_move_modifier = 1 + if(10 to INFINITY) + if (!(B.breast_sizes[B.prev_size] == B.size)) + to_chat(M, "Your indulgent busom is so substantial, it's affecting your movements!") + M.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (round(B.cached_size) - 8)) + M.next_move_modifier = (round(B.cached_size) - 8) + +/datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) + M.remove_movespeed_modifier("megamilk") + M.next_move_modifier = 1 /datum/status_effect/chem/PElarger id = "PElarger" - var/list/items = list() + //var/list/items = list() + /datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/M) - var/mob/living/carbon/human/H + var/mob/living/carbon/human/H = M if(H.w_uniform || H.wear_suit) playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) - items |= M.get_equipped_items(TRUE) + //items |= M.get_equipped_items(TRUE) M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") M.dropItemToGround(H.wear_suit) M.dropItemToGround(H.w_uniform) /datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) - var/mob/living/carbon/human/H + var/mob/living/carbon/human/H = M if(H.w_uniform || H.wear_suit) - items |= M.get_equipped_items(TRUE) + //items |= M.get_equipped_items(TRUE) to_chat(M, "Your enormous package is way to large to fit anything over!") M.dropItemToGround(H.wear_suit) M.dropItemToGround(H.w_uniform) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 1ea7d68cfc..1b0a3679d7 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -7,6 +7,10 @@ slot = "breasts" w_class = 3 size = BREASTS_SIZE_DEF + var/cached_size = 3//for enlargement + var/prev_size = 3//For flavour texts + var/breast_sizes = list ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "flat") + var/breast_values = list ("A" = 1, "B" = 2, "C" = 3, "D" = 4, "E" = 5, "F" = 6, "G" = 7, "H" = 8, "I" = 9, "J" = 10, "K" = 11, "L" = 12, "M" = 13, "N" = 14, "O" = 15, "huge" = 16, "flat" = 0) fluid_id = "milk" var/amount = 2 producing = TRUE @@ -19,6 +23,7 @@ /obj/item/organ/genital/breasts/Initialize() . = ..() reagents.add_reagent(fluid_id, fluid_max_volume) + prev_size = size /obj/item/organ/genital/breasts/on_life() if(QDELETED(src)) @@ -44,12 +49,12 @@ desc = "You see a pair of breasts." else desc = "You see some breasts, they seem to be quite exotic." - if (size <= 7) + if (size == "huge") desc += " You estimate that they're [uppertext(size)]-cups." - else if (size > 7) - desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." else - desc += " You wouldn't measure them in cup sizes." + desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." + //else + // desc += " You wouldn't measure them in cup sizes." if(producing && aroused_state) desc += " They're leaking [fluid_id]." if(owner) @@ -59,3 +64,32 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["breasts_color"]]" + +/obj/item/organ/genital/breasts/update_size(mob/living/carbon/M) + + switch(round(cached_size)) + if(0) + size = "flat" + if(!M.has_status_effect(/datum/status_effect/chem/BElarger)) + owner.remove_status_effect(/datum/status_effect/chem/BElarger) + if(1 to 8) + size = breast_sizes[round(cached_size)] + if(!M.has_status_effect(/datum/status_effect/chem/BElarger)) + owner.remove_status_effect(/datum/status_effect/chem/BElarger) + if(9 to 15) + size = breast_sizes[round(cached_size)] + if(M.has_status_effect(/datum/status_effect/chem/BElarger)) + owner.apply_status_effect(/datum/status_effect/chem/BElarger) + if(16 to INFINITY) + size = "huge" + if (!(breast_sizes[prev_size] == size)) + if (breast_values[size] > breast_values[prev_size]) + to_chat(M, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") + prev_size = cached_size + else if (breast_values[size] > breast_values[prev_size]) + to_chat(M, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") + prev_size = cached_size + if(cached_size < 0) + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") + B.Remove(M) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 3ed6a4fa30..b5a09502c8 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -86,7 +86,7 @@ do_sparks(5,FALSE,src) do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) - holder.remove_reagent("eigenstate", 0.5, FALSE)//So you're not stuck for 10 minutes teleporting + holder.remove_reagent(src.id, 0.5)//So you're not stuck for 10 minutes teleporting ..() //loop function @@ -283,7 +283,7 @@ M.nutrition = 150 reaction_mob(SM, ) - holder.remove_reagent("SDGF", 999) + holder.remove_reagent(src.id, 999) //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? //after_success(user, SM) @@ -328,7 +328,7 @@ to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) if(87 to INFINITY) - holder.remove_reagent("SGDF", 1)//removes SGDF on completion. + holder.remove_reagent(src.id, 1)//removes SGDF on completion. message_admins("Purging SGDF [volume]") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") @@ -402,7 +402,7 @@ ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name //ZI.updateappearance(mutcolor_update=1) - M.reagents.remove_reagent("SDZF", 20) + holder.remove_reagent(src.id, 20) else to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. @@ -413,7 +413,7 @@ S.real_name = "Living teratoma" S.rabid = 1 //S.updateappearance(mutcolor_update=1) - M.reagents.remove_reagent("SDZF", 20) + holder.remove_reagent(src.id, 20) M.adjustToxLoss(10, 0) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") @@ -422,6 +422,7 @@ //breast englargement //Honestly the most requested chems +//I'm not a very kinky person, sorry if it's not great //I tried to make it interesting..!! /datum/reagent/fermi/BElarger name = "Sucubus milk" @@ -461,50 +462,19 @@ nB.color = "#[M.dna.features["breasts_color"]]" else nB.color = skintone2hex(H.skin_tone) - nB.size = "a" + nB.size = "flat" + nB.cached_size = 0 to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") M.reagents.remove_reagent(src.id, 5) - else //If they have them, increase size. If size is comically big, limit movement and rip clothes. - message_admins("Breast size: [B.size], [holder]") - if(B.size == "a") - B.size = "b" - to_chat(M, "You feel your breasts grow to a modest size.") - M.reagents.remove_reagent(src.id, 5) - sleep(500) - else if(B.size == "b") - B.size = "c" - to_chat(M, "Your breasts swell up to a substancial size.") - M.reagents.remove_reagent(src.id, 5) - sleep(500) - else if(B.size == "c") - B.size = "d" - to_chat(M, "Your breasts flourish into a full pair.") - M.reagents.remove_reagent(src.id, 5) - sleep(500) - else if(B.size == "d") - B.size = "e" - to_chat(M, "Your breasts expand into a large voluptuous pair!") - M.reagents.remove_reagent(src.id, 5) - sleep(500) - else if(B.size == "e") - B.size = 7 - to_chat(M, "Your breasts burst forth into [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")].") - M.reagents.remove_reagent(src.id, 5) - sleep(500) - if(B.size >= 7) - B.size = B.size + 0.1 - if (B.size > 9) - //M.adjustOxyLoss((-50, 0) - M.apply_status_effect(/datum/status_effect/chem/BElarger) - M.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1)) - M.next_move_modifier += 0.1 - else if (B.size > 8.5) - to_chat(M, "Your breasts begin to strain against your clothes tightly!") - M.adjustOxyLoss(10, 0) - M.adjustBruteLoss(2, 0) - sleep(500) + //If they have them, increase size. If size is comically big, limit movement and rip clothes. + message_admins("Breast size: [B.size], [B.cached_size], [holder]") + B.cached_size = B.cached_size + 0.1 + if (B.cached_size >= 8 && B.cached_size < 8.5) + to_chat(M, "Your breasts begin to strain against your clothes tightly!") + M.adjustOxyLoss(10, 0) + M.adjustBruteLoss(2, 0) - B.update_appearance() + B.update() ..() /datum/reagent/fermi/BElarger/overdose_start(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. @@ -611,23 +581,12 @@ M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") if(B) - B.size -= 0.1 - if (B.size < 0.1) - to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") - B.Remove(M) - else if (B.size >= 9) - M.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (B.size - 8.1))//Via la liberation - M.next_move_modifier -= 0.1 - H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) - if(V) - V.Remove(M) - if(W) - W.Remove(M) - B.update_appearance() - else - M.remove_status_effect(/datum/status_effect/chem/BElarger) - - + B.cached_size = B.cached_size - B.cached_size + B.update() + if(V) + V.Remove(M) + if(W) + W.Remove(M) if(!T) var/obj/item/organ/genital/testicles/nT = new nT.Insert(M) From f8495ae96ab353e97d9b9592b098da30d2ab9e27 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 01:45:09 +0100 Subject: [PATCH 073/608] I don't know how to icons aaaa --- .../code/modules/arousal/organs/breasts.dm | 20 +++++++++++------- .../chemistry/reagents/fermi_reagents.dm | 3 ++- .../icons/obj/genitals/breasts_onmob.dmi | Bin 753 -> 1141 bytes 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 1b0a3679d7..6a27a185ba 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -49,12 +49,12 @@ desc = "You see a pair of breasts." else desc = "You see some breasts, they seem to be quite exotic." - if (size == "huge") + if(isnum(size)) + desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." + else if (!size == "huge") desc += " You estimate that they're [uppertext(size)]-cups." else - desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." - //else - // desc += " You wouldn't measure them in cup sizes." + desc += " They're very small and flatchested, however." if(producing && aroused_state) desc += " They're leaking [fluid_id]." if(owner) @@ -65,20 +65,21 @@ else color = "#[owner.dna.features["breasts_color"]]" -/obj/item/organ/genital/breasts/update_size(mob/living/carbon/M) +//Allows breasts to grow and change size, with sprite changes too. +/obj/item/organ/genital/breasts/update_size(mob/living/carbon/M)//wah switch(round(cached_size)) if(0) size = "flat" - if(!M.has_status_effect(/datum/status_effect/chem/BElarger)) + if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) owner.remove_status_effect(/datum/status_effect/chem/BElarger) if(1 to 8) size = breast_sizes[round(cached_size)] - if(!M.has_status_effect(/datum/status_effect/chem/BElarger)) + if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) owner.remove_status_effect(/datum/status_effect/chem/BElarger) if(9 to 15) size = breast_sizes[round(cached_size)] - if(M.has_status_effect(/datum/status_effect/chem/BElarger)) + if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) owner.apply_status_effect(/datum/status_effect/chem/BElarger) if(16 to INFINITY) size = "huge" @@ -93,3 +94,6 @@ var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") B.Remove(M) + var/S = GLOB.breasts_shapes_list[shape] + var/mutable_appearance/genital_overlay = mutable_appearance(S.icon) + genital_overlay.icon_state = "breasts_[shape]_[size]_0_FRONT" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index b5a09502c8..02641b6cad 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -466,6 +466,7 @@ nB.cached_size = 0 to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") M.reagents.remove_reagent(src.id, 5) + B = nB //If they have them, increase size. If size is comically big, limit movement and rip clothes. message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.cached_size = B.cached_size + 0.1 @@ -509,7 +510,7 @@ var/obj/item/organ/genital/womb/nW = new nW.Insert(M) W = nW - P.update_appearance() + P.update() ..() /datum/reagent/fermi/PElarger // Due to popular demand...! diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi index 2a7342553bedc478e6e7c2c14fe23ee8fe80511a..5be42c8e7eba00fa9b7a8df2e1b4be958ee3f498 100644 GIT binary patch literal 1141 zcmV-*1d98KP)00001bW%=J06^y0W&i*HvU*flbVOxyV{&P5 zbZKvH004NLos&Ng!XOYwXZRGP-A${mE={X4h>3A0P_Bi+KLMg&-&SX1{B3u`yO%dy zDVlC4m1qx=KPaYfyNZoiFDlNS!DT-!t0iZi!szp7N!etY#==H2DJOk5A!?&5y*(Y( zx!}x&nC2^-4bfa^p6jnzjbIkDShl&oSBH6lUdxe=oaUM zMb45koI!;D{}VRZQkWjJCrwbw-S-ut49QDIj;|U}3IG5AK0)VoyHq|f^~2H~C8Hmn z%(cC@NXWsq`MYUirnmMhy082E1>>Lg-g8Qiw#@hR?RY?5xmR7Xz+?1=9Ziq6&CgUX zPNFDUMFX8eKx00000007|I z3-0Z``$U$`_D{{^Mg=Kh7!?Mmsvt)*yd=Jz6Ov$#m**8vc~PzF=q)dNb3H4gYIdfpNd@hm)Jcc;|zx3l_9b>KKz&4^Lk5 z7Uk0$|9sHlf}x>((!x~vY0BNO&I{h6Trd6eLH2@ZpR_RPvf9`MRe3>6*JwT{J}fAu zebTn9^3~?a3*Mnd^Fc3%ojL83qKBo5%DE^1`^+5_*C*BGmtBCpoB#5OCIA2c0002^ zPJu(@`Zz~St)H7cs)%`{LoUOiIz39P;&204kYq!RF za^`MlNBf-UVg7ex4L8}_pS{VNIq@8t6ijOO?w%0000LP)t-s{{a8+ z@bJ;m(f|MdzrVlQ+S;JKoExE!6rUufpB(+)H8Hx&t5@u4l4BQBn|)n zCp4C#WXDY=me$2d^*%C|2KgJC<6wJ5008(9Mo*ui@{+BW>#z19`9)mqmc8ah+_^iq z8%)2))%~j9yeuRu?FRY;BiC;p00000@EM%lyj`W|bKh*HTsP3;b!uL&HcP)L?FM?h z)(ukgGIr(V%*;zr6a7>lothWf%DA!{><@8u_|b1300000Fu3gLGgMx#n)$vo56Qp9 z)z8*=o|u>LINyiLY~b~Lum6rn&C9iu(cElM-0BAq=5?QWk)sr?Z`yv{#?}0x-+Tub z`T>O9sq+8;008j6%O2;Z$vekbx8GCqvT5e~%FMUsdp%yK<~z*yXTjGmRpDpq2c_oa z&Xt#wS}glRbb@i~_Iqkxiet0c4YqN$)eTbf000000Q{wT-VKxI0ssI2004MRzKE+u zdv(3UeDIR5Dzkx)-yg_)>+$}?e24r0BNx9QaPReEd#QN|?q=ug24T8>sWz*bzJSEM z{65qV``T(CU*Z)G!sM>ke3u6hvSW0D;#l^Y??f%y5Kf;500000oL2R`8zw*e1vKvh jytm-szsv&wfK&PdIMr7V0^cM>00000NkvXXu0mjffUj@3 From ab317d95aa658e1e8c9f13678a1a1fe3654e07fd Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 03:42:10 +0100 Subject: [PATCH 074/608] One day it'll work and everything will be great --- .../code/datums/status_effects/chems.dm | 67 +++++++++++-------- .../code/modules/arousal/organs/breasts.dm | 59 +++++++++------- .../code/modules/arousal/organs/penis.dm | 1 + .../chemistry/reagents/fermi_reagents.dm | 28 +++----- 4 files changed, 87 insertions(+), 68 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 3d5a8a99bb..94df596aef 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -38,38 +38,45 @@ id = "BElarger" var/list/items = list() -/datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M) +/datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M)//Removes clothes, they're too small to contain you. You belong to space now. var/mob/living/carbon/human/H = M - if(H.w_uniform || H.wear_suit) - playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) - items |= M.get_equipped_items(TRUE) - M.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") - M.dropItemToGround(H.wear_suit) - M.dropItemToGround(H.w_uniform) + for(var/obj/item/W in H) + if(W == H.w_uniform || W == H.wear_suit) + H.dropItemToGround(W) + playsound(owner.loc, 'sound/items/poster_ripped.ogg', 50, 1) + //items |= owner.get_equipped_items(TRUE) + owner.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") + to_chat(owner, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + //owner.dropItemToGround(owner.wear_suit) + //owner.dropItemToGround(owner.w_uniform) -/datum/status_effect/chem/BElarger/tick(mob/living/carbon/M) +/datum/status_effect/chem/BElarger/tick(mob/living/carbon/M)//If you try to wear clothes, you fail. Slows you down if you're comically huge var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") var/mob/living/carbon/human/H = M - if(H.w_uniform || H.wear_suit) - items |= M.get_equipped_items(TRUE) - to_chat(M, "Your enormous breasts are way to large to fit anything over!") - M.dropItemToGround(H.wear_suit) - M.dropItemToGround(H.w_uniform) + message_admins("M: [M]") + message_admins("H: [H]") + message_admins("owner: [owner]") + for(var/obj/item/W in H) + if(W == H.w_uniform || W == H.wear_suit) + H.dropItemToGround(W) + //items |= owner.get_equipped_items(TRUE) + to_chat(owner, "Your enormous breasts are way to large to fit anything over!") + //owner.dropItemToGround(owner.wear_suit) + //owner.dropItemToGround(owner.w_uniform) switch(round(B.cached_size)) if(9) if (!(B.breast_sizes[B.prev_size] == B.size)) - M.remove_movespeed_modifier("megamilk") - M.next_move_modifier = 1 + owner.remove_movespeed_modifier("megamilk") + owner.next_move_modifier = 1 if(10 to INFINITY) if (!(B.breast_sizes[B.prev_size] == B.size)) to_chat(M, "Your indulgent busom is so substantial, it's affecting your movements!") - M.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (round(B.cached_size) - 8)) - M.next_move_modifier = (round(B.cached_size) - 8) + owner.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (round(B.cached_size) - 8)) + owner.next_move_modifier = (round(B.cached_size) - 8) /datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) - M.remove_movespeed_modifier("megamilk") - M.next_move_modifier = 1 + owner.remove_movespeed_modifier("megamilk") + owner.next_move_modifier = 1 /datum/status_effect/chem/PElarger id = "PElarger" @@ -78,21 +85,25 @@ /datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/M) var/mob/living/carbon/human/H = M - if(H.w_uniform || H.wear_suit) + for(var/obj/item/W in H) + if(W == H.w_uniform || W == H.wear_suit) + H.dropItemToGround(W) playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) //items |= M.get_equipped_items(TRUE) - M.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") + owner.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") - M.dropItemToGround(H.wear_suit) - M.dropItemToGround(H.w_uniform) + //owner.dropItemToGround(owner.wear_suit) + //owner.dropItemToGround(owner.w_uniform) /datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) var/mob/living/carbon/human/H = M - if(H.w_uniform || H.wear_suit) + for(var/obj/item/W in H) + if(W == H.w_uniform || W == H.wear_suit) + H.dropItemToGround(W) //items |= M.get_equipped_items(TRUE) - to_chat(M, "Your enormous package is way to large to fit anything over!") - M.dropItemToGround(H.wear_suit) - M.dropItemToGround(H.w_uniform) + to_chat(owner, "Your enormous package is way to large to fit anything over!") + //owner.dropItemToGround(owner.wear_suit) + //owner.dropItemToGround(owner.w_uniform) /*Doesn't work diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 6a27a185ba..08378684aa 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -9,7 +9,7 @@ size = BREASTS_SIZE_DEF var/cached_size = 3//for enlargement var/prev_size = 3//For flavour texts - var/breast_sizes = list ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "flat") + var/breast_sizes = list ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "huge", "flat") var/breast_values = list ("A" = 1, "B" = 2, "C" = 3, "D" = 4, "E" = 5, "F" = 6, "G" = 7, "H" = 8, "I" = 9, "J" = 10, "K" = 11, "L" = 12, "M" = 13, "N" = 14, "O" = 15, "huge" = 16, "flat" = 0) fluid_id = "milk" var/amount = 2 @@ -51,10 +51,13 @@ desc = "You see some breasts, they seem to be quite exotic." if(isnum(size)) desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." - else if (!size == "huge") - desc += " You estimate that they're [uppertext(size)]-cups." + else if (!isnum(size)) + if (size == "flat") + desc += " They're very small and flatchested, however." + else + desc += " You estimate that they're [uppertext(size)]-cups." else - desc += " They're very small and flatchested, however." + if(producing && aroused_state) desc += " They're leaking [fluid_id]." if(owner) @@ -67,33 +70,43 @@ //Allows breasts to grow and change size, with sprite changes too. -/obj/item/organ/genital/breasts/update_size(mob/living/carbon/M)//wah +//maximum wah +//Comical sizes slow you down in movement and actions. +//Rediculous sizes remove hands. +//Should I turn someone with meter wide... assets into a blob? +//this is far too lewd wah +/obj/item/organ/genital/breasts/update_size()//wah + var/mob/living/carbon/human/H = owner + message_admins("Breast size at start: [size], [cached_size], [owner]") + //var/sprite_accessory/breasts = mob/living/carbon/M + if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! + var/obj/item/organ/genital/breasts/B = owner.getorganslot("breasts") + to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") + B.Remove(owner) switch(round(cached_size)) if(0) size = "flat" - if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) - owner.remove_status_effect(/datum/status_effect/chem/BElarger) + //if(H.has_status_effect(/datum/status_effect/chem/BElarger)) + H.remove_status_effect(/datum/status_effect/chem/BElarger) if(1 to 8) size = breast_sizes[round(cached_size)] - if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) - owner.remove_status_effect(/datum/status_effect/chem/BElarger) + //if(H.has_status_effect(/datum/status_effect/chem/BElarger)) + H.remove_status_effect(/datum/status_effect/chem/BElarger) if(9 to 15) size = breast_sizes[round(cached_size)] - if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) - owner.apply_status_effect(/datum/status_effect/chem/BElarger) + //if(!H.has_status_effect(/datum/status_effect/chem/BElarger)) + H.apply_status_effect(/datum/status_effect/chem/BElarger) if(16 to INFINITY) - size = "huge" - if (!(breast_sizes[prev_size] == size)) + size = cached_size + message_admins("Breast size: [size], [cached_size], [owner]") + message_admins("[breast_values[prev_size]] vs [breast_values[size]]") + if (!(prev_size == breast_values[size])) if (breast_values[size] > breast_values[prev_size]) - to_chat(M, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") + to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") prev_size = cached_size - else if (breast_values[size] > breast_values[prev_size]) - to_chat(M, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") + else if (breast_values[size] < breast_values[prev_size]) + to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") prev_size = cached_size - if(cached_size < 0) - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - to_chat(M, "You feel your breasts shrinking away from your body as your chest flattens out.") - B.Remove(M) - var/S = GLOB.breasts_shapes_list[shape] - var/mutable_appearance/genital_overlay = mutable_appearance(S.icon) - genital_overlay.icon_state = "breasts_[shape]_[size]_0_FRONT" + icon_state = "breasts_[shape]_[size]" + H.update_body() + //breasts.icon_state = "breasts_[shape]_[size]_0_FRONT" diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 38e8e44f39..82bc2c61d8 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -48,6 +48,7 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["cock_color"]]" + owner.update_body() /obj/item/organ/genital/penis/update_link() if(owner) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 02641b6cad..30c555776d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -405,13 +405,13 @@ holder.remove_reagent(src.id, 20) else to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") - if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. + if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. TODO: turn tumour slime into real variant. M.nutrition -= 100 var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) S.name = "Living teratoma" - S.real_name = "Living teratoma" - S.rabid = 1 + S.real_name = "Living teratoma"//horrifying!! + S.rabid = 1//Make them an angery boi //S.updateappearance(mutcolor_update=1) holder.remove_reagent(src.id, 20) M.adjustToxLoss(10, 0) @@ -431,17 +431,9 @@ color = "#E60584" // rgb: 96, 0, 255 taste_description = "a milky ice cream like flavour." overdose_threshold = 12 - metabolization_rate = 2 - //var/mob/living/carbon/M + metabolization_rate = 0.5 var/mob/living/carbon/human/H - //var/mob/living/carbon/human/species/S - /* - var/obj/item/organ/genital/breasts/B - var/obj/item/organ/genital/penis/P - var/obj/item/organ/genital/testicles/T - var/obj/item/organ/genital/vagina/V - var/obj/item/organ/genital/womb/W - */ + /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size @@ -464,13 +456,14 @@ nB.color = skintone2hex(H.skin_tone) nB.size = "flat" nB.cached_size = 0 + nB.prev_size = 0 to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") M.reagents.remove_reagent(src.id, 5) B = nB //If they have them, increase size. If size is comically big, limit movement and rip clothes. message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.cached_size = B.cached_size + 0.1 - if (B.cached_size >= 8 && B.cached_size < 8.5) + if (B.cached_size >= 8.5 && B.cached_size < 9) to_chat(M, "Your breasts begin to strain against your clothes tightly!") M.adjustOxyLoss(10, 0) M.adjustBruteLoss(2, 0) @@ -502,6 +495,7 @@ H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) else M.remove_status_effect(/datum/status_effect/chem/PElarger) + P.update() if(!V) var/obj/item/organ/genital/vagina/nV = new nV.Insert(M) @@ -510,7 +504,6 @@ var/obj/item/organ/genital/womb/nW = new nW.Insert(M) W = nW - P.update() ..() /datum/reagent/fermi/PElarger // Due to popular demand...! @@ -520,7 +513,7 @@ color = "#H60584" // rgb: 96, 0, 255 taste_description = "a salty and sticky substance." overdose_threshold = 12 - metabolization_rate = 0.5 * REAGENTS_METABOLISM + metabolization_rate = 0.5 //var/mob/living/carbon/M //var/mob/living/carbon/human/species/S /* @@ -582,7 +575,8 @@ M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") if(B) - B.cached_size = B.cached_size - B.cached_size + B.cached_size = B.cached_size - 0.1 + message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.update() if(V) V.Remove(M) From 0ae8c72c9a5d9640263807796576ed026254d0a6 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 04:04:57 +0100 Subject: [PATCH 075/608] Bees --- modular_citadel/code/datums/status_effects/chems.dm | 2 ++ modular_citadel/code/modules/arousal/organs/breasts.dm | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 94df596aef..14a88602f2 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -39,6 +39,7 @@ var/list/items = list() /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M)//Removes clothes, they're too small to contain you. You belong to space now. + message_admins("BElarge started!") var/mob/living/carbon/human/H = M for(var/obj/item/W in H) if(W == H.w_uniform || W == H.wear_suit) @@ -51,6 +52,7 @@ //owner.dropItemToGround(owner.w_uniform) /datum/status_effect/chem/BElarger/tick(mob/living/carbon/M)//If you try to wear clothes, you fail. Slows you down if you're comically huge + message_admins("BElarge tick!") var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") var/mob/living/carbon/human/H = M message_admins("M: [M]") diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 08378684aa..9717622c04 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -56,7 +56,6 @@ desc += " They're very small and flatchested, however." else desc += " You estimate that they're [uppertext(size)]-cups." - else if(producing && aroused_state) desc += " They're leaking [fluid_id]." @@ -96,11 +95,16 @@ size = breast_sizes[round(cached_size)] //if(!H.has_status_effect(/datum/status_effect/chem/BElarger)) H.apply_status_effect(/datum/status_effect/chem/BElarger) + message_admins("Attempting to apply.") if(16 to INFINITY) size = cached_size message_admins("Breast size: [size], [cached_size], [owner]") + if(size == 0)//Bloody byond with it's counting from 1 + size = 17 message_admins("[breast_values[prev_size]] vs [breast_values[size]]") if (!(prev_size == breast_values[size])) + if(prev_size == 0)//rabble rabble + prev_size = 17 if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") prev_size = cached_size From d0607ee85c21fa6686d38ef37d9b25a1cabf0504 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 04:43:58 +0100 Subject: [PATCH 076/608] Oneday it'll all work and everything would be great --- .../code/datums/status_effects/chems.dm | 18 ++++---- .../code/modules/arousal/organs/breasts.dm | 44 ++++++++++++------- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 14a88602f2..baaa0da0c2 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -41,15 +41,17 @@ /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M)//Removes clothes, they're too small to contain you. You belong to space now. message_admins("BElarge started!") var/mob/living/carbon/human/H = M - for(var/obj/item/W in H) + var/items = M.get_contents() + for(W in items) if(W == H.w_uniform || W == H.wear_suit) - H.dropItemToGround(W) - playsound(owner.loc, 'sound/items/poster_ripped.ogg', 50, 1) - //items |= owner.get_equipped_items(TRUE) - owner.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") - to_chat(owner, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") - //owner.dropItemToGround(owner.wear_suit) - //owner.dropItemToGround(owner.w_uniform) + M.dropItemToGround(W, TRUE) + message_admins("Dropping [W]") + playsound(owner.loc, 'sound/items/poster_ripped.ogg', 50, 1) + //items |= owner.get_equipped_items(TRUE) + owner.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") + to_chat(owner, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + //owner.dropItemToGround(owner.wear_suit) + //owner.dropItemToGround(owner.w_uniform) /datum/status_effect/chem/BElarger/tick(mob/living/carbon/M)//If you try to wear clothes, you fail. Slows you down if you're comically huge message_admins("BElarge tick!") diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 9717622c04..d945436817 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -93,24 +93,34 @@ H.remove_status_effect(/datum/status_effect/chem/BElarger) if(9 to 15) size = breast_sizes[round(cached_size)] - //if(!H.has_status_effect(/datum/status_effect/chem/BElarger)) - H.apply_status_effect(/datum/status_effect/chem/BElarger) + if(!H.has_status_effect(/datum/status_effect/chem/BElarger)) + H.apply_status_effect(/datum/status_effect/chem/BElarger) message_admins("Attempting to apply.") if(16 to INFINITY) size = cached_size - message_admins("Breast size: [size], [cached_size], [owner]") - if(size == 0)//Bloody byond with it's counting from 1 - size = 17 - message_admins("[breast_values[prev_size]] vs [breast_values[size]]") - if (!(prev_size == breast_values[size])) - if(prev_size == 0)//rabble rabble - prev_size = 17 - if (breast_values[size] > breast_values[prev_size]) - to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") - prev_size = cached_size - else if (breast_values[size] < breast_values[prev_size]) - to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") - prev_size = cached_size - icon_state = "breasts_[shape]_[size]" - H.update_body() + + if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this. + if (prev_size == 0) + prev_size = "flat" + message_admins("Breast size: [size], [cached_size], [owner]") + if(size == 0)//Bloody byond with it's counting from 1 + size = "flat" + message_admins("[prev_size] vs [breast_values[size]]") + message_admins("breast_values[size] vs [breast_values[prev_size]]") + if (breast_values[size] > breast_values[prev_size]) + to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") + //prev_size = cached_size + else if (breast_values[size] < breast_values[prev_size]) + to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") + //prev_size = cached_size + prev_size = size + icon_state = "breasts_[shape]_[size]" + H.update_body() + else + if(!isnum(prev_size)) + prev_size = breast_values[prev_size] + if(size > prev_size) + to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") + else if (size < prev_size) + to_chat(owner, "Your breasts do something crazy that the big Fermis in the sky didn't account for.") //breasts.icon_state = "breasts_[shape]_[size]_0_FRONT" From 4a94d550a34f7bb05a1dc86b454c6ef500e283ee Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 08:54:04 +0100 Subject: [PATCH 077/608] Midfix --- .../code/datums/status_effects/chems.dm | 34 +++++++------ .../code/modules/arousal/organs/breasts.dm | 48 ++++++++++--------- .../code/modules/arousal/organs/penis.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 26 ++++++---- 4 files changed, 64 insertions(+), 46 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index baaa0da0c2..f91aad7009 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -38,31 +38,36 @@ id = "BElarger" var/list/items = list() -/datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/M)//Removes clothes, they're too small to contain you. You belong to space now. +//mob/living/carbon/M = M tried, no dice +//owner, tried, no dice +/datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. message_admins("BElarge started!") - var/mob/living/carbon/human/H = M - var/items = M.get_contents() - for(W in items) + //var/mob/living/carbon/human/H = M + var/items = H.get_contents() + for(var/obj/item/W in items) if(W == H.w_uniform || W == H.wear_suit) - M.dropItemToGround(W, TRUE) + owner.dropItemToGround(W, TRUE) message_admins("Dropping [W]") playsound(owner.loc, 'sound/items/poster_ripped.ogg', 50, 1) //items |= owner.get_equipped_items(TRUE) - owner.visible_message("[M]'s chest suddenly bursts forth, ripping their clothes off!'") + owner.visible_message("[H]'s chest suddenly bursts forth, ripping their clothes off!'") to_chat(owner, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") //owner.dropItemToGround(owner.wear_suit) //owner.dropItemToGround(owner.w_uniform) + return ..() -/datum/status_effect/chem/BElarger/tick(mob/living/carbon/M)//If you try to wear clothes, you fail. Slows you down if you're comically huge +/datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge message_admins("BElarge tick!") - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - var/mob/living/carbon/human/H = M - message_admins("M: [M]") + var/mob/living/carbon/human/o = owner + var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") + //var/mob/living/carbon/human/H = M + message_admins("M: [H]") message_admins("H: [H]") message_admins("owner: [owner]") - for(var/obj/item/W in H) - if(W == H.w_uniform || W == H.wear_suit) - H.dropItemToGround(W) + var/items = o.get_contents() + for(var/obj/item/W in items) + if(W == o.w_uniform || W == o.wear_suit) + o.dropItemToGround(W) //items |= owner.get_equipped_items(TRUE) to_chat(owner, "Your enormous breasts are way to large to fit anything over!") //owner.dropItemToGround(owner.wear_suit) @@ -74,9 +79,10 @@ owner.next_move_modifier = 1 if(10 to INFINITY) if (!(B.breast_sizes[B.prev_size] == B.size)) - to_chat(M, "Your indulgent busom is so substantial, it's affecting your movements!") + to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!") owner.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (round(B.cached_size) - 8)) owner.next_move_modifier = (round(B.cached_size) - 8) + ..() /datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) owner.remove_movespeed_modifier("megamilk") diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index d945436817..7a7b43cbaa 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -11,6 +11,7 @@ var/prev_size = 3//For flavour texts var/breast_sizes = list ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "huge", "flat") var/breast_values = list ("A" = 1, "B" = 2, "C" = 3, "D" = 4, "E" = 5, "F" = 6, "G" = 7, "H" = 8, "I" = 9, "J" = 10, "K" = 11, "L" = 12, "M" = 13, "N" = 14, "O" = 15, "huge" = 16, "flat" = 0) + var/statuscheck = FALSE fluid_id = "milk" var/amount = 2 producing = TRUE @@ -50,7 +51,7 @@ else desc = "You see some breasts, they seem to be quite exotic." if(isnum(size)) - desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "big old tonhongerekoogers", "giant bonkhonagahoogs", "humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." + desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "two big old tonhongerekoogers", "a couple of giant bonkhonagahoogs", "a pair of humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." else if (!isnum(size)) if (size == "flat") desc += " They're very small and flatchested, however." @@ -75,7 +76,7 @@ //Should I turn someone with meter wide... assets into a blob? //this is far too lewd wah /obj/item/organ/genital/breasts/update_size()//wah - var/mob/living/carbon/human/H = owner + //var/mob/living/carbon/human/H = owner message_admins("Breast size at start: [size], [cached_size], [owner]") //var/sprite_accessory/breasts = mob/living/carbon/M if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! @@ -85,42 +86,45 @@ switch(round(cached_size)) if(0) size = "flat" - //if(H.has_status_effect(/datum/status_effect/chem/BElarger)) - H.remove_status_effect(/datum/status_effect/chem/BElarger) + if(statuscheck == TRUE) + message_admins("Attempting to remove.") + owner.remove_status_effect(/datum/status_effect/chem/BElarger) + statuscheck = FALSE if(1 to 8) size = breast_sizes[round(cached_size)] - //if(H.has_status_effect(/datum/status_effect/chem/BElarger)) - H.remove_status_effect(/datum/status_effect/chem/BElarger) + if(statuscheck == TRUE) + message_admins("Attempting to remove.") + owner.remove_status_effect(/datum/status_effect/chem/BElarger) + statuscheck = FALSE if(9 to 15) size = breast_sizes[round(cached_size)] - if(!H.has_status_effect(/datum/status_effect/chem/BElarger)) - H.apply_status_effect(/datum/status_effect/chem/BElarger) - message_admins("Attempting to apply.") + if(statuscheck == FALSE) + message_admins("Attempting to apply.") + owner.apply_status_effect(/datum/status_effect/chem/BElarger) + statuscheck = TRUE + if(16 to INFINITY) size = cached_size - + message_admins("Breast size: [size], [cached_size], [owner]") if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this. if (prev_size == 0) prev_size = "flat" - message_admins("Breast size: [size], [cached_size], [owner]") if(size == 0)//Bloody byond with it's counting from 1 size = "flat" - message_admins("[prev_size] vs [breast_values[size]]") - message_admins("breast_values[size] vs [breast_values[prev_size]]") - if (breast_values[size] > breast_values[prev_size]) - to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") - //prev_size = cached_size - else if (breast_values[size] < breast_values[prev_size]) - to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") - //prev_size = cached_size + message_admins("1. [prev_size] vs [breast_values[size]]") + message_admins("2. [breast_values[size]] vs [breast_values[prev_size]]") + if (breast_values[size] > breast_values[prev_size]) + to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") + else if (breast_values[size] < breast_values[prev_size]) + to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") prev_size = size icon_state = "breasts_[shape]_[size]" - H.update_body() + owner.update_body() else if(!isnum(prev_size)) prev_size = breast_values[prev_size] - if(size > prev_size) + if(round(size) > round(prev_size)) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") - else if (size < prev_size) + else if (round(size) < round(prev_size)) to_chat(owner, "Your breasts do something crazy that the big Fermis in the sky didn't account for.") //breasts.icon_state = "breasts_[shape]_[size]_0_FRONT" diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 82bc2c61d8..2665bfe449 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -48,7 +48,7 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["cock_color"]]" - owner.update_body() + //owner.update_body() /obj/item/organ/genital/penis/update_link() if(owner) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 30c555776d..f4334f3230 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -433,6 +433,7 @@ overdose_threshold = 12 metabolization_rate = 0.5 var/mob/living/carbon/human/H + var/target = get_bodypart(BODY_ZONE_CHEST) @@ -466,12 +467,12 @@ if (B.cached_size >= 8.5 && B.cached_size < 9) to_chat(M, "Your breasts begin to strain against your clothes tightly!") M.adjustOxyLoss(10, 0) - M.adjustBruteLoss(2, 0) + M.apply_damage(5, BRUTE, target) B.update() ..() -/datum/reagent/fermi/BElarger/overdose_start(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. +/datum/reagent/fermi/BElarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. var/obj/item/organ/genital/penis/P = M.getorganslot("penis") var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") @@ -483,7 +484,7 @@ M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") if(P) - P.length -= 0.1 + P.length = P.length - 0.1 if (P.length <= 0.1) to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") P.Remove(P) @@ -492,7 +493,6 @@ else if (P.length > 7) M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 10.1))//Via la liberation M.next_move_modifier -= 0.1 - H.dna.species.no_equip = list(SLOT_WEAR_SUIT, SLOT_W_UNIFORM) else M.remove_status_effect(/datum/status_effect/chem/PElarger) P.update() @@ -514,6 +514,7 @@ taste_description = "a salty and sticky substance." overdose_threshold = 12 metabolization_rate = 0.5 + var/target get_bodypart(BODY_ZONE_CHEST) //var/mob/living/carbon/M //var/mob/living/carbon/human/species/S /* @@ -552,24 +553,24 @@ else P.length = P.length + 0.1 if (P.length > 9) - M.apply_status_effect(/datum/status_effect/chem/BElarger) + M.apply_status_effect(/datum/status_effect/chem/PElarger) M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 10.1)) M.next_move_modifier += 0.1 else if (P.length > 8.5) to_chat(M, "Your cock begin to strain against your clothes tightly!") - M.adjustBruteLoss(5, 0) + M.apply_damage(5, BRUTE, target) P.update_appearance() message_admins("P size: [P.length]") ..() -/datum/reagent/fermi/PElarger/overdose_start(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. +/datum/reagent/fermi/PElarger/overdose_process(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") var/obj/item/organ/genital/womb/W = M.getorganslot("womb") - + message_admins("PE Breast status: [B]") if(M.gender == FEMALE) M.gender = MALE M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") @@ -589,7 +590,14 @@ ..() - +/datum/reagent/fermi/Astral // Gives you the ability to astral project for a moment! + name = "Astrogen" + id = "PElarger" + description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? + color = "#H60584" // rgb: 96, 0, 255 + taste_description = "a salty and sticky substance." + overdose_threshold = 12 + metabolization_rate = 0.5 From accb202d6ec0c5eb6cf20f895ec09c39799d9e84 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 09:41:10 +0100 Subject: [PATCH 078/608] BROKEN COMMIT. Just in case. --- .../code/datums/status_effects/chems.dm | 99 +++++++++++-------- .../code/modules/arousal/organs/breasts.dm | 35 +++---- .../code/modules/arousal/organs/penis.dm | 53 +++++++--- .../chemistry/reagents/fermi_reagents.dm | 83 +++++++++------- 4 files changed, 157 insertions(+), 113 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index f91aad7009..1d81eaee9d 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -36,84 +36,97 @@ /datum/status_effect/chem/BElarger id = "BElarger" - var/list/items = list() + //var/list/items = list() + var/mob/living/carbon/human/o = owner + var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") + //var/items = o.get_contents() //mob/living/carbon/M = M tried, no dice //owner, tried, no dice /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. message_admins("BElarge started!") - //var/mob/living/carbon/human/H = M - var/items = H.get_contents() - for(var/obj/item/W in items) - if(W == H.w_uniform || W == H.wear_suit) - owner.dropItemToGround(W, TRUE) - message_admins("Dropping [W]") - playsound(owner.loc, 'sound/items/poster_ripped.ogg', 50, 1) - //items |= owner.get_equipped_items(TRUE) - owner.visible_message("[H]'s chest suddenly bursts forth, ripping their clothes off!'") - to_chat(owner, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") - //owner.dropItemToGround(owner.wear_suit) - //owner.dropItemToGround(owner.w_uniform) + if(o.w_uniform) + o.dropItemToGround(H.w_uniform, TRUE) + if(o.wear_suit) + o.dropItemToGround(H.wear_suit, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + o.visible_message("[H]'s chest suddenly bursts forth, ripping their clothes off!'") + to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") return ..() /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge message_admins("BElarge tick!") - var/mob/living/carbon/human/o = owner - var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") - //var/mob/living/carbon/human/H = M - message_admins("M: [H]") - message_admins("H: [H]") - message_admins("owner: [owner]") + if(o.w_uniform) + o.dropItemToGround(H.w_uniform, TRUE) + to_chat(owner, "Your enormous breasts are way to large to fit anything over!") + if(o.wear_suit) + o.dropItemToGround(H.wear_suit, TRUE) + to_chat(owner, "Your enormous breasts are way to large to fit anything over!") + /* var/items = o.get_contents() for(var/obj/item/W in items) if(W == o.w_uniform || W == o.wear_suit) o.dropItemToGround(W) //items |= owner.get_equipped_items(TRUE) - to_chat(owner, "Your enormous breasts are way to large to fit anything over!") + //owner.dropItemToGround(owner.wear_suit) //owner.dropItemToGround(owner.w_uniform) + */ switch(round(B.cached_size)) if(9) if (!(B.breast_sizes[B.prev_size] == B.size)) - owner.remove_movespeed_modifier("megamilk") - owner.next_move_modifier = 1 + o.remove_movespeed_modifier("megamilk") + o.next_move_modifier = 1 if(10 to INFINITY) if (!(B.breast_sizes[B.prev_size] == B.size)) to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!") - owner.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (round(B.cached_size) - 8)) - owner.next_move_modifier = (round(B.cached_size) - 8) + o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (round(B.cached_size) - 8)) + o.next_move_modifier = (round(B.cached_size) - 8) ..() /datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) owner.remove_movespeed_modifier("megamilk") owner.next_move_modifier = 1 + /datum/status_effect/chem/PElarger id = "PElarger" - //var/list/items = list() + var/mob/living/carbon/human/o = owner + var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") +/datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. + message_admins("PElarge started!") + if(o.w_uniform) + o.dropItemToGround(H.w_uniform, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + if(o.wear_suit) + o.dropItemToGround(H.wear_suit, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + owner.visible_message("[M]'s schlong suddenly bursts forth, ripping their clothes off!'") + to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") + return ..() -/datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/M) - var/mob/living/carbon/human/H = M - for(var/obj/item/W in H) - if(W == H.w_uniform || W == H.wear_suit) - H.dropItemToGround(W) - playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) - //items |= M.get_equipped_items(TRUE) - owner.visible_message("[M]'s penis suddenly bursts forth, ripping their clothes off!'") - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling penis! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") - //owner.dropItemToGround(owner.wear_suit) - //owner.dropItemToGround(owner.w_uniform) /datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) - var/mob/living/carbon/human/H = M - for(var/obj/item/W in H) - if(W == H.w_uniform || W == H.wear_suit) - H.dropItemToGround(W) - //items |= M.get_equipped_items(TRUE) + message_admins("PElarge tick!") + if(o.w_uniform) + o.dropItemToGround(H.w_uniform, TRUE) to_chat(owner, "Your enormous package is way to large to fit anything over!") - //owner.dropItemToGround(owner.wear_suit) - //owner.dropItemToGround(owner.w_uniform) + if(o.wear_suit) + o.dropItemToGround(H.wear_suit, TRUE) + to_chat(owner, "Your enormous package is way to large to fit anything over!") + switch(round(P.cached_size)) + if(11) + if (!(P.prev_size == P.size)) + to_chat(H, "Your rascally willy has become a more managable size, liberating your movements.") + o.remove_movespeed_modifier("hugedick") + o.next_move_modifier = 1 + if(12 to INFINITY) + if (!(P.prev_size == P.size)) + to_chat(H, "Your indulgent johnson is so substantial, it's affecting your movements!") + o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 11.1)) + o.next_move_modifier = (round(B.cached_size) - 8) + ..() /*Doesn't work diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 7a7b43cbaa..2f51cfb26f 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -76,55 +76,48 @@ //Should I turn someone with meter wide... assets into a blob? //this is far too lewd wah /obj/item/organ/genital/breasts/update_size()//wah - //var/mob/living/carbon/human/H = owner message_admins("Breast size at start: [size], [cached_size], [owner]") - //var/sprite_accessory/breasts = mob/living/carbon/M if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! var/obj/item/organ/genital/breasts/B = owner.getorganslot("breasts") to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") B.Remove(owner) switch(round(cached_size)) - if(0) + if(0) //If flatchested size = "flat" if(statuscheck == TRUE) message_admins("Attempting to remove.") owner.remove_status_effect(/datum/status_effect/chem/BElarger) statuscheck = FALSE - if(1 to 8) + if(1 to 8) //If modest size size = breast_sizes[round(cached_size)] if(statuscheck == TRUE) message_admins("Attempting to remove.") owner.remove_status_effect(/datum/status_effect/chem/BElarger) statuscheck = FALSE - if(9 to 15) + if(9 to 15) //If massive size = breast_sizes[round(cached_size)] if(statuscheck == FALSE) message_admins("Attempting to apply.") owner.apply_status_effect(/datum/status_effect/chem/BElarger) statuscheck = TRUE - if(16 to INFINITY) + if(16 to INFINITY) //if Rediculous size = cached_size message_admins("Breast size: [size], [cached_size], [owner]") if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this. - if (prev_size == 0) - prev_size = "flat" - if(size == 0)//Bloody byond with it's counting from 1 - size = "flat" - message_admins("1. [prev_size] vs [breast_values[size]]") + if (!isnum(prev_size)) + breast_values[prev_size] + if(!isnum(prev_size)//Bloody byond with it's counting from 1 + breast_values[prev_size] message_admins("2. [breast_values[size]] vs [breast_values[prev_size]]") if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") else if (breast_values[size] < breast_values[prev_size]) - to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "shrivels into")] a [uppertext(size)]-cup.") + to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size)]-cup.") prev_size = size - icon_state = "breasts_[shape]_[size]" - owner.update_body() - else - if(!isnum(prev_size)) - prev_size = breast_values[prev_size] - if(round(size) > round(prev_size)) + icon_state = sanitize_text("breasts_[shape]_[size]") + + else (cached_size == 16.2) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") - else if (round(size) < round(prev_size)) - to_chat(owner, "Your breasts do something crazy that the big Fermis in the sky didn't account for.") - //breasts.icon_state = "breasts_[shape]_[size]_0_FRONT" + owner.update_body() + B.update_icon() diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 2665bfe449..f2219bf597 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -18,23 +18,50 @@ var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF var/list/dickflags = list() var/list/knotted_types = list("knotted", "barbed, knotted") + var/mob/living/carbon/human/o = owner + var/statuscheck = FALSE + var/prev_size = 6 + /obj/item/organ/genital/penis/update_size() - if(length == cached_length) - return - switch(length) - if(-INFINITY to 5) + + if(cached_length < 0)//I don't actually know what round() does to negative numbers, so to be safe!! + var/obj/item/organ/genital/penis/P = o.getorganslot("breasts") + to_chat(o, "You feel your tallywacker shrinking away from your body as your groin flattens out!") + P.Remove(o) + switch(round(cached_length)) + if(0 to 4) //If modest size + length = cached_length size = 1 - if(5 to 9) + if(statuscheck == TRUE) + message_admins("Attempting to remove.") + o.remove_status_effect(/datum/status_effect/chem/PElarger) + statuscheck = FALSE + if(5 to 8) //If modest size + length = cached_length size = 2 - if(9 to INFINITY) - size = 3//no new sprites for anything larger yet -/* if(9 to 15) - size = 3 - if(15 to INFINITY) - size = 3*/ + if(statuscheck == TRUE) + message_admins("Attempting to remove.") + o.remove_status_effect(/datum/status_effect/chem/PElarger) + statuscheck = FALSE + if(9 to INFINITY) //If massive + length = cached_length + size = 3 //no new sprites for anything larger yet + if(statuscheck == FALSE) + message_admins("Attempting to apply.") + o.apply_status_effect(/datum/status_effect/chem/PElarger) + statuscheck = TRUE + message_admins("Pinas size: [size], [cached_length], [o]") + message_admins("2. size vs prev_size") + if (round(length) > round(prev_size)) + to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(size)] inch penis.") + else if (round(length) < round(prev_size)) + to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(size)] inch penis.") + prev_size = length + icon_state = sanitize_text("penis_[shape]_[size]") + o.update_body() + P.update_icon() girth = (length * girth_ratio) - cached_length = length /obj/item/organ/genital/penis/update_appearance() var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" @@ -48,7 +75,7 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["cock_color"]]" - //owner.update_body() + H.update_body() /obj/item/organ/genital/penis/update_link() if(owner) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index f4334f3230..f533fc517a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -433,7 +433,6 @@ overdose_threshold = 12 metabolization_rate = 0.5 var/mob/living/carbon/human/H - var/target = get_bodypart(BODY_ZONE_CHEST) @@ -465,10 +464,10 @@ message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.cached_size = B.cached_size + 0.1 if (B.cached_size >= 8.5 && B.cached_size < 9) + var/target = M.get_bodypart(BODY_ZONE_CHEST) to_chat(M, "Your breasts begin to strain against your clothes tightly!") M.adjustOxyLoss(10, 0) - M.apply_damage(5, BRUTE, target) - + M.apply_damage(2, BRUTE, target) B.update() ..() @@ -485,17 +484,10 @@ if(P) P.length = P.length - 0.1 - if (P.length <= 0.1) - to_chat(M, "You feel your penis shink, disappearing from your loins, leaving a strange smoothness in your pants.") - P.Remove(P) - if(T) - T.Remove(M) - else if (P.length > 7) - M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 10.1))//Via la liberation - M.next_move_modifier -= 0.1 - else - M.remove_status_effect(/datum/status_effect/chem/PElarger) - P.update() + message_admins("Breast size: [P.size], [P.cached_size], [holder]") + P.update() + if(T) + T.Remove(M) if(!V) var/obj/item/organ/genital/vagina/nV = new nV.Insert(M) @@ -514,7 +506,6 @@ taste_description = "a salty and sticky substance." overdose_threshold = 12 metabolization_rate = 0.5 - var/target get_bodypart(BODY_ZONE_CHEST) //var/mob/living/carbon/M //var/mob/living/carbon/human/species/S /* @@ -527,36 +518,47 @@ var/mob/living/carbon/human/H /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size - /* - switch(current_cycle) - if(0) - */ + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + if(!B) //If they don't have breasts, give them breasts. + message_admins("No breasts found!") + var/obj/item/organ/genital/breasts/nB = new + nB.Insert(M) + if(nB) + if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) + nB.color = skintone2hex(H.skin_tone) + else if(M.dna.features["breasts_color"]) + nB.color = "#[M.dna.features["breasts_color"]]" + else + nB.color = skintone2hex(H.skin_tone) + nB.size = "flat" + + to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") + + B = nB + //If they have them, increase size. If size is comically big, limit movement and rip clothes. + message_admins("Breast size: [B.size], [B.cached_size], [holder]") + B.cached_size = B.cached_size + 0.1 + + B.update() var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) - message_admins("No penis found!") + message_admins("No penis found!")//They do have a preponderance for escapism, or so I've heard. var/obj/item/organ/genital/penis/nP = new nP.Insert(M) if(nP) - /* - if(M.dna.species.use_skintones && H.dna.features["genitals_use_skintone"]) - nP.color = skintone2hex(H.skin_tone) - else if(M.dna.features["cock_color"]) - nP.color = "#[M.dna.features["cock_color"]]" - else*/ - //nP.color = skintone2hex(H.skin_tone) nP.length = 0.2 - to_chat(M, "Your groin feels warm, as you feel a new bulge down below.") + to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.")//OwO + nP.cached_length = 0 + nP.prev_size = 0 + M.reagents.remove_reagent(src.id, 5) P = nP - P.update_size() else P.length = P.length + 0.1 - if (P.length > 9) - M.apply_status_effect(/datum/status_effect/chem/PElarger) - M.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 10.1)) - M.next_move_modifier += 0.1 - else if (P.length > 8.5) + if (P.cached_size >= 10.5 && P.cached_length < 11) //too low? + M.apply_damage(2, BRUTE, target) + var/target = M.get_bodypart(BODY_ZONE_CHEST) to_chat(M, "Your cock begin to strain against your clothes tightly!") M.apply_damage(5, BRUTE, target) @@ -586,13 +588,22 @@ if(!T) var/obj/item/organ/genital/testicles/nT = new nT.Insert(M) - + T = nT ..() /datum/reagent/fermi/Astral // Gives you the ability to astral project for a moment! name = "Astrogen" - id = "PElarger" + id = "astral" + description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? + color = "#H60584" // rgb: 96, 0, 255 + taste_description = "a salty and sticky substance." + overdose_threshold = 12 + metabolization_rate = 0.5 + +/datum/reagent/fermi/Astral // Gives you the ability to astral project for a moment! + name = "Astrogen" + id = "astral" description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? color = "#H60584" // rgb: 96, 0, 255 taste_description = "a salty and sticky substance." From 3c82bb2d4654a8bf1fc8d79002c5abb6ed419184 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 10:38:35 +0100 Subject: [PATCH 079/608] PElarger BElarger finalise 0.1 --- .../code/datums/status_effects/chems.dm | 45 ++++++++++--------- .../code/modules/arousal/organs/breasts.dm | 14 +++--- .../code/modules/arousal/organs/penis.dm | 8 ++-- .../chemistry/reagents/fermi_reagents.dm | 30 +------------ 4 files changed, 37 insertions(+), 60 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 1d81eaee9d..60a0165b17 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -37,31 +37,33 @@ /datum/status_effect/chem/BElarger id = "BElarger" //var/list/items = list() - var/mob/living/carbon/human/o = owner - var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") //var/items = o.get_contents() //mob/living/carbon/M = M tried, no dice //owner, tried, no dice /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. - message_admins("BElarge started!") + var/mob/living/carbon/human/o = owner if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) + o.dropItemToGround(H.w_uniform, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) - playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + o.dropItemToGround(H.wear_suit, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + message_admins("BElarge started!") o.visible_message("[H]'s chest suddenly bursts forth, ripping their clothes off!'") to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") return ..() /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge - message_admins("BElarge tick!") + var/mob/living/carbon/human/o = owner + var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) + o.dropItemToGround(H.w_uniform, TRUE) to_chat(owner, "Your enormous breasts are way to large to fit anything over!") if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) + o.dropItemToGround(H.wear_suit, TRUE) to_chat(owner, "Your enormous breasts are way to large to fit anything over!") + message_admins("BElarge tick!") /* var/items = o.get_contents() for(var/obj/item/W in items) @@ -91,41 +93,42 @@ /datum/status_effect/chem/PElarger id = "PElarger" - var/mob/living/carbon/human/o = owner - var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") /datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. message_admins("PElarge started!") + var/mob/living/carbon/human/o = owner if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) + o.dropItemToGround(H.w_uniform, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) + o.dropItemToGround(H.wear_suit, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) - owner.visible_message("[M]'s schlong suddenly bursts forth, ripping their clothes off!'") - to_chat(M, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") + owner.visible_message("[o]'s schlong suddenly bursts forth, ripping their clothes off!'") + to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") return ..() /datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) + var/mob/living/carbon/human/o = owner + var/obj/item/organ/genital/penis/P = o.getorganslot("penis") message_admins("PElarge tick!") if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) + o.dropItemToGround(o.w_uniform, TRUE) to_chat(owner, "Your enormous package is way to large to fit anything over!") if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) + o.dropItemToGround(o.wear_suit, TRUE) to_chat(owner, "Your enormous package is way to large to fit anything over!") - switch(round(P.cached_size)) + switch(round(P.cached_length)) if(11) if (!(P.prev_size == P.size)) - to_chat(H, "Your rascally willy has become a more managable size, liberating your movements.") + to_chat(o, "Your rascally willy has become a more managable size, liberating your movements.") o.remove_movespeed_modifier("hugedick") o.next_move_modifier = 1 if(12 to INFINITY) if (!(P.prev_size == P.size)) - to_chat(H, "Your indulgent johnson is so substantial, it's affecting your movements!") + to_chat(o, "Your indulgent johnson is so substantial, it's affecting your movements!") o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 11.1)) - o.next_move_modifier = (round(B.cached_size) - 8) + o.next_move_modifier = (round(P.length) - 11) ..() diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 2f51cfb26f..9e1dfa2417 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -76,9 +76,9 @@ //Should I turn someone with meter wide... assets into a blob? //this is far too lewd wah /obj/item/organ/genital/breasts/update_size()//wah + var/obj/item/organ/genital/breasts/B = owner.getorganslot("breasts") message_admins("Breast size at start: [size], [cached_size], [owner]") if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! - var/obj/item/organ/genital/breasts/B = owner.getorganslot("breasts") to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") B.Remove(owner) switch(round(cached_size)) @@ -105,10 +105,10 @@ size = cached_size message_admins("Breast size: [size], [cached_size], [owner]") if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this. - if (!isnum(prev_size)) - breast_values[prev_size] - if(!isnum(prev_size)//Bloody byond with it's counting from 1 - breast_values[prev_size] + if (isnum(prev_size)) + prev_size = breast_values[prev_size]//make numbers letters + if(isnum(size))//Bloody byond with it's counting from 1 + size = breast_values[size] //make numbers letters message_admins("2. [breast_values[size]] vs [breast_values[prev_size]]") if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") @@ -117,7 +117,7 @@ prev_size = size icon_state = sanitize_text("breasts_[shape]_[size]") - else (cached_size == 16.2) - to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") + else if (cached_size == 16.2) + to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") owner.update_body() B.update_icon() diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index f2219bf597..191951f408 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -18,13 +18,12 @@ var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF var/list/dickflags = list() var/list/knotted_types = list("knotted", "barbed, knotted") - var/mob/living/carbon/human/o = owner var/statuscheck = FALSE var/prev_size = 6 /obj/item/organ/genital/penis/update_size() - + var/mob/living/carbon/human/o = owner if(cached_length < 0)//I don't actually know what round() does to negative numbers, so to be safe!! var/obj/item/organ/genital/penis/P = o.getorganslot("breasts") to_chat(o, "You feel your tallywacker shrinking away from your body as your groin flattens out!") @@ -60,10 +59,11 @@ prev_size = length icon_state = sanitize_text("penis_[shape]_[size]") o.update_body() - P.update_icon() + //P.update_icon() girth = (length * girth_ratio) /obj/item/organ/genital/penis/update_appearance() + var/mob/living/carbon/human/o = owner var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" icon_state = sanitize_text(string) var/lowershape = lowertext(shape) @@ -75,7 +75,7 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["cock_color"]]" - H.update_body() + o.update_body() /obj/item/organ/genital/penis/update_link() if(owner) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index f533fc517a..ecca3f27a0 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -484,7 +484,7 @@ if(P) P.length = P.length - 0.1 - message_admins("Breast size: [P.size], [P.cached_size], [holder]") + message_admins("Breast size: [P.size], [P.cached_length], [holder]") P.update() if(T) T.Remove(M) @@ -518,30 +518,6 @@ var/mob/living/carbon/human/H /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size - - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - if(!B) //If they don't have breasts, give them breasts. - message_admins("No breasts found!") - var/obj/item/organ/genital/breasts/nB = new - nB.Insert(M) - if(nB) - if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) - nB.color = skintone2hex(H.skin_tone) - else if(M.dna.features["breasts_color"]) - nB.color = "#[M.dna.features["breasts_color"]]" - else - nB.color = skintone2hex(H.skin_tone) - nB.size = "flat" - - to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") - - B = nB - //If they have them, increase size. If size is comically big, limit movement and rip clothes. - message_admins("Breast size: [B.size], [B.cached_size], [holder]") - B.cached_size = B.cached_size + 0.1 - - B.update() - var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) message_admins("No penis found!")//They do have a preponderance for escapism, or so I've heard. @@ -556,14 +532,12 @@ P = nP else P.length = P.length + 0.1 - if (P.cached_size >= 10.5 && P.cached_length < 11) //too low? - M.apply_damage(2, BRUTE, target) + if (P.cached_length >= 10.5 && P.cached_length < 11) //too low? var/target = M.get_bodypart(BODY_ZONE_CHEST) to_chat(M, "Your cock begin to strain against your clothes tightly!") M.apply_damage(5, BRUTE, target) P.update_appearance() - message_admins("P size: [P.length]") ..() /datum/reagent/fermi/PElarger/overdose_process(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. From 890b3f8d7d85d12ad2be06afbf51d77e16d350e3 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 15:55:23 +0100 Subject: [PATCH 080/608] Added Astral beta chem. --- .../code/datums/status_effects/chems.dm | 54 +++++---- .../code/modules/arousal/organs/breasts.dm | 25 ++-- .../code/modules/arousal/organs/penis.dm | 10 +- .../chemistry/reagents/fermi_reagents.dm | 109 ++++++++++++++---- .../reagents/chemistry/recipes/fermi.dm | 2 +- 5 files changed, 131 insertions(+), 69 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 60a0165b17..61e7c7a90c 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -21,7 +21,7 @@ return ..() /datum/status_effect/chem/SGDF/tick() - message_admins("SDGF ticking") + //message_admins("SDGF ticking") if(owner.stat == DEAD) message_admins("SGDF status swapping") if(fermi_Clone && fermi_Clone.stat != DEAD) @@ -43,27 +43,26 @@ //owner, tried, no dice /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. var/mob/living/carbon/human/o = owner - if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) - playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) - if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) - playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) - message_admins("BElarge started!") - o.visible_message("[H]'s chest suddenly bursts forth, ripping their clothes off!'") + var/items = o.get_contents() + for(var/obj/item/W in items) + if(W == o.w_uniform || W == o.wear_suit) + o.dropItemToGround(W, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + //message_admins("BElarge started!") + o.visible_message("[o]'s chest suddenly bursts forth, ripping their clothes off!'") to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") return ..() /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") - if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) - to_chat(owner, "Your enormous breasts are way to large to fit anything over!") - if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) - to_chat(owner, "Your enormous breasts are way to large to fit anything over!") - message_admins("BElarge tick!") + var/items = o.get_contents() + for(var/obj/item/W in items) + if(W == o.w_uniform || W == o.wear_suit) + o.dropItemToGround(W, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + to_chat(owner, "Your enormous breasts are way too large to fit anything over them!") + //message_admins("BElarge tick!") /* var/items = o.get_contents() for(var/obj/item/W in items) @@ -97,12 +96,11 @@ /datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. message_admins("PElarge started!") var/mob/living/carbon/human/o = owner - if(o.w_uniform) - o.dropItemToGround(H.w_uniform, TRUE) - playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) - if(o.wear_suit) - o.dropItemToGround(H.wear_suit, TRUE) - playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + var/items = o.get_contents() + for(var/obj/item/W in items) + if(W == o.w_uniform || W == o.wear_suit) + o.dropItemToGround(W, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) owner.visible_message("[o]'s schlong suddenly bursts forth, ripping their clothes off!'") to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") return ..() @@ -112,12 +110,12 @@ var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/penis/P = o.getorganslot("penis") message_admins("PElarge tick!") - if(o.w_uniform) - o.dropItemToGround(o.w_uniform, TRUE) - to_chat(owner, "Your enormous package is way to large to fit anything over!") - if(o.wear_suit) - o.dropItemToGround(o.wear_suit, TRUE) - to_chat(owner, "Your enormous package is way to large to fit anything over!") + var/items = o.get_contents() + for(var/obj/item/W in items) + if(W == o.w_uniform || W == o.wear_suit) + o.dropItemToGround(W, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + to_chat(owner, "Your enormous package is way to large to fit anything over!") switch(round(P.cached_length)) if(11) if (!(P.prev_size == P.size)) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 9e1dfa2417..ae4d05cc58 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -76,11 +76,12 @@ //Should I turn someone with meter wide... assets into a blob? //this is far too lewd wah /obj/item/organ/genital/breasts/update_size()//wah - var/obj/item/organ/genital/breasts/B = owner.getorganslot("breasts") + //var/mob/living/carbon/human/o = owner + //var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") message_admins("Breast size at start: [size], [cached_size], [owner]") if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") - B.Remove(owner) + src.Remove(owner) switch(round(cached_size)) if(0) //If flatchested size = "flat" @@ -103,21 +104,25 @@ if(16 to INFINITY) //if Rediculous size = cached_size - message_admins("Breast size: [size], [cached_size], [owner]") + //message_admins("1. [breast_values[size]] vs [breast_values[prev_size]] || [size] vs [prev_size]") + //message_admins("1. [prev_size] vs [breast_values[size]]") if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this. - if (isnum(prev_size)) - prev_size = breast_values[prev_size]//make numbers letters - if(isnum(size))//Bloody byond with it's counting from 1 - size = breast_values[size] //make numbers letters - message_admins("2. [breast_values[size]] vs [breast_values[prev_size]]") + if (prev_size == 0) + prev_size = "flat" + if(size == 0)//Bloody byond with it's counting from 1 + size = "flat" + if(isnum(prev_size)) + prev_size = breast_sizes[prev_size] + message_admins("2. [breast_values[size]] vs [breast_values[prev_size]] || [size] vs [prev_size]") if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") else if (breast_values[size] < breast_values[prev_size]) to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size)]-cup.") prev_size = size - icon_state = sanitize_text("breasts_[shape]_[size]") else if (cached_size == 16.2) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") + + icon_state = sanitize_text("breasts_[shape]_[size]") owner.update_body() - B.update_icon() + update_icon() diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 191951f408..c5ee246e9a 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -25,7 +25,7 @@ /obj/item/organ/genital/penis/update_size() var/mob/living/carbon/human/o = owner if(cached_length < 0)//I don't actually know what round() does to negative numbers, so to be safe!! - var/obj/item/organ/genital/penis/P = o.getorganslot("breasts") + var/obj/item/organ/genital/penis/P = o.getorganslot("penis") to_chat(o, "You feel your tallywacker shrinking away from your body as your groin flattens out!") P.Remove(o) switch(round(cached_length)) @@ -58,12 +58,12 @@ to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(size)] inch penis.") prev_size = length icon_state = sanitize_text("penis_[shape]_[size]") - o.update_body() - //P.update_icon() + //update_body() + //P.update_icon() //Either of these don't work, why??? girth = (length * girth_ratio) /obj/item/organ/genital/penis/update_appearance() - var/mob/living/carbon/human/o = owner + //var/mob/living/carbon/o = owner var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" icon_state = sanitize_text(string) var/lowershape = lowertext(shape) @@ -75,7 +75,7 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["cock_color"]]" - o.update_body() + owner.update_body() /obj/item/organ/genital/penis/update_link() if(owner) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index ecca3f27a0..e9b154d934 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -30,7 +30,7 @@ id = "eigenstate" description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" taste_description = "wiggly" - color = "#60A584" // rgb: 96, 0, 255 + color = "#5020H4" // rgb: 50, 20, 255 overdose_threshold = 15 addiction_threshold = 20 metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -434,8 +434,6 @@ metabolization_rate = 0.5 var/mob/living/carbon/human/H - - /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size /* switch(current_cycle) @@ -526,18 +524,18 @@ if(nP) nP.length = 0.2 to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.")//OwO - nP.cached_length = 0 - nP.prev_size = 0 + nP.cached_length = 0.1 + nP.prev_size = 0.1 M.reagents.remove_reagent(src.id, 5) P = nP - else - P.length = P.length + 0.1 - if (P.cached_length >= 10.5 && P.cached_length < 11) //too low? - var/target = M.get_bodypart(BODY_ZONE_CHEST) - to_chat(M, "Your cock begin to strain against your clothes tightly!") - M.apply_damage(5, BRUTE, target) - P.update_appearance() + P.cached_length = P.cached_length + 0.1 + if (P.cached_length >= 10.5 && P.cached_length < 11) //too low? + var/target = M.get_bodypart(BODY_ZONE_CHEST) + to_chat(M, "Your cock begin to strain against your clothes tightly!") + M.apply_damage(5, BRUTE, target) + + P.update() ..() /datum/reagent/fermi/PElarger/overdose_process(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. @@ -566,24 +564,85 @@ ..() -/datum/reagent/fermi/Astral // Gives you the ability to astral project for a moment! +/datum/reagent/fermi/astral // Gives you the ability to astral project for a moment! name = "Astrogen" id = "astral" - description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? - color = "#H60584" // rgb: 96, 0, 255 + description = "An opalescent murky liquid that is said to distort your soul from your being." + color = "#6600A4" // rgb: 96, 0, 255 taste_description = "a salty and sticky substance." - overdose_threshold = 12 - metabolization_rate = 0.5 + metabolization_rate = 2.5 + overdose_threshold = 20 + addiction_threshold = 30 + addiction_stage1_end = 9999//Should never end. + var/mob/living/carbon/origin + var/mob/living/simple_animal/hostile/retaliate/ghost/G = null -/datum/reagent/fermi/Astral // Gives you the ability to astral project for a moment! - name = "Astrogen" - id = "astral" - description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? - color = "#H60584" // rgb: 96, 0, 255 - taste_description = "a salty and sticky substance." - overdose_threshold = 12 - metabolization_rate = 0.5 +/datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! + switch(current_cycle) + if(1) + //var/mob/living/carbon/H = M + M.alpha = 255 + origin = M + if (G == null) + G = new(get_turf(M.loc)) + G.attacktext = "raises the hairs on the neck of" + G.response_harm = "disrupts the concentration of" + G.response_disarm = "wafts" + G.loot = null + G.maxHealth = 5 + G.health = 5 + G.melee_damage_lower = 0 + G.melee_damage_upper = 0 + G.deathmessage = "disappears as if it was never really there to begin with" + G.incorporeal_move = 1 + G.alpha = 25 + G.name = "[M]'s astral ghost" + M.mind.transfer_to(G) + ..() +/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) + G.mind.transfer_to(origin) + qdel(G) + ..() + +/datum/reagent/fermi/astral/overdose_start(mob/living/carbon/M) + origin.Sleeping(100, 0) + G.Sleeping(100, 0) + ..() + +//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body (cloning only..?). +/datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) + if(prob(50)) + M.alpha = M.alpha - 1 + switch(M.alpha) + if(245) + to_chat(M, "You notice your body starting to disappear, maybe you took too much Astrogen...?") + M.alpha = M.alpha - 1 + if(220) + to_chat(M, "Your addiction is only getting worse as your body disappears. Maybe you should get some more, and fast?") + M.alpha = M.alpha - 1 + if(180) + to_chat(M, "You're starting to get scared as more and more of your body and conciousness begins to fade.") + M.alpha = M.alpha - 1 + if(120) + to_chat(M, "As you lose more and more of yourself, you start to think that maybe shedding your mortality isn't too bad.") + M.alpha = M.alpha - 1 + if(100) + to_chat(M, "You feel a substantial part of your soul flake off into the ethereal world, rendering yourself unclonable.") + M.alpha = M.alpha - 1 + M.add_trait(TRAIT_NOCLONE) + if(80) + to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates the coming oblivion of your self.") + M.alpha = M.alpha - 1 + if(45) + to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.") + M.alpha = M.alpha - 1 + if(M.alpha <= 30) + to_chat(M, "Your body disperses from exisitance, as you become one with the universe.") + to_chat(M, "As your body disappears, your conciousness doesn't. Should you find a way back into the mortal coil, your memories of the afterlife remain with you. (At the cost of staying in character while dead.)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable I will propose the idea that the player can retain living memories across lives if they die in this way only. + M.visible_message("[M] suddenly disappears, their body evaporatting from exisitance, freeing [M] from their mortal coil.") + qdel(M) + ..() /* diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 82c495b352..604faaffef 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -25,7 +25,7 @@ /datum/chemical_reaction/eigenstate/on_reaction(datum/reagents/holder) var/location = get_turf(holder.my_atom) - var/reagent/fermi/eigenstate/location_created = location + var/datum/reagent/fermi/eigenstate/location_created = location //serum /datum/chemical_reaction/SDGF From a491b981854a9cbe14f77101313144e7bf0ed509 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 16:49:26 +0100 Subject: [PATCH 081/608] Few tweaks to Astral. --- .../chemistry/reagents/fermi_reagents.dm | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index e9b154d934..285ec0f98f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -568,9 +568,9 @@ name = "Astrogen" id = "astral" description = "An opalescent murky liquid that is said to distort your soul from your being." - color = "#6600A4" // rgb: 96, 0, 255 - taste_description = "a salty and sticky substance." - metabolization_rate = 2.5 + color = "#A080H4" // rgb: , 0, 255 + taste_description = "velvety brambles " + metabolization_rate = 0 overdose_threshold = 20 addiction_threshold = 30 addiction_stage1_end = 9999//Should never end. @@ -595,9 +595,10 @@ G.melee_damage_upper = 0 G.deathmessage = "disappears as if it was never really there to begin with" G.incorporeal_move = 1 - G.alpha = 25 - G.name = "[M]'s astral ghost" + G.alpha = 35 + G.name = "[M]'s astral projection" M.mind.transfer_to(G) + holder.remove_reagent(src.id, current_cycle, FALSE) ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) @@ -606,11 +607,13 @@ ..() /datum/reagent/fermi/astral/overdose_start(mob/living/carbon/M) - origin.Sleeping(100, 0) - G.Sleeping(100, 0) + M.Sleeping(100, 0) + if(prob(25)) + to_chat(M, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") + G.forcemove(M.loc) ..() -//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body (cloning only..?). +//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. /datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) if(prob(50)) M.alpha = M.alpha - 1 From 81ad07aff33559b729c0e93532594398a33523ec Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 17:38:01 +0100 Subject: [PATCH 082/608] Astral final fixes --- .../chemistry/reagents/fermi_reagents.dm | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 285ec0f98f..1dec95865b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -578,10 +578,11 @@ var/mob/living/simple_animal/hostile/retaliate/ghost/G = null /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! + M.alpha = 255//Reset addiction switch(current_cycle) - if(1) + if(1)//Require a minimum //var/mob/living/carbon/H = M - M.alpha = 255 + //M.alpha = 255 origin = M if (G == null) G = new(get_turf(M.loc)) @@ -604,13 +605,15 @@ /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) G.mind.transfer_to(origin) qdel(G) + if(overdose) + M.Sleeping(10*volume, 0) ..() /datum/reagent/fermi/astral/overdose_start(mob/living/carbon/M) - M.Sleeping(100, 0) - if(prob(25)) - to_chat(M, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") - G.forcemove(M.loc) + if (!G == null) + if(prob(70)) + to_chat(M, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") + do_teleport(G, M.loc) ..() //Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. @@ -635,7 +638,7 @@ M.alpha = M.alpha - 1 M.add_trait(TRAIT_NOCLONE) if(80) - to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates the coming oblivion of your self.") + to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates the forthcoming oblivion.") M.alpha = M.alpha - 1 if(45) to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.") @@ -656,7 +659,7 @@ alpha = 20 reduce viewrange? */ -/* + //Nanite removal //Writen by Trilby!! /datum/reagent/fermi/naninte_b_gone @@ -665,16 +668,16 @@ reduce viewrange? description = "A rather simple toxin to small nano machines that will kill them off at a rapid rate well in system." color = "#5a7267" // rgb: 90, 114, 103 overdose_threshold = 25 + var/component/nanites/nan /datum/reagent/fermi/naninte_b_gone/on_mob_life(mob/living/carbon/C) - if(C./datum/component/nanites) + if(nan in C) regen_rate = -5.0 else return /datum/reagent/fermi/naninte_b_gone/overdose_start(mob/living/carbon/C) - if(C./datum/component/nanites) + if(nan in C) regen_rate = -7.5 else return -*/ From 8c17f6bbe935b9fc7bcc13435938301be4192791 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 18:41:20 +0100 Subject: [PATCH 083/608] yey new people --- .../chemistry/reagents/fermi_reagents.dm | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 1dec95865b..8d3be59915 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -576,6 +576,8 @@ addiction_stage1_end = 9999//Should never end. var/mob/living/carbon/origin var/mob/living/simple_animal/hostile/retaliate/ghost/G = null + var/ODing = FALSE + var/Svol = volume /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! M.alpha = 255//Reset addiction @@ -605,11 +607,13 @@ /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) G.mind.transfer_to(origin) qdel(G) - if(overdose) - M.Sleeping(10*volume, 0) + if(ODing = TRUE) + M.Sleeping(10*Svol, 0) + ODing = FALSE ..() /datum/reagent/fermi/astral/overdose_start(mob/living/carbon/M) + ODing = TRUE if (!G == null) if(prob(70)) to_chat(M, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") @@ -628,7 +632,7 @@ to_chat(M, "Your addiction is only getting worse as your body disappears. Maybe you should get some more, and fast?") M.alpha = M.alpha - 1 if(180) - to_chat(M, "You're starting to get scared as more and more of your body and conciousness begins to fade.") + to_chat(M, "You're starting to get scared as more and more of your body and consciousness begins to fade.") M.alpha = M.alpha - 1 if(120) to_chat(M, "As you lose more and more of yourself, you start to think that maybe shedding your mortality isn't too bad.") @@ -644,9 +648,9 @@ to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.") M.alpha = M.alpha - 1 if(M.alpha <= 30) - to_chat(M, "Your body disperses from exisitance, as you become one with the universe.") - to_chat(M, "As your body disappears, your conciousness doesn't. Should you find a way back into the mortal coil, your memories of the afterlife remain with you. (At the cost of staying in character while dead.)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable I will propose the idea that the player can retain living memories across lives if they die in this way only. - M.visible_message("[M] suddenly disappears, their body evaporatting from exisitance, freeing [M] from their mortal coil.") + to_chat(M, "Your body disperses from existence, as you become one with the universe.") + to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of the afterlife remain with you. (At the cost of staying in character while dead.)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. + M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") qdel(M) ..() @@ -659,7 +663,7 @@ alpha = 20 reduce viewrange? */ - +/* //Nanite removal //Writen by Trilby!! /datum/reagent/fermi/naninte_b_gone @@ -668,16 +672,17 @@ reduce viewrange? description = "A rather simple toxin to small nano machines that will kill them off at a rapid rate well in system." color = "#5a7267" // rgb: 90, 114, 103 overdose_threshold = 25 - var/component/nanites/nan + v/component/nanites/nan /datum/reagent/fermi/naninte_b_gone/on_mob_life(mob/living/carbon/C) - if(nan in C) - regen_rate = -5.0 - else + var/component/nanites/nane = C.GetComponent(/component/nanites) + if(isnull(nane)) return + nane.regen_rate = -5.0 /datum/reagent/fermi/naninte_b_gone/overdose_start(mob/living/carbon/C) - if(nan in C) - regen_rate = -7.5 - else + var/component/nanites/nane = C.GetComponent(/component/nanites) + if(isnull(nane)) return + nane.regen_rate = -7.5 +*/ From 1c910ba9fe31bf51badc1c26e16cd78367a51cc7 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Apr 2019 19:47:43 +0100 Subject: [PATCH 084/608] Minor fix to SDGF --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 8d3be59915..2b07526ae7 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -306,17 +306,17 @@ switch(current_cycle) if(21) to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") - if(21 to 29) + if(22 to 29) M.nutrition = M.nutrition + (M.nutrition/10) if(30) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") - if(30 to 49) + if(31 to 49) M.nutrition = M.nutrition + (M.nutrition/5) if(50) to_chat(M, "The synthetic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") M.next_move_modifier += 4//If this makes you fast then please fix it, it should make you slow!! //candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies - if(50 to 79) + if(51 to 79) M.nutrition = M.nutrition + (M.nutrition/2) if(80) to_chat(M, "The cells begin to precipitate outwards of your body, you feel like you'll split soon...") @@ -622,7 +622,7 @@ //Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. /datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) - if(prob(50)) + if(prob(65)) M.alpha = M.alpha - 1 switch(M.alpha) if(245) From 00804b9f61b8645062b854db1a914a67806fa5b1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 29 Apr 2019 19:30:36 +0100 Subject: [PATCH 085/608] Breasts are still bust 2 new react vars New broken chems: Furranium Yeehaw --- .../chemistry/reagents/medicine_reagents.dm | 3 ++ code/modules/reagents/chemistry/recipes.dm | 3 ++ .../code/datums/status_effects/chems.dm | 19 +++++++ .../code/modules/arousal/organs/breasts.dm | 13 +++-- .../clothing/fermichemclothe/fermiclothes.dm | 16 ++++++ .../chemistry/reagents/fermi_reagents.dm | 52 ++++++++++++++++--- .../reagents/chemistry/recipes/fermi.dm | 33 ++++++------ 7 files changed, 113 insertions(+), 26 deletions(-) create mode 100644 modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 4e278d2ede..58926d0c69 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -60,6 +60,9 @@ M.SetSleeping(0, 0) M.jitteriness = 0 M.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) + if(M.blood_volume < BLOOD_VOLUME_NORMAL) + M.blood_volume = BLOOD_VOLUME_NORMAL + for(var/thing in M.diseases) var/datum/disease/D = thing if(D.severity == DISEASE_SEVERITY_POSITIVE) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index f5f5eda104..59f4b4576c 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -35,6 +35,9 @@ var/FermiChem = FALSE //If the chemical uses the Fermichem reaction mechanics var/FermiExplode = FALSE //If the chemical explodes in a special way as a result of var/ImpureChem = "toxin" //What chemical is produced with an inpure reaction + var/InverseChemVal = 0.3 + var/InverseChem = "toxin" + /datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, specialreact) return diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 61e7c7a90c..288a3ffd5b 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -129,6 +129,25 @@ o.next_move_modifier = (round(P.length) - 11) ..() +/datum/status_effect/chem/OwO + id = "OwO" + +/datum/status_effect/chem/PElarger/tick(message) + if(copytext(message, 1, 2) != "*") + message = replacetext(message, "ne", "nye") + message = replacetext(message, "nu", "nyu") + message = replacetext(message, "na", "nya") + message = replacetext(message, "no", "nyo") + message = replacetext(message, "ove", "uv") + message = replacetext(message, "ove", "uv") + message = replacetext(message, "th", "ff") + message = replacetext(message, "l", "w") + message = replacetext(message, "r", "w") + if(prob(20)) + message = replacetext(message, ".", "OwO.") + else if(prob(30)) + message = replacetext(message, ".", "uwu.") + message = lowertext(message) /*Doesn't work /datum/status_effect/chem/SDGF/candidates diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index ae4d05cc58..4095b32d29 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -7,8 +7,8 @@ slot = "breasts" w_class = 3 size = BREASTS_SIZE_DEF - var/cached_size = 3//for enlargement - var/prev_size = 3//For flavour texts + var/cached_size = null//for enlargement + var/prev_size = BREASTS_SIZE_DEF//For flavour texts var/breast_sizes = list ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "huge", "flat") var/breast_values = list ("A" = 1, "B" = 2, "C" = 3, "D" = 4, "E" = 5, "F" = 6, "G" = 7, "H" = 8, "I" = 9, "J" = 10, "K" = 11, "L" = 12, "M" = 13, "N" = 14, "O" = 15, "huge" = 16, "flat" = 0) var/statuscheck = FALSE @@ -78,6 +78,9 @@ /obj/item/organ/genital/breasts/update_size()//wah //var/mob/living/carbon/human/o = owner //var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") + if (cached_size == null) + prev_size = size + return message_admins("Breast size at start: [size], [cached_size], [owner]") if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") @@ -123,6 +126,6 @@ else if (cached_size == 16.2) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") - icon_state = sanitize_text("breasts_[shape]_[size]") - owner.update_body() - update_icon() + //icon_state = sanitize_text("breasts_[shape]_[size]") + //owner.update_body() + //update_icon() diff --git a/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm new file mode 100644 index 0000000000..80ae690ada --- /dev/null +++ b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm @@ -0,0 +1,16 @@ +//Fermiclothes! +//Clothes made from FermiChem + +/obj/item/clothing/head/hattip //Actually the M1 Helmet + name = "flak helmet" + con = 'icons/obj/clothing/hats.dmi' + icon_state = "top_hat" + desc = "A sythesized hat, you can't seem to take it off. And tips their hat." + +/obj/item/clothing/head/hattip/attack_hand(mob/user) + if(iscarbon(user)) + var/mob/living/carbon/C = user + if(src == C.head) + M.emote("me",1,"tips their hat.",TRUE) + return + return ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 2b07526ae7..56015b615d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -569,15 +569,15 @@ id = "astral" description = "An opalescent murky liquid that is said to distort your soul from your being." color = "#A080H4" // rgb: , 0, 255 - taste_description = "velvety brambles " - metabolization_rate = 0 + taste_description = "velvety brambles" + metabolization_rate = 0//Removal is exponential, see code overdose_threshold = 20 addiction_threshold = 30 addiction_stage1_end = 9999//Should never end. var/mob/living/carbon/origin var/mob/living/simple_animal/hostile/retaliate/ghost/G = null var/ODing = FALSE - var/Svol = volume + //var/Svol = volume /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! M.alpha = 255//Reset addiction @@ -607,8 +607,8 @@ /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) G.mind.transfer_to(origin) qdel(G) - if(ODing = TRUE) - M.Sleeping(10*Svol, 0) + if(ODing == TRUE) + M.Sleeping(10*volume, 0) ODing = FALSE ..() @@ -651,10 +651,32 @@ to_chat(M, "Your body disperses from existence, as you become one with the universe.") to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of the afterlife remain with you. (At the cost of staying in character while dead.)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") - qdel(M) + qdel(M) //Approx 60minutes till death from initial addiction ..() +/datum/reagent/fermi/mindControl + name = "Astrogen" + id = "astral" + description = "An opalescent murky liquid that is said to distort your soul from your being." + color = "#A080H4" // rgb: , 0, 255 + taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" + metabolization_rate = 0 + overdose_threshold = 20 + addiction_threshold = 30 + addiction_stage1_end = 9999//Should never end. +/datum/reagent/fermi/furranium + name = "Furranium" + id = "furranium" + description = "OwO whats this?" + color = "#H04044" // rgb: , 0, 255 + taste_description = "dewicious degenyewacy" + +/datum/reagent/fermi/furranium/on_mob_life(mob/living/carbon/M) + M.apply_status_effect(/datum/status_effect/chem/OwO) + +/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) + M.remove_status_effect(/datum/status_effect/chem/OwO) /* /mob/living/simple_animal/hostile/retaliate/ghost incorporeal_move = 1 @@ -686,3 +708,21 @@ reduce viewrange? return nane.regen_rate = -7.5 */ + +/* + _________________________________________ +||Fermichem toxic / impure chems here. || +|| || +||_______________________________________|| +*/ + +/datum/reagent/fermi/SDGFTox + name = "Impure synthetic cells" + id = "SDGFtox" + description = "A chem that makes Fermis angry at you if you're reading this, how did you get this??." + color = "#A080H4" // rgb: , 0, 255 + taste_description = "Forbidden chemistry" //Check to make sure this doesn't proc taste when added to mobs + metabolization_rate = 1 //1u = 2clone damage (too much?) + +/datum/reagent/fermi/SDGFTox/on_mob_life(mob/living/M) + M.adjustCloneLoss(2, 0) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 604faaffef..af38b5fd8b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -35,21 +35,24 @@ required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: - OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions - OptimalTempMax = 500 // Upper end for above - ExplodeTemp = 550 //Temperature at which reaction explodes - OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) - OptimalpHMax = 9.5 // Higest value for above - ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) - CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) - CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) - ThermicConstant = 20 //Temperature change per 1u produced - HIonRelease = 0.01 //pH change per 1u reaction - RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect - FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics - FermiExplode = FALSE //If the chemical explodes in a special way - ImpureChem = "toxin" //What chemical is produced with an inpure reaction + OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions + OptimalTempMax = 500 // Upper end for above + ExplodeTemp = 550 // Temperature at which reaction explodes + OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 9.5 // Higest value for above + ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) + CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) + CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) + ThermicConstant = 20 // Temperature change per 1u produced + HIonRelease = 0.01 // pH change per 1u reaction + RateUpLim = 5 // Optimal/max rate possible if all conditions are perfect + FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics + FermiExplode = FALSE // If the chemical explodes in a special way + ImpureChem = "SDGFTox" // What chemical is metabolised with an inpure reaction + InverseChemVal = 0.5 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising + InverseChem = "SDZF" // What chem is metabolised when purity is below InverseChemVal + /datum/chemical_reaction/BElarger From 55cb20ddc9e34a6034d4bba509f2759eeb2b8c49 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 29 Apr 2019 20:15:54 +0100 Subject: [PATCH 086/608] Small changes to SDGF. --- code/modules/reagents/chemistry/holder.dm | 3 - code/modules/reagents/chemistry/reagents.dm | 4 ++ .../chemistry/reagents/fermi_reagents.dm | 67 +++++++++---------- .../reagents/chemistry/recipes/fermi.dm | 8 ++- 4 files changed, 41 insertions(+), 41 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index f68f51999f..c51c318e3e 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -537,9 +537,6 @@ update_total() return reaction_occurred -/datum/reagents/proc/FermiExplode() - return - /datum/reagents/proc/isolate_reagent(reagent) var/list/cached_reagents = reagent_list for(var/_reagent in cached_reagents) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 1bf862bd5e..4a3579bf07 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -130,3 +130,7 @@ rs += "[R.name], [R.volume]" return rs.Join(" | ") + +//Handler for explosion reaction +/datum/reagents/proc/FermiExplode(turf/T, obj/O, mob/living/M, volume) + return diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 56015b615d..e07e8b04ae 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -47,15 +47,13 @@ var/teleBool = FALSE mob/living/carbon/purgeBody - - /* /datum/reagent/fermi/eigenstate/on_new() location_created = get_turf(loc) //Sets up coordinate of where it was created message_admins("Attempting to get creation location from init() [location_created]") //..() */ - +//Main functions /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! switch(current_cycle) if(1) @@ -89,7 +87,7 @@ holder.remove_reagent(src.id, 0.5)//So you're not stuck for 10 minutes teleporting ..() //loop function - +//Addiction /datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride. switch(src.addictCyc1) if(1) @@ -196,31 +194,12 @@ var/list/result = list() var/list/group = null var/pollStarted = FALSE + var/location_created //var/fClone_current_controller = OWNER //var/mob/living/split_personality/clone//there's two so they can swap without overwriting //var/mob/living/split_personality/owner //var/mob/living/carbon/SM -/* -/datum/reagent/fermi/SDGF/New() - candidates = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies - message_admins("Attempting to poll") -^^^breaks everything -*/ -/* -/datum/reagent/fermi/proc/sepPoll() - //var/list/procCandies = list() - //if (pollStarted == FALSE) - // procCandies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") - sleep(300) - return procCandies -*/ - /*if(1) //I'm not sure how pollCanditdates works, so I did this. Gives a chance for people to say yes. - M.apply_status_effect(/datum/status_effect/chem/SDGF/candidates) - /datum/status_effect/chem/SDGF/candidates/candies = new /datum/status_effect/chem/SDGF/candidates - ///datum/status_effect/chem/SDGF/candidates/candies = M.apply_status_effect(/datum/status_effect/chem/SDGF/candidates) - //candies = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies - message_admins("Attempting to poll")*/ /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone @@ -358,20 +337,33 @@ M.blood_volume += 100 if (M.nutrition < 1500) M.nutrition += 500 +//If the reaction explodes +/datum/reagent/fermi/SDGF/FermiExplode(turf/open/T)//Spawns an angery teratoma!! Spooky..! be careful!! + //var/mob/living/simple_animal/slime/S = new(get_turf(location_created),"grey") + var/mob/living/simple_animal/slime/S = new(T,"grey")//should work, in theory + S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + S.name = "Living teratoma" + S.real_name = "Living teratoma"//horrifying!! + S.rabid = 1//Make them an angery boi + to_chat(M, "The cells clump up into a horrifying tumour.") +//Fail state of SDGF /datum/reagent/fermi/SDZF name = "synthetic-derived zombie factor" id = "SDZF" description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" color = "#60A584" // rgb: 96, 0, 255 metabolization_rate = 0.25 * REAGENTS_METABOLISM + var/startHunger /datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. message_admins("SGZF ingested") switch(current_cycle)//Pretends to be normal if(20) to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") + startHunger = M.nutrition if(21 to 29) + M.nutrition = M.nutrition + (M.nutrition/10) if(30) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") @@ -391,7 +383,7 @@ if(86) if (!holder.has_reagent("pen_acid"))//Counterplay is pent.) message_admins("Zombie spawned at [M.loc]") - M.nutrition -= 18500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE + M.nutrition = startHunger - 500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE M.next_move_modifier = 1 to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") M.visible_message("[M] suddenly shudders, and splits into a funky smelling copy of themselves!") @@ -403,23 +395,26 @@ ZI.name = M.real_name //ZI.updateappearance(mutcolor_update=1) holder.remove_reagent(src.id, 20) - else + else//easier to deal with to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") + M.nutrition = startHunger - 500 + var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") //TODO: replace slime as own simplemob/add tumour slime cores for science/chemistry interplay + S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + S.name = "Living teratoma" + S.real_name = "Living teratoma"//horrifying!! + S.rabid = 1//Make them an angery boi + //S.updateappearance(mutcolor_update=1) + holder.remove_reagent(src.id, 20) if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. TODO: turn tumour slime into real variant. - M.nutrition -= 100 - var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") - S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - S.name = "Living teratoma" - S.real_name = "Living teratoma"//horrifying!! - S.rabid = 1//Make them an angery boi - //S.updateappearance(mutcolor_update=1) - holder.remove_reagent(src.id, 20) - M.adjustToxLoss(10, 0) - to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") + M.adjustToxLoss(1, 0) message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") ..() + + to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") + + //breast englargement //Honestly the most requested chems //I'm not a very kinky person, sorry if it's not great diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index af38b5fd8b..a4dd17914a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -25,7 +25,8 @@ /datum/chemical_reaction/eigenstate/on_reaction(datum/reagents/holder) var/location = get_turf(holder.my_atom) - var/datum/reagent/fermi/eigenstate/location_created = location + var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in holder.reagent_list + E.location_created = location //serum /datum/chemical_reaction/SDGF @@ -53,7 +54,10 @@ InverseChemVal = 0.5 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising InverseChem = "SDZF" // What chem is metabolised when purity is below InverseChemVal - +/datum/chemical_reaction/eigenstate/on_reaction(datum/reagents/holder) + var/location = get_turf(holder.my_atom) + var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in holder.reagent_list + E.location_created = location /datum/chemical_reaction/BElarger name = "" From 4bd2da202b2d2fffd323101a6711c5032b92b5cd Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 30 Apr 2019 01:02:01 +0100 Subject: [PATCH 087/608] Added OwO chem, Fixed asset growth Added new sprites --- code/modules/surgery/organs/tongue.dm | 24 +++ .../code/modules/arousal/organs/breasts.dm | 10 +- .../code/modules/arousal/organs/genitals.dm | 68 +++++++ .../code/modules/arousal/organs/penis.dm | 14 +- .../chemistry/reagents/fermi_reagents.dm | 176 ++++++++++++++---- .../icons/obj/genitals/breasts_onmob.dmi | Bin 1141 -> 1605 bytes 6 files changed, 249 insertions(+), 43 deletions(-) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index d5b2d16e67..e358e9ad43 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -196,3 +196,27 @@ /obj/item/organ/tongue/robot/get_spans() return ..() | SPAN_ROBOT + +//FermiChem +/obj/item/organ/tongue/OwO + name = "fluffy tongue" + desc = "OwO what's this?" + icon_state = "tonguenormal" + taste_sensitivity = 10 // extra sensitive and inquisitive uwu + +/obj/item/organ/tongue/OwO/TongueSpeech(var/message) + if(copytext(message, 1, 2) != "*") + message = replacetext(message, "ne", "nye") + message = replacetext(message, "nu", "nyu") + message = replacetext(message, "na", "nya") + message = replacetext(message, "no", "nyo") + message = replacetext(message, "ove", "uv") + message = replacetext(message, "ove", "uv") + message = replacetext(message, "th", "ff") + message = replacetext(message, "l", "w") + message = replacetext(message, "r", "w") + if(prob(20)) + message = replacetext(message, ".", "OwO.") + else if(prob(30)) + message = replacetext(message, ".", "uwu.") + message = lowertext(message) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 4095b32d29..47c528072c 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -81,7 +81,7 @@ if (cached_size == null) prev_size = size return - message_admins("Breast size at start: [size], [cached_size], [owner]") + //message_admins("Breast size at start: [size], [cached_size], [owner]") if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") src.Remove(owner) @@ -116,7 +116,7 @@ size = "flat" if(isnum(prev_size)) prev_size = breast_sizes[prev_size] - message_admins("2. [breast_values[size]] vs [breast_values[prev_size]] || [size] vs [prev_size]") + //message_admins("2. [breast_values[size]] vs [breast_values[prev_size]] || [size] vs [prev_size]") if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") else if (breast_values[size] < breast_values[prev_size]) @@ -129,3 +129,9 @@ //icon_state = sanitize_text("breasts_[shape]_[size]") //owner.update_body() //update_icon() + message_admins("attempting to update sprite") + var/mob/living/carbon/human/H = owner + H.update_genitals() + //owner.update_genitals() + //if(src.is_exposed()) + // update_icon() diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index c10d444f07..aca3d9b964 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -348,3 +348,71 @@ for(var/L in relevant_layers) H.apply_overlay(L) +/* +/datum/species/proc/handle_breasts(mob/living/carbon/human/H) + //check for breasts first! + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + if(!B) + return + + ///obj/item/organ/genital/breasts/update_icon(/obj/item/organ/genital) Where did this come from? + //Variables: + var/size = B.size + var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER) + var/datum/sprite_accessory/S = GLOB.breasts_shapes_list[B.shape] + var/list/standing = list() + + if(!S || S.icon_state == "none") + return + for(var/layer in relevant_layers) + var/layertext = genitals_layertext(layer) + S = GLOB.breasts_shapes_list[B.shape] + + var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer) + + //If breasts are hueg (larger than 5 only have one sprite atm) + if (size > 5) + genital_overlay.icon_state = "[B.slot]_pair_[size]_0_[layertext]"//I haven't done around sizes above 5, I dunno how..! + else + genital_overlay.icon_state = "[B.slot]_[S.icon_state]_[size]_[B.aroused_state]_[layertext]" + + //center icon + if(S.center) + genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y) + + //Check skin colour + if(use_skintones && H.dna.features["genitals_use_skintone"]) + genital_overlay.color = "#[skintone2hex(H.skin_tone)]" + else + switch(S.color_src) + if("cock_color") + genital_overlay.color = "#[H.dna.features["cock_color"]]" + if("breasts_color") + genital_overlay.color = "#[H.dna.features["breasts_color"]]" + if("vag_color") + genital_overlay.color = "#[H.dna.features["vag_color"]]" + if(MUTCOLORS) + if(fixed_mut_color) + genital_overlay.color = "#[fixed_mut_color]" + else + genital_overlay.color = "#[H.dna.features["mcolor"]]" + if(MUTCOLORS2) + if(fixed_mut_color2) + genital_overlay.color = "#[fixed_mut_color2]" + else + genital_overlay.color = "#[H.dna.features["mcolor2"]]" + if(MUTCOLORS3) + if(fixed_mut_color3) + genital_overlay.color = "#[fixed_mut_color3]" + else + genital_overlay.color = "#[H.dna.features["mcolor3"]]" + + standing += genital_overlay + //Standing..? + if(LAZYLEN(standing)) + H.overlays_standing[layer] = standing.Copy() + standing = list() + + for(var/L in relevant_layers) + H.apply_overlay(L) +*/ \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index c5ee246e9a..02f9792fa4 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -44,6 +44,13 @@ o.remove_status_effect(/datum/status_effect/chem/PElarger) statuscheck = FALSE if(9 to INFINITY) //If massive + length = cached_length + size = 3 //no new sprites for anything larger yet + if(statuscheck == FALSE) + message_admins("Attempting to apply.") + o.remove_status_effect(/datum/status_effect/chem/PElarger) + statuscheck = TRUE + if(15 to INFINITY) length = cached_length size = 3 //no new sprites for anything larger yet if(statuscheck == FALSE) @@ -53,14 +60,17 @@ message_admins("Pinas size: [size], [cached_length], [o]") message_admins("2. size vs prev_size") if (round(length) > round(prev_size)) - to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(size)] inch penis.") + to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(length)] inch penis.") else if (round(length) < round(prev_size)) - to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(size)] inch penis.") + to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(length)] inch penis.") prev_size = length icon_state = sanitize_text("penis_[shape]_[size]") //update_body() //P.update_icon() //Either of these don't work, why??? girth = (length * girth_ratio) + var/mob/living/carbon/human/H = owner + H.update_genitals() + //owner.update_genitals() /obj/item/organ/genital/penis/update_appearance() //var/mob/living/carbon/o = owner diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index e07e8b04ae..e0714af177 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -179,6 +179,42 @@ //eigenstate END +/*SDGF +//////////////////////////////////////////////////// +// synthetic-derived growth factor // +////////////////////////////////////////////////// +WHAT IT DOES + +Several outcomes are possible (in priority order): + +Before the chem is even created, there is a risk of the reaction "exploding", which produces an angry teratoma that attacks the player. +0. Before the chem is activated, the purity is checked, if the purity of the reagent is less than 0.5, then sythetic-derived zombie factor is metabolised instead + 0.1 If SDZF is injected, the chem appears to act the same as normal, with nutrition gain, until the end, where it becomes toxic instead, giving a short window of warning to the player + 0.1.2 If the player can take pent in time, the player will spawn a hostile teratoma on them (less damaging), if they don't, then a zombie is spawned instead, with a small defence increase propotional to the volume + 0.2 If the purity is above 0.5, then the remaining impure volume created SDGFtox instead, which reduces blood volume and causes clone damage +1.Normal function creates a (another)player controlled clone of the player, which is spawned nude, with damage to the clone + 1.1 The remaining volume is transferred to the clone, which heals it over time, thus the player has to make a substantial ammount of the chem in order to produce a healthy clone + 1.2 If the player is infected with a zombie tumor, the tumor is transferred to the ghost controlled clone ONLY. +2. If no player can be found, a brainless clone is created over a long period of time, this body has no controller. + 2.1 If the player dies with a clone, then they play as the clone instead. However no memories are retained after splitting. +3. If there is already a clone, then SDGF heals clone, fire and brute damage slowly. This shouldn't normalise this chem as the de facto clone healing chem, as it will always try to make a ghost clone, and then a brainless clone first. +4. If there is insuffient volume to complete the cloning process, there are two outcomes + 4.1 At lower volumes, the players nutrition and blood is refunded, with light healing + 4.2 At higher volumes a stronger heal is applied to the user + +IMPORTANT FACTORS TO CONSIDER WHILE BALANCING +1. The most important factor is the required volume, this is easily edited with the metabolism rate, this chem is HARD TO MAKE, You need to make a lot of it and it's a substantial effort on the players part. There is also a substantial risk; you could spawn a hotile teratoma during the reation, you could damage yourself with clone damage, you could accidentally spawn a zombie... Basically, you've a good chance of killing yourself. + 1.1 Additionally, if you're trying to make SDZF purposely, you've no idea if you have or not, and that reaction is even harder to do. Plus, the player has a huge time window to get to medical to deal with it. If you take pent while it's in you, it'll be removed before it can spawn, and only spawns a teratoma if it's late stage. +2. The rate in which the clone is made, This thing takes time to produce fruits, it slows you down and makes you useless in combat/working. Basically you can't do anything during it. It will only get you killed if you use it in combat, If you do use it and you spawn a player clone, they're gimped for a long time, as they have to heal off the clone damage. +3. The healing - it's pretty low and a cyropod is more Useful +4. If you're an antag, you've a 50% chance of making a clone that will help you with your efforts, and you've no idea if they will or not. While clones can't directly harm you and care for you, they can hinder your efforts. +5. If people are being arses when they're a clone, slap them for it, they are told to NOT bugger around with someone else character, if it gets bad I'll add a blacklist, or do a check to see if you've played X amount of hours. + 5.1 Another solution I'm okay with is to rename the clone to [M]'s clone, so it's obvious, this obviously ruins anyone trying to clone themselves to get an alibi however. I'd prefer this to not be the case. + 5.2 Additionally, this chem is a soft buff to changelings, which apparently need a buff! + 5.3 Other similar things exist though; impostors, split personalites, abductors, ect. +6. Giving this to someone without concent is against space law and gets you sent to gulag. +*/ + //Clone serum #chemClone /datum/reagent/fermi/SDGF //vars, mostly only care about keeping track if there's a player in the clone or not. name = "synthetic-derived growth factor" @@ -195,16 +231,19 @@ var/list/group = null var/pollStarted = FALSE var/location_created + var/startHunger //var/fClone_current_controller = OWNER //var/mob/living/split_personality/clone//there's two so they can swap without overwriting //var/mob/living/split_personality/owner //var/mob/living/carbon/SM +//Main SDGF chemical /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone switch(current_cycle) if(1) + startHunger = M.nutrition if(pollStarted == FALSE) pollStarted = TRUE candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") @@ -233,10 +272,10 @@ //var/typepath = owner.type //clone = new typepath(owner.loc) var/typepath = M.type - var/mob/living/carbon/fermi_Gclone = new typepath(M.loc) + var/mob/living/carbon/human/fermi_Gclone = new typepath(M.loc) //var/mob/living/carbon/SM = owner //var/mob/living/carbon/M = M - var/mob/living/carbon/SM = fermi_Gclone + var/mob/living/carbon/human/SM = fermi_Gclone if(istype(SM) && istype(M)) SM.real_name = M.real_name M.dna.transfer_identity(SM) @@ -245,6 +284,7 @@ SM.key = C.key SM.mind.enslave_mind_to_creator(M) + //If they're a zombie, they can try to negate it with this. if(M.getorganslot(ORGAN_SLOT_ZOMBIE))//sure, it "treats" it, but "you've" still got it. Doesn't always work as well; needs a ghost. var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE) ZI.Remove(M) @@ -257,18 +297,29 @@ M.visible_message("[M] suddenly shudders, and splits into two identical twins!") SM.copy_known_languages_from(M, FALSE) playerClone = TRUE - M.next_move_modifier = 1 - M.nutrition = 150 - - reaction_mob(SM, ) + M.nutrition -= 500 + //reaction_mob(SM, )I forget what this is for + //Damage the clone + SM.blood_volume = BLOOD_VOLUME_NORMAL/2 + SM.adjustCloneLoss(80, 0) + SM.setBrainLoss(20) + SM.nutrition = startHunger/2 + var/datum/reagents/SMR = SM + ///datum/reagents + //var/mob/living/carbon/human has a holder, carbon does not + // You need to add to a holder. + // reagentS not reagent (?) + //SM.create_reagents() + SMR = locate(/datum/reagents) in SM + SMR.add_reagent("SDGFheal", volume) holder.remove_reagent(src.id, 999) //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? //after_success(user, SM) //qdel(src) - else //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). + else if(src.playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). message_admins("Failed to find clone Candidate") src.unitCheck = TRUE if(M.has_status_effect(/datum/status_effect/chem/SGDF)) // Heal the user if they went to all this trouble to make it and can't get a clone, the poor fellow. @@ -331,13 +382,15 @@ M.nutrition += 250 else if (src.unitCheck == TRUE && !M.has_status_effect(/datum/status_effect/chem/SGDF))// If they're ingested a little bit (10u minimum), then give them a little healing. src.unitCheck = FALSE - to_chat(M, "the cells fail to hold enough mass to generate a clone, instead diffusing into your system instead. you can fee") + to_chat(M, "the cells fail to hold enough mass to generate a clone, instead diffusing into your system.") M.adjustBruteLoss(-10, 0) M.adjustFireLoss(-10, 0) M.blood_volume += 100 + M.next_move_modifier = 1 if (M.nutrition < 1500) M.nutrition += 500 //If the reaction explodes +/* /datum/reagent/fermi/SDGF/FermiExplode(turf/open/T)//Spawns an angery teratoma!! Spooky..! be careful!! //var/mob/living/simple_animal/slime/S = new(get_turf(location_created),"grey") var/mob/living/simple_animal/slime/S = new(T,"grey")//should work, in theory @@ -345,11 +398,36 @@ S.name = "Living teratoma" S.real_name = "Living teratoma"//horrifying!! S.rabid = 1//Make them an angery boi - to_chat(M, "The cells clump up into a horrifying tumour.") + to_chat("The cells clump up into a horrifying tumour.") +*/ + +//Unobtainable, used in clone spawn. +/datum/reagent/fermi/SDGFheal + name = "synthetic-derived growth factor" + id = "SDGFheal" + metabolization_rate = 1 + +/datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) + if(M.blood_volume < BLOOD_VOLUME_NORMAL) + M.blood_volume += 10 + M.adjustCloneLoss(-2.5, 0) + M.setBrainLoss(-1) + M.nutrition += 10 + +//Unobtainable, used if SDGF is impure but not too impure +/datum/reagent/fermi/SDGFtox + name = "synthetic-derived growth factor" + id = "SDGFtox" + description = "A chem that makes Fermis angry at you if you're reading this, how did you get this???" + metabolization_rate = 1 + +/datum/reagent/fermi/SDGFtox/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting - the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) + M.blood_volume -= 10 + M.adjustCloneLoss(2, 0) //Fail state of SDGF /datum/reagent/fermi/SDZF - name = "synthetic-derived zombie factor" + name = "synthetic-derived growth factor" id = "SDZF" description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" color = "#60A584" // rgb: 96, 0, 255 @@ -363,7 +441,6 @@ to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") startHunger = M.nutrition if(21 to 29) - M.nutrition = M.nutrition + (M.nutrition/10) if(30) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") @@ -393,10 +470,12 @@ ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name + ZI.desc = "[M]'s clone, gone horribly wrong." + ZI.zombiejob = null //ZI.updateappearance(mutcolor_update=1) holder.remove_reagent(src.id, 20) else//easier to deal with - to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour.") + to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour!") M.nutrition = startHunger - 500 var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") //TODO: replace slime as own simplemob/add tumour slime cores for science/chemistry interplay S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) @@ -430,11 +509,7 @@ var/mob/living/carbon/human/H /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size - /* - switch(current_cycle) - if(0) - */ - + var/mob/living/carbon/human/H = M var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) //If they don't have breasts, give them breasts. message_admins("No breasts found!") @@ -457,10 +532,11 @@ message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.cached_size = B.cached_size + 0.1 if (B.cached_size >= 8.5 && B.cached_size < 9) - var/target = M.get_bodypart(BODY_ZONE_CHEST) - to_chat(M, "Your breasts begin to strain against your clothes tightly!") - M.adjustOxyLoss(10, 0) - M.apply_damage(2, BRUTE, target) + if(H.w_uniform || H.wear_suit) + var/target = M.get_bodypart(BODY_ZONE_CHEST) + to_chat(M, "Your breasts begin to strain against your clothes tightly!") + M.adjustOxyLoss(10, 0) + M.apply_damage(2, BRUTE, target) B.update() ..() @@ -511,6 +587,7 @@ var/mob/living/carbon/human/H /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size + var/mob/living/carbon/human/H = M var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) message_admins("No penis found!")//They do have a preponderance for escapism, or so I've heard. @@ -526,9 +603,10 @@ P.cached_length = P.cached_length + 0.1 if (P.cached_length >= 10.5 && P.cached_length < 11) //too low? - var/target = M.get_bodypart(BODY_ZONE_CHEST) - to_chat(M, "Your cock begin to strain against your clothes tightly!") - M.apply_damage(5, BRUTE, target) + if(H.w_uniform || H.wear_suit) + var/target = M.get_bodypart(BODY_ZONE_CHEST) + to_chat(M, "Your cock begin to strain against your clothes tightly!") + M.apply_damage(5, BRUTE, target) P.update() ..() @@ -558,7 +636,6 @@ T = nT ..() - /datum/reagent/fermi/astral // Gives you the ability to astral project for a moment! name = "Astrogen" id = "astral" @@ -668,10 +745,42 @@ taste_description = "dewicious degenyewacy" /datum/reagent/fermi/furranium/on_mob_life(mob/living/carbon/M) - M.apply_status_effect(/datum/status_effect/chem/OwO) -/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) - M.remove_status_effect(/datum/status_effect/chem/OwO) + switch(current_cycle) + if(1 to 9) + if(prob(20)) + to_chat(M, "Your tongue feels... fluffy") + if(10 to 20) + if(prob(20)) + to_chat(M, "You find yourself unable to supress the desire to meow!") + M.emote("nya") + if(prob(20)) + to_chat(M, "You find yourself unable to supress the desire to howl!") + M.emote("awoo") + if(prob(20)) + var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers + for(var/victim in seen) + to_chat(M, "You notice [victim]'s bulge, OwO!") + if(21) + message_admins("holder define: [holder]") + var/obj/item/organ/tongue/T = M.getorganslot(BODY_ZONE_PRECISE_MOUTH) + var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO + T.Remove(M) + nT.Insert(M) + qdel(T) + if(22 to INFINITY) + if(prob(20)) + to_chat(M, "You find yourself unable to supress the desire to meow!") + M.emote("nya") + if(prob(20)) + to_chat(M, "You find yourself unable to supress the desire to howl!") + M.emote("awoo") + if(prob(20)) + var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers + for(var/victim in seen) + to_chat(M, "You notice [victim]'s bulge, OwO!") + ..() + /* /mob/living/simple_animal/hostile/retaliate/ghost incorporeal_move = 1 @@ -710,14 +819,3 @@ reduce viewrange? || || ||_______________________________________|| */ - -/datum/reagent/fermi/SDGFTox - name = "Impure synthetic cells" - id = "SDGFtox" - description = "A chem that makes Fermis angry at you if you're reading this, how did you get this??." - color = "#A080H4" // rgb: , 0, 255 - taste_description = "Forbidden chemistry" //Check to make sure this doesn't proc taste when added to mobs - metabolization_rate = 1 //1u = 2clone damage (too much?) - -/datum/reagent/fermi/SDGFTox/on_mob_life(mob/living/M) - M.adjustCloneLoss(2, 0) diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi index 5be42c8e7eba00fa9b7a8df2e1b4be958ee3f498..b2496f1fc1c3b9181ef7866ec23dedbd10c29ce1 100644 GIT binary patch literal 1605 zcmYjRdr*>D6o*J#L!ZCUB$O%CStjpJxH=r3scez1Ozk``#@kZ`(y9Soio2P=lt&d-E+^$+8yX?v2gi9 z7z}3Nw;jJ127@zZ_k4uW6DldYY&5pJ1A=`FFoQrK7#|-u7!2Lr-CQoWuCC7LocN6U z*%$*S?+pxs;Y9CajX+2V4kP1_BpynLJ4KEo#lv7Jtdi?q$S0V^7sMh$X7aL%s*NQf z9%0@e{RNSEj^DhOPAdDQPQ$WfSI^W`#iG3D#e&{!r|HJ#YbYA$S!3iY(VEnnocNPB zkXPLf%7!1A?eSUuvO#r!i@AJfEh)r<@GrXI-G$+u>azpSRg z&R&i&(AUp~P-3e)Kf*y`R$1R`c9EHK=kNe@hgHu@Yfn5=T z9afzai}jUA&$n}--;9f0>gDJ5do4%EUkmU)v&arD?p(7e zPvd*hD0k4xTu(l>wX1}!yfxxqI2`}!g)UAhl8V5yNZwfYGY+FkuhqP$BqZnv)Jcze zIQph(P%8W`HRA|-N*A5vkuO_Yx`x-)rlL4P^Az)RMS~jOYC}*J*H&@uMyxZCjh+oolM< z4+udaY`Y%(5me$G0(}uKXX4A6fQqlCn;%Qn&Niiy=4_3M!D!K_cz-o z-(&O3TQfer{N>8B#phim$2cqxoU+xz!~7&4K(O@ zH_PQNQZ^s3FWiHU`WUd)#k!O{pl<31(IHB5zD%yvK6N@1HN4{U#`cHj*UNUDi9UHr zqqWZFX#|z|d*iQ7isdG5Iw)_d)8oomltM`$@^g6!b<`~6#V3f3~D-yo&))$?k@z*k}qQ=r@a$1|)Nm_4V=P(%kZC#gyNWWwA zUOS`~gXi|mEax4nO}AtL+r~CGN0|koK5Rd4k@CF5M2#>d6-1c*(<|qr>kR&=|KRjpv7u1_7^-_T5S`s?jFm-T4b^OtZid^`rc)VSP`V7W z^9lz0^j0d6>-aq@(49o(gNJ#o3IM#atS6~o3(5$K6)LkoV?O9+zG1DV1B^Exm3j;T zAjTyou#r{_S*(LHTQhb*_zs=!Kr?>>uVhpC4xpP%r(*bzZ>6sb2yEWcW= z0Np{`F;!Oa>kQhQ(wTx$K7Ex&^;-oOD;%HDYP2c~QjuCud&@_?8w5!+5L~00Q)J%> zw&~i+DUBE+Q{(;EcYu!P+#m&#)TKf}QQd?DQd6-UvcKX{>|VR}a}9HGVTr zsD#!Y&bWg*CR24iTTrz#i?(V%00001bW%=J06^y0W&i*HvU*flbVOxyV{&P5 zbZKvH004NLos&Ng!XOYwXZRGP-A${mE={X4h>3A0P_Bi+KLMg&-&SX1{B3u`yO%dy zDVlC4m1qx=KPaYfyNZoiFDlNS!DT-!t0iZi!szp7N!etY#==H2DJOk5A!?&5y*(Y( zx!}x&nC2^-4bfa^p6jnzjbIkDShl&oSBH6lUdxe=oaUM zMb45koI!;D{}VRZQkWjJCrwbw-S-ut49QDIj;|U}3IG5AK0)VoyHq|f^~2H~C8Hmn z%(cC@NXWsq`MYUirnmMhy082E1>>Lg-g8Qiw#@hR?RY?5xmR7Xz+?1=9Ziq6&CgUX zPNFDUMFX8eKx00000007|I z3-0Z``$U$`_D{{^Mg=Kh7!?Mmsvt)*yd=Jz6Ov$#m**8vc~PzF=q)dNb3H4gYIdfpNd@hm)Jcc;|zx3l_9b>KKz&4^Lk5 z7Uk0$|9sHlf}x>((!x~vY0BNO&I{h6Trd6eLH2@ZpR_RPvf9`MRe3>6*JwT{J}fAu zebTn9^3~?a3*Mnd^Fc3%ojL83qKBo5%DE^1`^+5_*C*BGmtBCpoB#5OCIA2c0002^ zPJu(@`Zz~St)H7cs)%`{LoUOiIz39P;&204kYq!RF za^`MlNBf-UVg7ex4L8}_pS{VNIq@8t6ijOO?w Date: Tue, 30 Apr 2019 05:43:49 +0100 Subject: [PATCH 088/608] Everything fixed. BE largement (probably) fully functional PE I think has issues ripping clothes? --- code/modules/surgery/organs/tongue.dm | 9 ++-- .../code/datums/status_effects/chems.dm | 17 ++++-- .../code/modules/arousal/organs/breasts.dm | 22 +++----- .../code/modules/arousal/organs/genitals.dm | 23 ++++---- .../code/modules/arousal/organs/penis.dm | 8 +-- .../chemistry/reagents/fermi_reagents.dm | 53 +++++++++---------- 6 files changed, 67 insertions(+), 65 deletions(-) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index e358e9ad43..13160479b4 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -212,11 +212,12 @@ message = replacetext(message, "no", "nyo") message = replacetext(message, "ove", "uv") message = replacetext(message, "ove", "uv") - message = replacetext(message, "th", "ff") + //message = replacetext(message, "th", "ff") //too incoherent in practice message = replacetext(message, "l", "w") message = replacetext(message, "r", "w") if(prob(20)) - message = replacetext(message, ".", "OwO.") + message += "OwO" else if(prob(30)) - message = replacetext(message, ".", "uwu.") - message = lowertext(message) + message += "uwu" + message = lowertext(message) + return message diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 288a3ffd5b..40aae850d2 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -23,7 +23,7 @@ /datum/status_effect/chem/SGDF/tick() //message_admins("SDGF ticking") if(owner.stat == DEAD) - message_admins("SGDF status swapping") + //message_admins("SGDF status swapping") if(fermi_Clone && fermi_Clone.stat != DEAD) if(owner.mind) owner.mind.transfer_to(fermi_Clone) @@ -49,8 +49,12 @@ o.dropItemToGround(W, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) //message_admins("BElarge started!") - o.visible_message("[o]'s chest suddenly bursts forth, ripping their clothes off!'") - to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + + if(o.w_uniform || o.wear_suit) + to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + o.visible_message("[o]'s chest suddenly bursts forth, ripping their clothes off!'") + else + to_chat(o, "Your bountiful bosom is so rich with mass, you seriously doubt you'll be able to fit any clothes over it.") return ..() /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge @@ -101,8 +105,11 @@ if(W == o.w_uniform || W == o.wear_suit) o.dropItemToGround(W, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) - owner.visible_message("[o]'s schlong suddenly bursts forth, ripping their clothes off!'") - to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") + if(o.w_uniform || o.wear_suit) + to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") + owner.visible_message("[o]'s schlong suddenly bursts forth, ripping their clothes off!'") + else + to_chat(o, "Your emancipated trouser snake is so ripe with girth, you seriously doubt you'll be able to fit any clothes over it.") return ..() diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 47c528072c..e32c9987d3 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -8,9 +8,9 @@ w_class = 3 size = BREASTS_SIZE_DEF var/cached_size = null//for enlargement - var/prev_size = BREASTS_SIZE_DEF//For flavour texts - var/breast_sizes = list ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "huge", "flat") - var/breast_values = list ("A" = 1, "B" = 2, "C" = 3, "D" = 4, "E" = 5, "F" = 6, "G" = 7, "H" = 8, "I" = 9, "J" = 10, "K" = 11, "L" = 12, "M" = 13, "N" = 14, "O" = 15, "huge" = 16, "flat" = 0) + var/prev_size //For flavour texts + var/breast_sizes = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "flat") + var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0) var/statuscheck = FALSE fluid_id = "milk" var/amount = 2 @@ -119,19 +119,13 @@ //message_admins("2. [breast_values[size]] vs [breast_values[prev_size]] || [size] vs [prev_size]") if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") + var/mob/living/carbon/human/H = owner + H.Force_update_genitals() else if (breast_values[size] < breast_values[prev_size]) to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size)]-cup.") + var/mob/living/carbon/human/H = owner + H.Force_update_genitals() prev_size = size else if (cached_size == 16.2) - to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom, taking both of your hands to hold!.") - - //icon_state = sanitize_text("breasts_[shape]_[size]") - //owner.update_body() - //update_icon() - message_admins("attempting to update sprite") - var/mob/living/carbon/human/H = owner - H.update_genitals() - //owner.update_genitals() - //if(src.is_exposed()) - // update_icon() + to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom.")// taking both of your hands to hold!.") diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index aca3d9b964..a3ffcf3698 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -267,7 +267,13 @@ if(src && !QDELETED(src)) dna.species.handle_genitals(src) +/mob/living/carbon/human/proc/Force_update_genitals() + dna.species.handle_genitals(src) + //dna.species.handle_breasts(src) + + /datum/species/proc/handle_genitals(mob/living/carbon/human/H) + message_admins("attempting to update sprite") if(!H)//no args CRASH("H = null") if(!LAZYLEN(H.internal_organs))//if they have no organs, we're done @@ -276,15 +282,12 @@ return if(H.has_trait(TRAIT_HUSK)) return - var/list/genitals_to_add = list() var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER) var/list/standing = list() var/size = null - for(var/L in relevant_layers) //Less hardcode H.remove_overlay(L) - //start scanning for genitals //var/list/worn_stuff = H.get_equipped_items()//cache this list so it's not built again for(var/obj/item/organ/O in H.internal_organs) @@ -293,7 +296,6 @@ if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes genitals_to_add += H.getorganslot(G.slot) //Now we added all genitals that aren't internal and should be rendered - //start applying overlays for(var/layer in relevant_layers) var/layertext = genitals_layertext(layer) @@ -351,10 +353,11 @@ /* /datum/species/proc/handle_breasts(mob/living/carbon/human/H) //check for breasts first! - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + + var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") if(!B) return - + message_admins("attempting to update sprite in a hacky way") ///obj/item/organ/genital/breasts/update_icon(/obj/item/organ/genital) Where did this come from? //Variables: var/size = B.size @@ -372,7 +375,7 @@ //If breasts are hueg (larger than 5 only have one sprite atm) if (size > 5) - genital_overlay.icon_state = "[B.slot]_pair_[size]_0_[layertext]"//I haven't done around sizes above 5, I dunno how..! + genital_overlay.icon_state = "[B.slot]_[B.shape]_[size]_0_[layertext]"//I haven't done around sizes above 5, I dunno how..! else genital_overlay.icon_state = "[B.slot]_[S.icon_state]_[size]_[B.aroused_state]_[layertext]" @@ -385,10 +388,6 @@ genital_overlay.color = "#[skintone2hex(H.skin_tone)]" else switch(S.color_src) - if("cock_color") - genital_overlay.color = "#[H.dna.features["cock_color"]]" - if("breasts_color") - genital_overlay.color = "#[H.dna.features["breasts_color"]]" if("vag_color") genital_overlay.color = "#[H.dna.features["vag_color"]]" if(MUTCOLORS) @@ -415,4 +414,4 @@ for(var/L in relevant_layers) H.apply_overlay(L) -*/ \ No newline at end of file +*/ diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 02f9792fa4..4dfef831b6 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -68,10 +68,12 @@ //update_body() //P.update_icon() //Either of these don't work, why??? girth = (length * girth_ratio) - var/mob/living/carbon/human/H = owner - H.update_genitals() + //var/mob/living/carbon/human/H = owner + //H.update_genitals() //owner.update_genitals() + //I have no idea on how to update sprites and I hate it + /obj/item/organ/genital/penis/update_appearance() //var/mob/living/carbon/o = owner var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" @@ -85,7 +87,7 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["cock_color"]]" - owner.update_body() + //owner.update_body() /obj/item/organ/genital/penis/update_link() if(owner) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index e0714af177..553f8aa6b2 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -247,23 +247,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(pollStarted == FALSE) pollStarted = TRUE candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") - - - /* - for(var/mob/dead/observer/G in GLOB.player_list) - group += G - for(var/m in group) - var/mob/W = m - message_admins("Attempting to poll") - showCandidatePollWindow(M, 190, "Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.", result, null, current_cycle, TRUE) - if(19) - for(var/mob/W in result) - if(!W.key || !W.client) - result -= W - candies = result - */ - - if(20 to INFINITY) message_admins("Number of candidates [LAZYLEN(candies)]") if(LAZYLEN(candies) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! @@ -303,17 +286,23 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Damage the clone SM.blood_volume = BLOOD_VOLUME_NORMAL/2 SM.adjustCloneLoss(80, 0) - SM.setBrainLoss(20) + SM.setBrainLoss(40) SM.nutrition = startHunger/2 - var/datum/reagents/SMR = SM + //var/datum/reagents/SMR = SM ///datum/reagents //var/mob/living/carbon/human has a holder, carbon does not // You need to add to a holder. // reagentS not reagent (?) //SM.create_reagents() - SMR = locate(/datum/reagents) in SM - SMR.add_reagent("SDGFheal", volume) + + //Really hacky way to deal with this stupid problem I have + SM.reagents.add_reagent("SDGFheal", volume) + //holder.add_reagent("SDGFheal", volume) holder.remove_reagent(src.id, 999) + //SMR = locate(/datum/reagents in SM) + //holder.trans_to(SMR, volume) + + return //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? //after_success(user, SM) @@ -410,7 +399,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) if(M.blood_volume < BLOOD_VOLUME_NORMAL) M.blood_volume += 10 - M.adjustCloneLoss(-2.5, 0) + M.adjustCloneLoss(-2, 0) M.setBrainLoss(-1) M.nutrition += 10 @@ -424,6 +413,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/SDGFtox/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting - the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) M.blood_volume -= 10 M.adjustCloneLoss(2, 0) + ..() //Fail state of SDGF /datum/reagent/fermi/SDZF @@ -508,6 +498,16 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING metabolization_rate = 0.5 var/mob/living/carbon/human/H +/datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M) + var/mob/living/carbon/human/H = M + var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") + if(!B) + return + var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) + B.prev_size = B.size + B.cached_size = [sizeConv[B.size]] + message_admins("init B size: [B.size], prev: [B.prev_size], cache = [B.cached_size], raw: [sizeConv[B.size]]") + /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size var/mob/living/carbon/human/H = M var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") @@ -529,7 +529,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.reagents.remove_reagent(src.id, 5) B = nB //If they have them, increase size. If size is comically big, limit movement and rip clothes. - message_admins("Breast size: [B.size], [B.cached_size], [holder]") + //message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.cached_size = B.cached_size + 0.1 if (B.cached_size >= 8.5 && B.cached_size < 9) if(H.w_uniform || H.wear_suit) @@ -553,7 +553,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(P) P.length = P.length - 0.1 - message_admins("Breast size: [P.size], [P.cached_length], [holder]") + message_admins("lewdsnek size: [P.size], [P.cached_length], [holder]") P.update() if(T) T.Remove(M) @@ -760,10 +760,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers for(var/victim in seen) - to_chat(M, "You notice [victim]'s bulge, OwO!") + to_chat(M, "You notice [victim]'s bulge [pick("OwO!", "UwU!")]") if(21) - message_admins("holder define: [holder]") - var/obj/item/organ/tongue/T = M.getorganslot(BODY_ZONE_PRECISE_MOUTH) + var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO T.Remove(M) nT.Insert(M) From e70eac8f53faca5cba40fc6a66534f323ac98a6f Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 2 May 2019 08:44:06 +0100 Subject: [PATCH 089/608] Futher fixes and for some reason something broke arrrghhh. --- code/modules/surgery/organs/tongue.dm | 4 +- .../code/datums/status_effects/chems.dm | 4 ++ .../chemistry/reagents/fermi_reagents.dm | 47 ++++++++++--------- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 13160479b4..3e202acf41 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -216,8 +216,8 @@ message = replacetext(message, "l", "w") message = replacetext(message, "r", "w") if(prob(20)) - message += "OwO" + message += " OwO" else if(prob(30)) - message += "uwu" + message += " uwu" message = lowertext(message) return message diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 40aae850d2..df51df8ead 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -60,6 +60,10 @@ /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") + if(!B) + o.remove_movespeed_modifier("megamilk") + o.next_move_modifier = 1 + owner.remove_status_effect(src) var/items = o.get_contents() for(var/obj/item/W in items) if(W == o.w_uniform || W == o.wear_suit) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 553f8aa6b2..0541d6ce71 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -56,7 +56,7 @@ //Main functions /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! switch(current_cycle) - if(1) + if(0) location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") do_sparks(5,FALSE,M) @@ -99,7 +99,7 @@ /datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M) switch(src.addictCyc2) - if(1) + if(0) to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") M.Jitter(50) M.Knockdown(100) @@ -163,7 +163,7 @@ M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) for (var/datum/mood_event/i in M) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, i) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, i) //Why does this not work? SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) @@ -172,7 +172,7 @@ src.addictCyc4++ ..() - . = 1 + //. = 1 ///datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) // return @@ -223,7 +223,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING color = "#60A584" // rgb: 96, 0, 255 var/playerClone = FALSE var/unitCheck = FALSE - metabolization_rate = 0.25 * REAGENTS_METABOLISM + metabolization_rate = 0.5 * REAGENTS_METABOLISM //var/datum/status_effect/chem/SDGF/candidates/candies var/list/candies = list() //var/polling = FALSE @@ -421,7 +421,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING id = "SDZF" description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" color = "#60A584" // rgb: 96, 0, 255 - metabolization_rate = 0.25 * REAGENTS_METABOLISM + metabolization_rate = 0.5 * REAGENTS_METABOLISM var/startHunger /datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. @@ -474,16 +474,12 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING S.rabid = 1//Make them an angery boi //S.updateappearance(mutcolor_update=1) holder.remove_reagent(src.id, 20) + to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. TODO: turn tumour slime into real variant. M.adjustToxLoss(1, 0) message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") ..() - - - to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") - - //breast englargement //Honestly the most requested chems //I'm not a very kinky person, sorry if it's not great @@ -654,7 +650,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! M.alpha = 255//Reset addiction switch(current_cycle) - if(1)//Require a minimum + if(0)//Require a minimum //var/mob/living/carbon/H = M //M.alpha = 255 origin = M @@ -684,7 +680,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ODing = FALSE ..() -/datum/reagent/fermi/astral/overdose_start(mob/living/carbon/M) +/datum/reagent/fermi/astral/overdose_process(mob/living/carbon/M) ODing = TRUE if (!G == null) if(prob(70)) @@ -719,16 +715,16 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(45) to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.") M.alpha = M.alpha - 1 - if(M.alpha <= 30) - to_chat(M, "Your body disperses from existence, as you become one with the universe.") - to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of the afterlife remain with you. (At the cost of staying in character while dead.)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. - M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") - qdel(M) //Approx 60minutes till death from initial addiction + if(0 to 30) + to_chat(M, "Your body disperses from existence, as you become one with the universe.") + to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of the afterlife remain with you. (At the cost of staying in character while dead.)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. + M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") + qdel(M) //Approx 60minutes till death from initial addiction ..() /datum/reagent/fermi/mindControl name = "Astrogen" - id = "astral" + id = "" description = "An opalescent murky liquid that is said to distort your soul from your being." color = "#A080H4" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" @@ -736,6 +732,13 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING overdose_threshold = 20 addiction_threshold = 30 addiction_stage1_end = 9999//Should never end. + creatorID = //add here + +//Requires player to be within vicinity of creator +//bonuses to mood +//gives creator a silver(velvet?) tongue +//Addiction is applied when creator is out of viewer +// /datum/reagent/fermi/furranium name = "Furranium" @@ -759,8 +762,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.emote("awoo") if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers - for(var/victim in seen) - to_chat(M, "You notice [victim]'s bulge [pick("OwO!", "UwU!")]") + //for(var/victim in seen) + to_chat(M, "You notice [pick([victim])]'s bulge [pick("OwO!", "uwu!")]") if(21) var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO @@ -777,7 +780,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers for(var/victim in seen) - to_chat(M, "You notice [victim]'s bulge, OwO!") + to_chat(M, "You notice [pick([victim])]'s bulge [pick("OwO!", "uwu!")]") ..() /* From f92995bc13eb253a156aad099e3a2259c35614e4 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 2 May 2019 11:34:42 +0100 Subject: [PATCH 090/608] Mid MC --- .../reagents/chemistry/recipes/others.dm | 10 +++++ .../code/datums/status_effects/chems.dm | 42 ++++++++++++++++++- .../chemistry/reagents/fermi_reagents.dm | 28 +++++++++---- .../reagents/chemistry/recipes/fermi.dm | 32 ++++++++++++++ 4 files changed, 104 insertions(+), 8 deletions(-) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index bcd08b1853..e34f34675c 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -528,6 +528,16 @@ /datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume) chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life") // Lol. +//This is missing, I'm adding it back (see tgwiki). Not sure why we don't have it. +/datum/chemical_reaction/life_friendly + name = "Life (Friendly)" + id = "life_friendly" + required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "sugar" = 1) + required_temp = 374 + +/datum/chemical_reaction/life_friendly/on_reaction(datum/reagents/holder, created_volume) + chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (friendly)", FRIENDLY_SPAWN) //Pray for cute cats + /datum/chemical_reaction/corgium name = "corgium" id = "corgium" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index df51df8ead..54fbea8ba1 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -120,6 +120,10 @@ /datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/penis/P = o.getorganslot("penis") + if(!P) + o.remove_movespeed_modifier("hugedick") + o.next_move_modifier = 1 + owner.remove_status_effect(src) message_admins("PElarge tick!") var/items = o.get_contents() for(var/obj/item/W in items) @@ -140,6 +144,42 @@ o.next_move_modifier = (round(P.length) - 11) ..() + +/*////////////////////////////////////////// + Mind control functions +/////////////////////////////////////////// +*/ + +/datum/status_effect/chem/enthral + id = "enthral" + var/mob/living/E //E for enchanter + //var/mob/living/V = list() //V for victims + var/resistance = 0 + var/phase = 0 + var/enthralID + +/datum/status_effect/chem/enthra/on_apply(mob/living/carbon/M) + if(M.ID == ) + + +/datum/status_effect/chem/enthral/tick(mob/living/carbon/M) + redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) + switch(phase) + if(0) + return + if(1) + + + + +/datum/status_effect/chem/enthral/proc/owner_resist(mob/living/carbon/M) + to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") + if (M.canbearoused) + resistance += ((100 - M.arousalloss/100)/100) + else + resistance += 0.2 + +/* /datum/status_effect/chem/OwO id = "OwO" @@ -159,7 +199,7 @@ else if(prob(30)) message = replacetext(message, ".", "uwu.") message = lowertext(message) - +*/ /*Doesn't work /datum/status_effect/chem/SDGF/candidates id = "SGDFCandi" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 0541d6ce71..b296bd293a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -211,7 +211,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING 5. If people are being arses when they're a clone, slap them for it, they are told to NOT bugger around with someone else character, if it gets bad I'll add a blacklist, or do a check to see if you've played X amount of hours. 5.1 Another solution I'm okay with is to rename the clone to [M]'s clone, so it's obvious, this obviously ruins anyone trying to clone themselves to get an alibi however. I'd prefer this to not be the case. 5.2 Additionally, this chem is a soft buff to changelings, which apparently need a buff! - 5.3 Other similar things exist though; impostors, split personalites, abductors, ect. + 5.3 Other similar things exist already though in the codebase; impostors, split personalites, abductors, ect. 6. Giving this to someone without concent is against space law and gets you sent to gulag. */ @@ -268,6 +268,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING SM.mind.enslave_mind_to_creator(M) //If they're a zombie, they can try to negate it with this. + //I seriously wonder if anyone will ever use this function. if(M.getorganslot(ORGAN_SLOT_ZOMBIE))//sure, it "treats" it, but "you've" still got it. Doesn't always work as well; needs a ghost. var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE) ZI.Remove(M) @@ -402,6 +403,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.adjustCloneLoss(-2, 0) M.setBrainLoss(-1) M.nutrition += 10 + ..() //Unobtainable, used if SDGF is impure but not too impure /datum/reagent/fermi/SDGFtox @@ -410,7 +412,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING description = "A chem that makes Fermis angry at you if you're reading this, how did you get this???" metabolization_rate = 1 -/datum/reagent/fermi/SDGFtox/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting - the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) +/datum/reagent/fermi/SDGFtox/on_mob_life(mob/living/carbon/M)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good) M.blood_volume -= 10 M.adjustCloneLoss(2, 0) ..() @@ -722,17 +724,27 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING qdel(M) //Approx 60minutes till death from initial addiction ..() -/datum/reagent/fermi/mindControl - name = "Astrogen" - id = "" - description = "An opalescent murky liquid that is said to distort your soul from your being." +/datum/reagent/fermi/enthral + name = "Need a name" + id = "enthral" + description = "Need a description." color = "#A080H4" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" metabolization_rate = 0 overdose_threshold = 20 addiction_threshold = 30 addiction_stage1_end = 9999//Should never end. - creatorID = //add here + var/creatorID //add here + +/datum/reagent/fermi/enthral/on_mob_life(mob/living/carbon/M) + if(!creatorID) + CRASH("Something went wrong in enthral creation") + if(M.ID == creatorID) + var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/silver + T.Remove(M) + nT.Insert(M) + qdel(T) //Requires player to be within vicinity of creator //bonuses to mood @@ -740,6 +752,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Addiction is applied when creator is out of viewer // +/////////////////////////////////////////////////////////////////////////////////////////////////// + /datum/reagent/fermi/furranium name = "Furranium" id = "furranium" diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index a4dd17914a..23ad696d46 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -101,3 +101,35 @@ FermiChem = TRUE FermiExplode = FALSE ImpureChem = "carpotoxin" + +/datum/chemical_reaction/enthral + name = "need a name" + id = "enthral" + results = list("enthral" = 3) + required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) + //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) + //FermiChem vars: + OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions + OptimalTempMax = 500 // Upper end for above + ExplodeTemp = 550 // Temperature at which reaction explodes + OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 9.5 // Higest value for above + ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) + CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) + CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) + ThermicConstant = 20 // Temperature change per 1u produced + HIonRelease = 0.01 // pH change per 1u reaction + RateUpLim = 5 // Optimal/max rate possible if all conditions are perfect + FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics + FermiExplode = FALSE // If the chemical explodes in a special way + //ImpureChem = "SDGFTox" // What chemical is metabolised with an inpure reaction + //InverseChemVal = 0.5 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising + //InverseChem = "SDZF" // What chem is metabolised when purity is below InverseChemVal + + +/datum/chemical_reaction/enthral/on_reaction(datum/reagents/holder) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + var/enthralID = B.get_blood_id() + var/datum/reagent/fermi/enthral/E = locate(/datum/reagent/fermi/enthral) in holder.reagent_list + E.enthralID = enthralID From bca578ab2c2183240f33c81a2a76dd019a151b75 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 3 May 2019 03:02:37 +0100 Subject: [PATCH 091/608] About 1/6th done of MC base code --- code/modules/surgery/organs/vocal_cords.dm | 594 ++++++++++++++++++ .../code/datums/mood_events/chem_events.dm | 18 + .../code/datums/status_effects/chems.dm | 9 +- .../chemistry/reagents/fermi_reagents.dm | 3 +- 4 files changed, 619 insertions(+), 5 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 55ead3b5b4..c6c40de31a 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -2,6 +2,10 @@ #define COOLDOWN_DAMAGE 600 #define COOLDOWN_MEME 300 #define COOLDOWN_NONE 100 +#define COOLDOWN_VSTUN 800 +#define COOLDOWN_VDAMAGE 300 +#define COOLDOWN_VTHRAL 200 +#define COOLDOWN_VNONE 100 /obj/item/organ/vocal_cords //organs that are activated through speech with the :x channel name = "vocal cords" @@ -608,6 +612,596 @@ return cooldown +////////////////////////////////////// +///////ENTHRAL SILVER TONGUE////////// +////////////////////////////////////// + +//Heavily modified voice of god code +/obj/item/organ/vocal_cords/velvet + name = "velvet chords" + desc = "The voice spoken from these just make you want to drift off, sleep and obey." + icon_state = "voice_of_god" + actions_types = list(/datum/action/item_action/organ_action/colossus) + var/next_command = 0 + var/cooldown_mod = 1 + var/base_multiplier = 1 + //spans = list("say","yell") + +/* +/datum/action/item_action/organ_action/colossus + name = "Voice of God" + var/obj/item/organ/vocal_cords/colossus/cords = null + +/datum/action/item_action/organ_action/colossus/New() + ..() + cords = target + +/datum/action/item_action/organ_action/colossus/IsAvailable() + if(world.time < cords.next_command) + return FALSE + if(!owner) + return FALSE + if(!owner.can_speak()) + return FALSE + if(check_flags & AB_CHECK_CONSCIOUS) + if(owner.stat) + return FALSE + return TRUE + +/datum/action/item_action/organ_action/colossus/Trigger() + . = ..() + if(!IsAvailable()) + if(world.time < cords.next_command) + to_chat(owner, "You must wait [DisplayTimeText(cords.next_command - world.time)] before Speaking again.") + return + var/command = input(owner, "Speak with the Voice of God", "Command") + if(QDELETED(src) || QDELETED(owner)) + return + if(!command) + return + owner.say(".x[command]") + +/obj/item/organ/vocal_cords/colossus/can_speak_with() + if(world.time < next_command) + to_chat(owner, "You must wait [DisplayTimeText(next_command - world.time)] before Speaking again.") + return FALSE + if(!owner) + return FALSE + if(!owner.can_speak()) + to_chat(owner, "You are unable to speak!") + return FALSE + return TRUE +*/ + +/obj/item/organ/vocal_cords/velvet/handle_speech(message) + var/cooldown = velvetspeec(hmessage, owner, spans, base_multiplier) + return //voice of god speaks for us + + + +/obj/item/organ/vocal_cords/velvet/speak_with(message) + var/cooldown = voice_of_god(message, owner, spans, base_multiplier) + next_command = world.time + (cooldown * cooldown_mod) + +////////////////////////////////////// +///////////FermiChem////////////////// +////////////////////////////////////// + +/proc/velvetspeech(message, mob/living/user, list/span_list, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE) + var/cooldown = 0 + + if(!user || !user.can_speak() || user.stat) + return 0 //no cooldown + + var/log_message = message + if(!span_list || !span_list.len) //Not too sure what this does, I think it changes your output message depending if you're a cultist or not? I.e. font + if(iscultist(user)) + span_list = list("narsiesmall") + else if (is_servant_of_ratvar(user)) + span_list = list("ratvar") + else + span_list = list() + + user.say(message, sanitize = FALSE)//Removed spans = span_list, It should just augment normal speech + + message = lowertext(message) + var/mob/living/list/listeners = list() + for(var/mob/living/L in get_hearers_in_view(8, user)) + if(L.can_hear() && !L.anti_magic_check(FALSE, TRUE) && L.stat != DEAD) + if(L.has_status_effect(/datum/status_effect/chem/enthral))//Check to see if they have the status + if(L == user && !include_speaker) + continue + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) + continue + if(istype(H.neck, /obj/item/clothing/neck/petcollar)) + power_multiplier *= 1.5 //Collaring players makes them more docile and accepting of their place as a pet + if(H.has_trait(TRAIT_CROCRIN_IMMUNE) || !M.canbearoused) + power_multiplier *= 1.5//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. + listeners += L + + if(!listeners.len) + cooldown = COOLDOWN_NONE + return cooldown + + var/power_multiplier = base_multiplier + + // Not sure I want to give extra power to anyone at the moment...? We'll see how it turns out + if(user.mind) + //Chaplains are very good at indoctrinating + if(user.mind.assigned_role == "Chaplain") + power_multiplier *= 2 + //Command staff has authority + if(user.mind.assigned_role in GLOB.command_positions) + power_multiplier *= 1.4 + //Why are you speaking + if(user.mind.assigned_role == "Mime") + power_multiplier *= 0.5 + + //Cultists are closer to their gods and are more better at indoctrinating + if(iscultist(user)) + power_multiplier *= 2 + else if (is_servant_of_ratvar(user)) + power_multiplier *= 2 + else if (is_devil(user))//The devil is supposed to be seductive, right? + power_multiplier *= 2 + + //range = 0.5 - 4.2~ + //most cases = 1-2 + + //Try to check if the speaker specified a name or a job to focus on + var/list/specific_listeners = list() + var/found_string = null + + //Get the proper job titles + message = get_full_job_name(message) + + for(var/V in listeners) + if(dd_hasprefix(message, L.real_name)) + specific_listeners += L //focus on those with the specified name + //Cut out the name so it doesn't trigger commands + found_string = L.real_name + power_multiplier *= 2 + + else if(dd_hasprefix(message, L.first_name())) + specific_listeners += L //focus on those with the specified name + //Cut out the name so it doesn't trigger commands + found_string = L.first_name() + power_multiplier *= 2 + + else if(L.mind && L.mind.assigned_role && dd_hasprefix(message, L.mind.assigned_role)) + specific_listeners += L //focus on those with the specified job + //Cut out the job so it doesn't trigger commands + found_string = L.mind.assigned_role + power_multiplier *= 2 + + if(specific_listeners.len) + listeners = specific_listeners + //power_multiplier *= (1 + (1/specific_listeners.len)) //Put this is if it becomes OP + message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1) + + //phase 1 + var/static/regex/enthral_words = regex("relax|obey|give in|love|serve|docile") + var/static/regex/reward_words = regex("good boy|good girl|good pet") + var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") + var/static/regex/attract_words = regex("come here|come to me|get over here|attract") + var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") + var/static/regex/desire_words = regex("good boy|good girl|good pet") + var/static/regex/resist_words = regex("resist|snap out of it|fight")//useful if two enthrallers are fighting + var/static/regex/forget_words = regex("forget|muddled|") + //phase 2 + var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") + var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown") + var/static/regex/sleep_words = regex("sleep|slumber|rest") + var/static/regex/vomit_words = regex("vomit|throw up|sick") + //phase 3 + //var/static/regex/hallucinate_words = regex("see the truth|hallucinate") + var/static/regex/wakeup_words = regex("wake up|awaken") + var/static/regex/heal_words = regex("live|heal|survive|mend|life|heroes never die") + var/static/regex/hurt_words = regex("die|suffer|hurt|pain|death") + var/static/regex/bleed_words = regex("bleed|there will be blood") + var/static/regex/burn_words = regex("burn|ignite") + var/static/regex/hot_words = regex("heat|hot|hell") + var/static/regex/cold_words = regex("cold|cool down|chill|freeze") + var/static/regex/repulse_words = regex("shoo|go away|leave me alone|begone|flee|fus ro dah|get away|repulse") + var/static/regex/whoareyou_words = regex("who are you|say your name|state your name|identify") + var/static/regex/saymyname_words = regex("say my name|who am i|whoami") + var/static/regex/knockknock_words = regex("knock knock") + var/static/regex/statelaws_words = regex("state laws|state your laws") + var/static/regex/move_words = regex("move|walk") + var/static/regex/left_words = regex("left|west|port") + var/static/regex/right_words = regex("right|east|starboard") + var/static/regex/up_words = regex("up|north|fore") + var/static/regex/down_words = regex("down|south|aft") + var/static/regex/walk_words = regex("slow down") + var/static/regex/run_words = regex("run") + var/static/regex/helpintent_words = regex("help|hug") + var/static/regex/disarmintent_words = regex("disarm") + var/static/regex/grabintent_words = regex("grab") + var/static/regex/harmintent_words = regex("harm|fight|punch") + var/static/regex/throwmode_words = regex("throw|catch") + var/static/regex/flip_words = regex("flip|rotate|revolve|roll|somersault") + var/static/regex/speak_words = regex("speak|say something") + var/static/regex/getup_words = regex("get up") + var/static/regex/sit_words = regex("sit") + var/static/regex/stand_words = regex("stand") + var/static/regex/dance_words = regex("dance") + var/static/regex/jump_words = regex("jump") + var/static/regex/salute_words = regex("salute") + var/static/regex/deathgasp_words = regex("play dead") + var/static/regex/clap_words = regex("clap|applaud") + var/static/regex/honk_words = regex("ho+nk") //hooooooonk + var/static/regex/multispin_words = regex("like a record baby|right round") + var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //CITADEL CHANGE + var/static/regex/dab_words = regex("dab|mood") //CITADEL CHANGE + var/static/regex/snap_words = regex("snap") //CITADEL CHANGE + //var/static/regex/bwoink_words = regex("what the fuck are you doing|bwoink|hey you got a moment?") //CITADEL CHANGE + + + + //enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words + //ENTHRAL + if(findtext(message, enthral_words)) + cooldown = COOLDOWN_VTHRAL + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + E.enthralTally += power_multiplier + + var/i = 0 + //STUN + if(findtext(message, stun_words)) + cooldown = COOLDOWN_STUN + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = has_status_effect(/datum/status_effect/chem/enthral) + L.Stun(60 * power_multiplier) + + //KNOCKDOWN + else if(findtext(message, knockdown_words)) + cooldown = COOLDOWN_STUN + for(var/V in listeners) + var/mob/living/L = V + L.Knockdown(60 * power_multiplier) + + //SLEEP + else if((findtext(message, sleep_words))) + cooldown = COOLDOWN_STUN + for(var/mob/living/carbon/C in listeners) + C.Sleeping(40 * power_multiplier) + + //VOMIT + else if((findtext(message, vomit_words))) + cooldown = COOLDOWN_STUN + for(var/mob/living/carbon/C in listeners) + C.vomit(10 * power_multiplier, distance = power_multiplier) + + //SILENCE + else if((findtext(message, silence_words))) + cooldown = COOLDOWN_STUN + for(var/mob/living/carbon/C in listeners) + if(user.mind && (user.mind.assigned_role == "Curator" || user.mind.assigned_role == "Mime")) + power_multiplier *= 3 + C.silent += (10 * power_multiplier) + + //HALLUCINATE + else if((findtext(message, hallucinate_words))) + cooldown = COOLDOWN_MEME + for(var/mob/living/carbon/C in listeners) + new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) + + //WAKE UP + else if((findtext(message, wakeup_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.SetSleeping(0) + + //HEAL + else if((findtext(message, heal_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.heal_overall_damage(10 * power_multiplier, 10 * power_multiplier, 0, FALSE, FALSE) + + //BRUTE DAMAGE + else if((findtext(message, hurt_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.apply_damage(15 * power_multiplier, def_zone = BODY_ZONE_CHEST) + + //BLEED + else if((findtext(message, bleed_words))) + cooldown = COOLDOWN_DAMAGE + for(var/mob/living/carbon/human/H in listeners) + H.bleed_rate += (5 * power_multiplier) + + //FIRE + else if((findtext(message, burn_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.adjust_fire_stacks(1 * power_multiplier) + L.IgniteMob() + + //HOT + else if((findtext(message, hot_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.adjust_bodytemperature(50 * power_multiplier) + + //COLD + else if((findtext(message, cold_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.adjust_bodytemperature(-50 * power_multiplier) + + //REPULSE + else if((findtext(message, repulse_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + var/throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(L, user))) + L.throw_at(throwtarget, 3 * power_multiplier, 1 * power_multiplier) + + //ATTRACT + else if((findtext(message, attract_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.throw_at(get_step_towards(user,L), 3 * power_multiplier, 1 * power_multiplier) + + //WHO ARE YOU? + else if((findtext(message, whoareyou_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + var/text = "" + if(is_devil(L)) + var/datum/antagonist/devil/devilinfo = is_devil(L) + text = devilinfo.truename + else + text = L.real_name + addtimer(CALLBACK(L, /atom/movable/proc/say, text), 5 * i) + i++ + + //SAY MY NAME + else if((findtext(message, saymyname_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /atom/movable/proc/say, user.name), 5 * i) + i++ + + //KNOCK KNOCK + else if((findtext(message, knockknock_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /atom/movable/proc/say, "Who's there?"), 5 * i) + i++ + + //STATE LAWS + else if((findtext(message, statelaws_words))) + cooldown = COOLDOWN_STUN + for(var/mob/living/silicon/S in listeners) + S.statelaws(force = 1) + + //MOVE + else if((findtext(message, move_words))) + cooldown = COOLDOWN_MEME + var/direction + if(findtext(message, up_words)) + direction = NORTH + else if(findtext(message, down_words)) + direction = SOUTH + else if(findtext(message, left_words)) + direction = WEST + else if(findtext(message, right_words)) + direction = EAST + for(var/iter in 1 to 5 * power_multiplier) + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(GLOBAL_PROC, .proc/_step, L, direction? direction : pick(GLOB.cardinals)), 10 * (iter - 1)) + + //WALK + else if((findtext(message, walk_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + if(L.m_intent != MOVE_INTENT_WALK) + L.toggle_move_intent() + + //RUN + else if((findtext(message, run_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + if(L.m_intent != MOVE_INTENT_RUN) + L.toggle_move_intent() + + //HELP INTENT + else if((findtext(message, helpintent_words))) + cooldown = COOLDOWN_MEME + for(var/mob/living/carbon/human/H in listeners) + addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HELP), i * 2) + addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) + i++ + + //DISARM INTENT + else if((findtext(message, disarmintent_words))) + cooldown = COOLDOWN_MEME + for(var/mob/living/carbon/human/H in listeners) + addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_DISARM), i * 2) + addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) + i++ + + //GRAB INTENT + else if((findtext(message, grabintent_words))) + cooldown = COOLDOWN_MEME + for(var/mob/living/carbon/human/H in listeners) + addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_GRAB), i * 2) + addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) + i++ + + //HARM INTENT + else if((findtext(message, harmintent_words))) + cooldown = COOLDOWN_MEME + for(var/mob/living/carbon/human/H in listeners) + addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HARM), i * 2) + addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) + i++ + + //THROW/CATCH + else if((findtext(message, throwmode_words))) + cooldown = COOLDOWN_MEME + for(var/mob/living/carbon/C in listeners) + C.throw_mode_on() + + //FLIP + else if((findtext(message, flip_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + L.emote("flip") + + //SPEAK + else if((findtext(message, speak_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /atom/movable/proc/say, pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage")), 5 * i) + i++ + + //GET UP + else if((findtext(message, getup_words))) + cooldown = COOLDOWN_DAMAGE //because stun removal + for(var/V in listeners) + var/mob/living/L = V + if(L.resting) + L.lay_down() //aka get up + L.SetStun(0) + L.SetKnockdown(0) + L.SetUnconscious(0) //i said get up i don't care if you're being tased + + //SIT + else if((findtext(message, sit_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + for(var/obj/structure/chair/chair in get_turf(L)) + chair.buckle_mob(L) + break + + //STAND UP + else if((findtext(message, stand_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + if(L.buckled && istype(L.buckled, /obj/structure/chair)) + L.buckled.unbuckle_mob(L) + + //DANCE + else if((findtext(message, dance_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /mob/living/.proc/emote, "dance"), 5 * i) + i++ + + //JUMP + else if((findtext(message, jump_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + if(prob(25)) + addtimer(CALLBACK(L, /atom/movable/proc/say, "HOW HIGH?!!"), 5 * i) + addtimer(CALLBACK(L, /mob/living/.proc/emote, "jump"), 5 * i) + i++ + + //SALUTE + else if((findtext(message, salute_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /mob/living/.proc/emote, "salute"), 5 * i) + i++ + + //PLAY DEAD + else if((findtext(message, deathgasp_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i) + i++ + + //PLEASE CLAP + else if((findtext(message, clap_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /mob/living/.proc/emote, "clap"), 5 * i) + i++ + + //HONK + else if((findtext(message, honk_words))) + cooldown = COOLDOWN_MEME + addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, get_turf(user), 'sound/items/bikehorn.ogg', 300, 1), 25) + if(user.mind && user.mind.assigned_role == "Clown") + for(var/mob/living/carbon/C in listeners) + C.slip(140 * power_multiplier) + cooldown = COOLDOWN_MEME + + //RIGHT ROUND + else if((findtext(message, multispin_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/L = V + L.SpinAnimation(speed = 10, loops = 5) + + //CITADEL CHANGES + //ORGASM + else if((findtext(message, orgasm_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/carbon/human/H = V + if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure + H.mob_climax(forced_climax=TRUE) + + //DAB + else if((findtext(message, dab_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/M = V + M.say("*dab") + + //SNAP + else if((findtext(message, snap_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/M = V + M.say("*snap") + + //BWOINK + else if((findtext(message, bwoink_words))) + cooldown = COOLDOWN_MEME + addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, get_turf(user), 'sound/effects/adminhelp.ogg', 300, 1), 25) + //END CITADEL CHANGES + + else + cooldown = COOLDOWN_NONE + + if(message_admins) + message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") + log_game("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") + SSblackbox.record_feedback("tally", "voice_of_god", 1, log_message) + + return cooldown + #undef COOLDOWN_STUN #undef COOLDOWN_DAMAGE diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index b1280c3559..78a4c28375 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -1,3 +1,21 @@ /datum/mood_event/eigenstate mood_change = -1 description = "Where the hell am I? Is this an alternative dimension ?\n" + +/datum/mood_event/enthrall + mood_change = 2 + description = "I am a good pet for master.\n" + +/datum/mood_event/enthrallpraise + mood_change = 5 + description = "Master praised me!!\n" + timeout = 1200 + +/datum/mood_event/enthrallscold + mood_change = -5 + description = "I have let master down.\n"//aaa I'm not kinky enough for this + timeout = 1200 + +/datum/mood_event/enthrallmissing1 + mood_change = -5 + description = "\n" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 54fbea8ba1..801938d721 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -154,7 +154,8 @@ id = "enthral" var/mob/living/E //E for enchanter //var/mob/living/V = list() //V for victims - var/resistance = 0 + var/enthralTally = 10 + var/resistanceTally = 0 var/phase = 0 var/enthralID @@ -168,16 +169,16 @@ if(0) return if(1) - + /datum/status_effect/chem/enthral/proc/owner_resist(mob/living/carbon/M) to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") if (M.canbearoused) - resistance += ((100 - M.arousalloss/100)/100) + resistance *= ((100 - M.arousalloss/100)/100) else - resistance += 0.2 + resistance *= 0.2 /* /datum/status_effect/chem/OwO diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index b296bd293a..5855574d76 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -739,12 +739,13 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/enthral/on_mob_life(mob/living/carbon/M) if(!creatorID) CRASH("Something went wrong in enthral creation") - if(M.ID == creatorID) + else if(M.ID == creatorID) var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/silver T.Remove(M) nT.Insert(M) qdel(T) + else //Requires player to be within vicinity of creator //bonuses to mood From b71bc7d9dc08bdff185d80ef6056cd90314681cf Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 4 May 2019 17:50:43 +0100 Subject: [PATCH 092/608] Added happiness, psicodine, neurine and 2/6th of MC chem --- code/datums/mood_events/drug_events.dm | 16 ++++ .../chemistry/reagents/drug_reagents.dm | 78 ++++++++++++++++- .../chemistry/reagents/medicine_reagents.dm | 36 +++++++- .../reagents/chemistry/recipes/drugs.dm | 7 ++ .../reagents/chemistry/recipes/medicine.dm | 12 +++ code/modules/surgery/organs/vocal_cords.dm | 84 ++++++++++++++++--- .../code/datums/status_effects/chems.dm | 19 +++-- .../chemistry/reagents/fermi_reagents.dm | 12 +-- 8 files changed, 235 insertions(+), 29 deletions(-) diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm index 40c239180e..6ed33b0f00 100644 --- a/code/datums/mood_events/drug_events.dm +++ b/code/datums/mood_events/drug_events.dm @@ -37,3 +37,19 @@ /datum/mood_event/withdrawal_critical/add_effects(drug_name) description = "[drug_name]! [drug_name]! [drug_name]!\n" + +/datum/mood_event/happiness_drug + description = "I can't feel anything and I never want this to end.\n" + mood_change = 50 + +/datum/mood_event/happiness_drug_good_od + description = "YES! YES!! YES!!!\n" + mood_change = 100 + timeout = 300 + special_screen_obj = "mood_happiness_good" + +/datum/mood_event/happiness_drug_bad_od + description = "NO! NO!! NO!!!\n" + mood_change = -100 + timeout = 300 + special_screen_obj = "mood_happiness_bad" diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index d77756a649..cd439b1899 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -359,6 +359,83 @@ ..() . = 1 +/datum/reagent/drug/happiness + name = "Happiness" + id = "happiness" + description = "Fills you with ecstasic numbness and causes minor brain damage. Highly addictive. If overdosed causes sudden mood swings." + reagent_state = LIQUID + color = "#FFF378" + addiction_threshold = 10 + overdose_threshold = 20 + +/datum/reagent/drug/happiness/on_mob_add(mob/living/L) + ..() + L.add_trait(TRAIT_FEARLESS, id) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug) + +/datum/reagent/drug/happiness/on_mob_delete(mob/living/L) + L.remove_trait(TRAIT_FEARLESS, id) + SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "happiness_drug") + ..() + +/datum/reagent/drug/happiness/on_mob_life(mob/living/carbon/M) + M.jitteriness = 0 + M.confused = 0 + M.disgust = 0 + M.adjustBrainLoss(0.2) + ..() + . = 1 + +/datum/reagent/drug/happiness/overdose_process(mob/living/M) + if(prob(30)) + var/reaction = rand(1,3) + switch(reaction) + if(1) + M.emote("laugh") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug_good_od) + if(2) + M.emote("sway") + M.Dizzy(25) + if(3) + M.emote("frown") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug_bad_od) + M.adjustBrainLoss(0.5) + ..() + . = 1 + +/datum/reagent/drug/happiness/addiction_act_stage1(mob/living/M)// all work and no play makes jack a dull boy + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + mood.setSanity(min(mood.sanity, SANITY_DISTURBED)) + M.Jitter(5) + if(prob(20)) + M.emote(pick("twitch","laugh","frown")) + ..() + +/datum/reagent/drug/happiness/addiction_act_stage2(mob/living/M) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + mood.setSanity(min(mood.sanity, SANITY_UNSTABLE)) + M.Jitter(10) + if(prob(30)) + M.emote(pick("twitch","laugh","frown")) + ..() + +/datum/reagent/drug/happiness/addiction_act_stage3(mob/living/M) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + mood.setSanity(min(mood.sanity, SANITY_CRAZY)) + M.Jitter(15) + if(prob(40)) + M.emote(pick("twitch","laugh","frown")) + ..() + +/datum/reagent/drug/happiness/addiction_act_stage4(mob/living/carbon/human/M) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + mood.setSanity(SANITY_INSANE) + M.Jitter(20) + if(prob(50)) + M.emote(pick("twitch","laugh","frown")) + ..() + . = 1 + /datum/reagent/drug/skooma name = "Skooma" id = "skooma" @@ -429,4 +506,3 @@ if(prob(40)) M.emote(pick("twitch","drool","moan")) ..() - diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 58926d0c69..34643085e7 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -62,7 +62,7 @@ M.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) if(M.blood_volume < BLOOD_VOLUME_NORMAL) M.blood_volume = BLOOD_VOLUME_NORMAL - + for(var/thing in M.diseases) var/datum/disease/D = thing if(D.severity == DISEASE_SEVERITY_POSITIVE) @@ -1286,3 +1286,37 @@ M.adjustStaminaLoss(1.5*REM, 0) ..() return TRUE + +/datum/reagent/medicine/psicodine + name = "Psicodine" + id = "psicodine" + description = "Suppresses anxiety and other various forms of mental distress. Overdose causes hallucinations and minor toxin damage." + reagent_state = LIQUID + color = "#07E79E" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 30 + +/datum/reagent/medicine/psicodine/on_mob_add(mob/living/L) + ..() + L.add_trait(TRAIT_FEARLESS, id) + +/datum/reagent/medicine/psicodine/on_mob_delete(mob/living/L) + L.remove_trait(TRAIT_FEARLESS, id) + ..() + +/datum/reagent/medicine/psicodine/on_mob_life(mob/living/carbon/M) + M.jitteriness = max(0, M.jitteriness-6) + M.dizziness = max(0, M.dizziness-6) + M.confused = max(0, M.confused-6) + M.disgust = max(0, M.disgust-6) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then... + mood.setSanity(min(mood.sanity+5, SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral + ..() + . = 1 + +/datum/reagent/medicine/psicodine/overdose_process(mob/living/M) + M.hallucination = min(max(0, M.hallucination + 5), 60) + M.adjustToxLoss(1, 0) + ..() + . = 1 diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index d91e2af7e9..27b1fe12ee 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -41,6 +41,13 @@ results = list("aranesp" = 3) required_reagents = list("epinephrine" = 1, "atropine" = 1, "morphine" = 1) +/datum/chemical_reaction/happiness + name = "Happiness" + id = "happiness" + results = list("happiness" = 4) + required_reagents = list("nitrous_oxide" = 2, "epinephrine" = 1, "ethanol" = 1) + required_catalysts = list("plasma" = 5) + /datum/chemical_reaction/skooma name = "skooma" id = "skooma" diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index dc7c32d925..4cecf4216c 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -172,6 +172,12 @@ results = list("mutadone" = 3) required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1) +/datum/chemical_reaction/neurine + name = "Neurine" + id = "neurine" + results = list("neurine" = 3) + required_reagents = list("mannitol" = 1, "acetone" = 1, "oxygen" = 1) + /datum/chemical_reaction/antihol name = "antihol" id = "antihol" @@ -252,3 +258,9 @@ results = list("modafinil" = 5) required_reagents = list("diethylamine" = 1, "ammonia" = 1, "phenol" = 1, "acetone" = 1, "sacid" = 1) required_catalysts = list("bromine" = 1) // as close to the real world synthesis as possible + +/datum/chemical_reaction/psicodine + name = "Psicodine" + id = "psicodine" + results = list("psicodine" = 5) + required_reagents = list( "mannitol" = 2, "water" = 2, "impedrezene" = 1) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index c6c40de31a..60734aafc6 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -762,19 +762,19 @@ specific_listeners += L //focus on those with the specified name //Cut out the name so it doesn't trigger commands found_string = L.real_name - power_multiplier *= 2 + power_multiplier += 0.5 else if(dd_hasprefix(message, L.first_name())) specific_listeners += L //focus on those with the specified name //Cut out the name so it doesn't trigger commands found_string = L.first_name() - power_multiplier *= 2 + power_multiplier += 0.5 else if(L.mind && L.mind.assigned_role && dd_hasprefix(message, L.mind.assigned_role)) specific_listeners += L //focus on those with the specified job //Cut out the job so it doesn't trigger commands found_string = L.mind.assigned_role - power_multiplier *= 2 + power_multiplier += 0.25 if(specific_listeners.len) listeners = specific_listeners @@ -782,7 +782,7 @@ message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1) //phase 1 - var/static/regex/enthral_words = regex("relax|obey|give in|love|serve|docile") + var/static/regex/enthral_words = regex("relax|obey|give in|love|serve|docile|so easy") var/static/regex/reward_words = regex("good boy|good girl|good pet") var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") var/static/regex/attract_words = regex("come here|come to me|get over here|attract") @@ -838,16 +838,81 @@ var/static/regex/snap_words = regex("snap") //CITADEL CHANGE //var/static/regex/bwoink_words = regex("what the fuck are you doing|bwoink|hey you got a moment?") //CITADEL CHANGE + var/distancelist = list(1.5,1.5,1.3,1.2,1.1,1,0.8,0.6,0.5,0.25) + var/static/regex/reward_words = regex("good boy|good girl|good pet") + var/static/regex/silence_words = regex("silence|be silent|ssh|quiet|hush") + var/static/regex/attract_words = regex("come here|come to me|get over here|attract") + var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") + var/static/regex/resist_words = regex("resist|snap out of it|come to your senses")//useful if two enthrallers are fighting + var/static/regex/forget_words = regex("forget|muddled|") //enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words //ENTHRAL if(findtext(message, enthral_words)) - cooldown = COOLDOWN_VTHRAL for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) - E.enthralTally += power_multiplier + power_multiplier *= distancelist[get_dist(user, V)+1] + //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values + if(message.len > 50) + E.enthralTally += (power_multiplier*((message.len/200) + 1) //encourage players to say more than one word. + else + E.enthralTally += power_multiplier*1.25 + cooldown = COOLDOWN_VTHRAL + + //REWARD + if(findtext(message, reward_words)) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + power_multiplier *= distancelist[get_dist(user, V)+1] + //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values + if (L.canbearoused) + //E.resistanceTally -= 1 + L.adjustArousalLoss(1*power_multiplier) + else + E.resistanceTally /= 2*power_multiplier + cooldown = COOLDOWN_VTHRAL + + //PUNISH + if(findtext(message, punish_words)) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + power_multiplier *= distancelist[get_dist(user, V)+1] + //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values + if (L.canbearoused) + E.resistanceTally /= 1*power_multiplier + L.adjustArousalLoss(-2*power_multiplier) + else + E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously) + cooldown = COOLDOWN_VTHRAL + + //SILENCE + else if((findtext(message, silence_words))) + cooldown = COOLDOWN_VSTUN + for(var/mob/living/carbon/C in listeners) + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if L.phase == 3 //If target is fully enthralled, + C.add_trait(TRAIT_MUTE, TRAUMA_TRAIT) + else + C.silent += ((10 * power_multiplier) * E.phase + + //RESIST + else if((findtext(message, silence_words))) + cooldown = COOLDOWN_VSTUN + for(var/mob/living/carbon/C in listeners) + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + E.deltaResist += (power_multiplier) + + //FORGET + else if((findtext(message, silence_words))) + cooldown = COOLDOWN_VSTUN + for(var/mob/living/carbon/C in listeners) + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + E.deltaResist += (power_multiplier) + var/i = 0 //STUN @@ -877,13 +942,6 @@ for(var/mob/living/carbon/C in listeners) C.vomit(10 * power_multiplier, distance = power_multiplier) - //SILENCE - else if((findtext(message, silence_words))) - cooldown = COOLDOWN_STUN - for(var/mob/living/carbon/C in listeners) - if(user.mind && (user.mind.assigned_role == "Curator" || user.mind.assigned_role == "Mime")) - power_multiplier *= 3 - C.silent += (10 * power_multiplier) //HALLUCINATE else if((findtext(message, hallucinate_words))) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 801938d721..724ab291f2 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -150,21 +150,24 @@ /////////////////////////////////////////// */ -/datum/status_effect/chem/enthral - id = "enthral" +/datum/status_effect/chem/enthrall + id = "enthrall" var/mob/living/E //E for enchanter //var/mob/living/V = list() //V for victims - var/enthralTally = 10 + var/enthrallTally = 10 var/resistanceTally = 0 - var/phase = 0 + var/deltaResist + var/deltaEnthrall + var/phase = 1 //1: initial, 2: 2nd stage - more commands, 3rd: fully enthralled + var/command var/enthralID -/datum/status_effect/chem/enthra/on_apply(mob/living/carbon/M) +/datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) if(M.ID == ) -/datum/status_effect/chem/enthral/tick(mob/living/carbon/M) - redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) +/datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) + redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed switch(phase) if(0) return @@ -173,7 +176,7 @@ -/datum/status_effect/chem/enthral/proc/owner_resist(mob/living/carbon/M) +/datum/status_effect/chem/enthrall/proc/owner_resist(mob/living/carbon/M) to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") if (M.canbearoused) resistance *= ((100 - M.arousalloss/100)/100) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 5855574d76..c89a88af0b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -39,10 +39,10 @@ addiction_stage4_end = 43 //Incase it's too long var/location_created var/turf/open/location_return = null - var/addictCyc1 = 1 - var/addictCyc2 = 1 - var/addictCyc3 = 1 - var/addictCyc4 = 1 + var/addictCyc1 = 0 + var/addictCyc2 = 0 + var/addictCyc3 = 0 + var/addictCyc4 = 0 var/mob/living/fermi_Tclone = null var/teleBool = FALSE mob/living/carbon/purgeBody @@ -152,7 +152,7 @@ /datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. switch(src.addictCyc4) - if(1) + if(0) do_sparks(5,FALSE,M) do_teleport(M, get_turf(M), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! do_sparks(5,FALSE,M) @@ -172,7 +172,7 @@ src.addictCyc4++ ..() - //. = 1 + . = 1 ///datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) // return From f31a46e029c195993c88812eb89f3522f29598b7 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 5 May 2019 20:32:07 +0100 Subject: [PATCH 093/608] Fixed a few things, 1/2 way through MC chem. --- code/__DEFINES/components.dm | 4 + code/modules/surgery/organs/tongue.dm | 4 +- code/modules/surgery/organs/vocal_cords.dm | 158 ++++++++---------- .../code/datums/mood_events/chem_events.dm | 24 ++- .../code/datums/status_effects/chems.dm | 124 +++++++++++++- .../clothing/fermichemclothe/fermiclothes.dm | 4 +- .../chemistry/reagents/fermi_reagents.dm | 22 +-- .../reagents/chemistry/recipes/fermi.dm | 1 + 8 files changed, 219 insertions(+), 122 deletions(-) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 3338fc1cda..8bcccbb02a 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -137,6 +137,9 @@ #define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) #define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage) #define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () +#define COMSIG_LIVING_SAY "say" //mob/living/say() - return COMSIG_I_FORGET_WHAT_TO_CALL_IT to interrupt before message sent. + #define COMPONENT_NO_SAY 1 // Here I am pretending to know what I'm doing. + // /mob/living/carbon signals #define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) @@ -145,6 +148,7 @@ #define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled) #define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value) + // /obj/item signals #define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) #define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 3e202acf41..5437f4ee17 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -216,8 +216,6 @@ message = replacetext(message, "l", "w") message = replacetext(message, "r", "w") if(prob(20)) - message += " OwO" - else if(prob(30)) - message += " uwu" + message += pick(" OwO", " uwu") message = lowertext(message) return message diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 60734aafc6..8b45e3e4cf 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -613,7 +613,7 @@ return cooldown ////////////////////////////////////// -///////ENTHRAL SILVER TONGUE////////// +///////ENTHRAL VELVET CHORDS////////// ////////////////////////////////////// //Heavily modified voice of god code @@ -674,8 +674,8 @@ */ /obj/item/organ/vocal_cords/velvet/handle_speech(message) - var/cooldown = velvetspeec(hmessage, owner, spans, base_multiplier) - return //voice of god speaks for us + var/cooldown = velvetspeech(message, owner, spans, base_multiplier) + return //velvetspeech should handle speech @@ -718,7 +718,7 @@ if(istype(H.neck, /obj/item/clothing/neck/petcollar)) power_multiplier *= 1.5 //Collaring players makes them more docile and accepting of their place as a pet if(H.has_trait(TRAIT_CROCRIN_IMMUNE) || !M.canbearoused) - power_multiplier *= 1.5//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. + power_multiplier *= 1.5//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. listeners += L if(!listeners.len) @@ -739,7 +739,7 @@ if(user.mind.assigned_role == "Mime") power_multiplier *= 0.5 - //Cultists are closer to their gods and are more better at indoctrinating + //Cultists are closer to their gods and are better at indoctrinating if(iscultist(user)) power_multiplier *= 2 else if (is_servant_of_ratvar(user)) @@ -778,7 +778,7 @@ if(specific_listeners.len) listeners = specific_listeners - //power_multiplier *= (1 + (1/specific_listeners.len)) //Put this is if it becomes OP + //power_multiplier *= (1 + (1/specific_listeners.len)) //Put this is if it becomes OP, power is judged internally on a thrall, so shouldn't be nessicary. message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1) //phase 1 @@ -789,8 +789,11 @@ var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") var/static/regex/desire_words = regex("good boy|good girl|good pet") var/static/regex/resist_words = regex("resist|snap out of it|fight")//useful if two enthrallers are fighting - var/static/regex/forget_words = regex("forget|muddled|") + var/static/regex/forget_words = regex("forget|muddled") //phase 2 + var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //CITADEL CHANGE + var/static/regex/awoo_words = regex("howl|awoo|bark") + var/static/regex/nya_words = regex("nya|meow|mewl") var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown") var/static/regex/sleep_words = regex("sleep|slumber|rest") @@ -808,7 +811,7 @@ var/static/regex/whoareyou_words = regex("who are you|say your name|state your name|identify") var/static/regex/saymyname_words = regex("say my name|who am i|whoami") var/static/regex/knockknock_words = regex("knock knock") - var/static/regex/statelaws_words = regex("state laws|state your laws") + //var/static/regex/statelaws_words = regex("state laws|state your laws") var/static/regex/move_words = regex("move|walk") var/static/regex/left_words = regex("left|west|port") var/static/regex/right_words = regex("right|east|starboard") @@ -831,23 +834,19 @@ var/static/regex/salute_words = regex("salute") var/static/regex/deathgasp_words = regex("play dead") var/static/regex/clap_words = regex("clap|applaud") - var/static/regex/honk_words = regex("ho+nk") //hooooooonk - var/static/regex/multispin_words = regex("like a record baby|right round") - var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //CITADEL CHANGE - var/static/regex/dab_words = regex("dab|mood") //CITADEL CHANGE - var/static/regex/snap_words = regex("snap") //CITADEL CHANGE + //var/static/regex/honk_words = regex("ho+nk") //hooooooonk + //var/static/regex/multispin_words = regex("like a record baby|right round") + + //var/static/regex/dab_words = regex("dab|mood") //CITADEL CHANGE + //var/static/regex/snap_words = regex("snap") //CITADEL CHANGE //var/static/regex/bwoink_words = regex("what the fuck are you doing|bwoink|hey you got a moment?") //CITADEL CHANGE var/distancelist = list(1.5,1.5,1.3,1.2,1.1,1,0.8,0.6,0.5,0.25) - var/static/regex/reward_words = regex("good boy|good girl|good pet") - var/static/regex/silence_words = regex("silence|be silent|ssh|quiet|hush") - var/static/regex/attract_words = regex("come here|come to me|get over here|attract") - var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") - var/static/regex/resist_words = regex("resist|snap out of it|come to your senses")//useful if two enthrallers are fighting - var/static/regex/forget_words = regex("forget|muddled|") //enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words + + //Tier 1 //ENTHRAL if(findtext(message, enthral_words)) for(var/V in listeners) @@ -859,7 +858,7 @@ E.enthralTally += (power_multiplier*((message.len/200) + 1) //encourage players to say more than one word. else E.enthralTally += power_multiplier*1.25 - cooldown = COOLDOWN_VTHRAL + cooldown = 100 //REWARD if(findtext(message, reward_words)) @@ -893,26 +892,70 @@ else if((findtext(message, silence_words))) cooldown = COOLDOWN_VSTUN for(var/mob/living/carbon/C in listeners) - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthral/C = C.has_status_effect(/datum/status_effect/chem/enthral) + power_multiplier *= distancelist[get_dist(user, V)+1] if L.phase == 3 //If target is fully enthralled, C.add_trait(TRAIT_MUTE, TRAUMA_TRAIT) else - C.silent += ((10 * power_multiplier) * E.phase + C.silent += ((10 * power_multiplier) * E.phase) //RESIST else if((findtext(message, silence_words))) cooldown = COOLDOWN_VSTUN for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + power_multiplier *= distancelist[get_dist(user, V)+1] E.deltaResist += (power_multiplier) - //FORGET + //FORGET (A way to cancel the process) else if((findtext(message, silence_words))) cooldown = COOLDOWN_VSTUN for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) - E.deltaResist += (power_multiplier) + C.Sleeping(40) + to_chat(C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!") + E.phase = 0 + //ATTRACT + else if((findtext(message, attract_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + L.throw_at(get_step_towards(user,L), 3 * power_multiplier, 1 * power_multiplier) + + //teir 2 + + //ORGASM + else if((findtext(message, orgasm_words))) + cooldown = COOLDOWN_MEME + for(var/V in listeners) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure + H.mob_climax(forced_climax=TRUE) + H.setArousalLoss(H.min_arousal) + L.resistance = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). + + //awoo + else if((findtext(message, awoo_words))) + cooldown = 0 + for(var/V in listeners) + var/mob/living/M = V + M.say("*awoo") + + //Nya + else if((findtext(message, nya_words))) + cooldown = 0 + for(var/V in listeners) + var/mob/living/M = V + playsound(get_turf(H), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/merowr.ogg', 'modular_citadel/sound/voice/nya.ogg'), , 50, 1, -1) + M.emote("me","lets out a nya!") + + //SLEEP + else if((findtext(message, sleep_words))) + cooldown = COOLDOWN_STUN + for(var/mob/living/carbon/C in listeners) + C.Sleeping(40 * power_multiplier) var/i = 0 //STUN @@ -930,11 +973,7 @@ var/mob/living/L = V L.Knockdown(60 * power_multiplier) - //SLEEP - else if((findtext(message, sleep_words))) - cooldown = COOLDOWN_STUN - for(var/mob/living/carbon/C in listeners) - C.Sleeping(40 * power_multiplier) + //VOMIT else if((findtext(message, vomit_words))) @@ -1006,12 +1045,7 @@ var/throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(L, user))) L.throw_at(throwtarget, 3 * power_multiplier, 1 * power_multiplier) - //ATTRACT - else if((findtext(message, attract_words))) - cooldown = COOLDOWN_DAMAGE - for(var/V in listeners) - var/mob/living/L = V - L.throw_at(get_step_towards(user,L), 3 * power_multiplier, 1 * power_multiplier) + //WHO ARE YOU? else if((findtext(message, whoareyou_words))) @@ -1171,24 +1205,6 @@ addtimer(CALLBACK(L, /mob/living/.proc/emote, "dance"), 5 * i) i++ - //JUMP - else if((findtext(message, jump_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - if(prob(25)) - addtimer(CALLBACK(L, /atom/movable/proc/say, "HOW HIGH?!!"), 5 * i) - addtimer(CALLBACK(L, /mob/living/.proc/emote, "jump"), 5 * i) - i++ - - //SALUTE - else if((findtext(message, salute_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - addtimer(CALLBACK(L, /mob/living/.proc/emote, "salute"), 5 * i) - i++ - //PLAY DEAD else if((findtext(message, deathgasp_words))) cooldown = COOLDOWN_MEME @@ -1197,14 +1213,6 @@ addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i) i++ - //PLEASE CLAP - else if((findtext(message, clap_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - addtimer(CALLBACK(L, /mob/living/.proc/emote, "clap"), 5 * i) - i++ - //HONK else if((findtext(message, honk_words))) cooldown = COOLDOWN_MEME @@ -1221,34 +1229,6 @@ var/mob/living/L = V L.SpinAnimation(speed = 10, loops = 5) - //CITADEL CHANGES - //ORGASM - else if((findtext(message, orgasm_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/carbon/human/H = V - if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure - H.mob_climax(forced_climax=TRUE) - - //DAB - else if((findtext(message, dab_words))) - cooldown = COOLDOWN_DAMAGE - for(var/V in listeners) - var/mob/living/M = V - M.say("*dab") - - //SNAP - else if((findtext(message, snap_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/M = V - M.say("*snap") - - //BWOINK - else if((findtext(message, bwoink_words))) - cooldown = COOLDOWN_MEME - addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, get_turf(user), 'sound/effects/adminhelp.ogg', 300, 1), 25) - //END CITADEL CHANGES else cooldown = COOLDOWN_NONE diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index 78a4c28375..7f55607832 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -3,19 +3,27 @@ description = "Where the hell am I? Is this an alternative dimension ?\n" /datum/mood_event/enthrall - mood_change = 2 - description = "I am a good pet for master.\n" + mood_change = 5 + description = "I am a good pet for Master.\n" /datum/mood_event/enthrallpraise - mood_change = 5 + mood_change = 10 description = "Master praised me!!\n" - timeout = 1200 + timeout = 400 /datum/mood_event/enthrallscold - mood_change = -5 - description = "I have let master down.\n"//aaa I'm not kinky enough for this - timeout = 1200 + mood_change = -10 + description = "I have let Master down.\n"//aaa I'm not kinky enough for this + timeout = 400 /datum/mood_event/enthrallmissing1 mood_change = -5 - description = "\n" + description = "I miss Master's presence.\n" + +/datum/mood_event/enthrallmissing2 + mood_change = -10 + description = "I really miss Masters presence.\n" + +/datum/mood_event/enthrallmissing3 + mood_change = -25 + description = "Where are you Master??!\n" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 724ab291f2..9d68233ca5 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -1,7 +1,14 @@ /datum/status_effect/chem/SGDF id = "SGDF" var/mob/living/fermi_Clone + alert_type = null +/* +/obj/screen/alert/status_effect/SDGF + name = "SDGF" + desc = "You've cloned yourself! How cute." + icon_state = "SDGF" +*/ /datum/status_effect/chem/SGDF/on_apply() message_admins("SGDF status appied") @@ -36,6 +43,7 @@ /datum/status_effect/chem/BElarger id = "BElarger" + alert_type = null //var/list/items = list() //var/items = o.get_contents() @@ -100,6 +108,7 @@ /datum/status_effect/chem/PElarger id = "PElarger" + alert_type = null /datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. message_admins("PElarge started!") @@ -152,37 +161,134 @@ /datum/status_effect/chem/enthrall id = "enthrall" + alert_type = null var/mob/living/E //E for enchanter //var/mob/living/V = list() //V for victims var/enthrallTally = 10 var/resistanceTally = 0 var/deltaResist var/deltaEnthrall - var/phase = 1 //1: initial, 2: 2nd stage - more commands, 3rd: fully enthralled - var/command - var/enthralID + var/phase = 1 //-1: resisted state, due to be removed.0: sleeper agent, no effects unless triggered 1: initial, 2: 2nd stage - more commands, 3rd: fully enthralled, 4th Mindbroken + var/status = null + var/statusStrength = 0 + var/enthrallID + var/mindbroken = FALSE + var/datum/weakref/redirect_component1 + var/datum/weakref/redirect_component2 /datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) - if(M.ID == ) + if(M.ID == enthralID) + owner.remove_status_effect(src)//This should'nt happen, but just in case + redirect_component1 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# + redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed /datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) - redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed + if(M.has_trait(TRAIT_MINDSHIELD)) + resistanceTally += 5 + if(prob(20)) + to_chat(owner, "You feel your lucidity returning as the mindshield fights") + switch(phase) - if(0) + if(-1)//fully removed + owner.remove_status_effect(src) + if(0)// sleeper agent return - if(1) + if(1)//Initial enthrallment + if (enthrallTally > 100) + phase += 1 + return + if (resistanceTally > 100) + + if resist +/datum/status_effect/chem/enthrall/on_remove(mob/living/carbon/M) + qdel(redirect_component1.resolve()) + redirect_component1 = null + qdel(redirect_component2.resolve()) + redirect_component2 = null +/* +/datum/status_effect/chem/enthrall/mob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) + if(enthralID.name in message || enthralID.first_name in message) + return + else + . = ..() +*/ + +/datum/status_effect/chem/enthrall/proc/owner_withdrawal(mob/living/carbon/M) + //3 stages, each getting worse /datum/status_effect/chem/enthrall/proc/owner_resist(mob/living/carbon/M) + if(prob(10)) + M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") + //base resistance if (M.canbearoused) - resistance *= ((100 - M.arousalloss/100)/100) + deltaResist*= ((100 - M.arousalloss/100)/100)//more aroused you are, the weaker resistance you can give else - resistance *= 0.2 + deltaResist *= 0.2 + //chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist. + if (user.has_reagent("mannitol")) + deltaResist *= 1.25 + if (user.has_reagent("neurine")) + deltaResist *= 1.5 + if (!H.has_trait(TRAIT_CROCRIN_IMMUNE) && M.canbearoused) + if (user.has_reagent("anaphro")) + deltaResist *= 1.5 + if (user.has_reagent("anaphro+")) + deltaResist *= 2 + if (user.has_reagent("aphro")) + deltaResist *= 0.75 + if (user.has_reagent("aphro+")) + deltaResist *= 0.5 + //Antag resistance + //cultists are already brainwashed by their god + if(iscultist(owner)) + deltaResist *= 2 + else if (is_servant_of_ratvar(user)) + deltaResist *= 2 + //antags should be able to resist, so they can do their other objectives. This chem does frustrate them, but they've all the tools to break free when an oportunity presents itself. + else if (owner.mind.assigned_role in GLOB.antagonists) + deltaResist *= 1.8 + + //role resistance + //Chaplains are already brainwashed by their god + if(owner.mind.assigned_role == "Chaplain") + deltaResist *= 1.5 + //Command staff has authority, + if(owner.mind.assigned_role in GLOB.command_positions) + deltaResist *= 1.4 + //if(owner.first_name == "skylar"); power_multiplier *= 0.8 //for skylar //I'm kidding + //Chemists should be familiar with drug effects + if(owner.mind.assigned_role == "Chemist") + deltaResist *= 1.3 + + //Happiness resistance + //Your Thralls are like pets, you need to keep them happy. + if(owner.nutrition < 250) + deltaResist += (250-owner.nutrition)/100 + if(owner.health < 120)//Harming your thrall will make them rebel harder. + deltaResist *= ((120-owner.health)/100)+1 + //Add cold/hot, oxygen, sanity, happiness? (happiness might be moot, since the mood effects are so strong) + //Mental health could play a role too in the other direction + + //If master gives you a collar, you get a sense of pride + if(istype(owner.neck, /obj/item/clothing/neck/petcollar)) + deltaResist *= 0.8 + +/datum/status_effect/chem/enthrall/proc/owner_say(mob/living/carbon/M) //I can only hope this works + var/static/regex/owner_words = regex("[enthralID.real_name]|[enthralID.first_name()]") + if(findtext(message, enthral_words)) + if(enthralID.gender == FEMALE) + message = replacetext(message, enthralID.real_name, "Mistress") + message = replacetext(message, enthralID.first_name(, "Mistress") + else + message = replacetext(message, enthralID.real_name, "Master") + message = replacetext(message, enthralID.first_name(, "Master") + return message /* /datum/status_effect/chem/OwO id = "OwO" diff --git a/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm index 80ae690ada..6dcfa20b95 100644 --- a/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm +++ b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm @@ -1,8 +1,8 @@ //Fermiclothes! //Clothes made from FermiChem -/obj/item/clothing/head/hattip //Actually the M1 Helmet - name = "flak helmet" +/obj/item/clothing/head/hattip //I wonder if anyone else has played cryptworlds + name = "Sythetic hat" con = 'icons/obj/clothing/hats.dmi' icon_state = "top_hat" desc = "A sythesized hat, you can't seem to take it off. And tips their hat." diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index c89a88af0b..ae71736d24 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -724,27 +724,27 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING qdel(M) //Approx 60minutes till death from initial addiction ..() -/datum/reagent/fermi/enthral - name = "Need a name" +/datum/reagent/fermi/enthrall + name = "MKUltra" id = "enthral" description = "Need a description." color = "#A080H4" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" metabolization_rate = 0 - overdose_threshold = 20 - addiction_threshold = 30 - addiction_stage1_end = 9999//Should never end. + //overdose_threshold = 20 + //addiction_threshold = 30 + //addiction_stage1_end = 9999//Should never end. var/creatorID //add here -/datum/reagent/fermi/enthral/on_mob_life(mob/living/carbon/M) +/datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) if(!creatorID) CRASH("Something went wrong in enthral creation") else if(M.ID == creatorID) - var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) - var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/silver - T.Remove(M) - nT.Insert(M) - qdel(T) + var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) + var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet + Vc.Remove(M) + nVc.Insert(M) + qdel(Vc) else //Requires player to be within vicinity of creator diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 23ad696d46..e6b23f6e67 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -107,6 +107,7 @@ id = "enthral" results = list("enthral" = 3) required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) + required_catalysts = list("blood" = 1) //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions From 1385e12fe323c1bf7a82ad49ac43dc4f2e853283 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 7 May 2019 23:38:50 +0100 Subject: [PATCH 094/608] MC 4/6th done --- code/modules/surgery/organs/tongue.dm | 1 - code/modules/surgery/organs/vocal_cords.dm | 73 +++++++++---- .../code/datums/mood_events/chem_events.dm | 18 ++-- .../code/datums/status_effects/chems.dm | 101 +++++++++++++++--- .../chemistry/reagents/fermi_reagents.dm | 10 +- .../reagents/chemistry/recipes/fermi.dm | 4 +- 6 files changed, 159 insertions(+), 48 deletions(-) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 5437f4ee17..64020bf167 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -211,7 +211,6 @@ message = replacetext(message, "na", "nya") message = replacetext(message, "no", "nyo") message = replacetext(message, "ove", "uv") - message = replacetext(message, "ove", "uv") //message = replacetext(message, "th", "ff") //too incoherent in practice message = replacetext(message, "l", "w") message = replacetext(message, "r", "w") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 8b45e3e4cf..dd9470d952 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -715,10 +715,6 @@ var/mob/living/carbon/human/H = L if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) continue - if(istype(H.neck, /obj/item/clothing/neck/petcollar)) - power_multiplier *= 1.5 //Collaring players makes them more docile and accepting of their place as a pet - if(H.has_trait(TRAIT_CROCRIN_IMMUNE) || !M.canbearoused) - power_multiplier *= 1.5//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. listeners += L if(!listeners.len) @@ -781,6 +777,17 @@ //power_multiplier *= (1 + (1/specific_listeners.len)) //Put this is if it becomes OP, power is judged internally on a thrall, so shouldn't be nessicary. message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1) + var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) + if (T.name == "fluffy tongue") //If you sound hillarious, it's hard to take you seriously. This is a way for other players to combat/reduce their effectiveness. + power_multiplier*0.75 + + /* CHECK THIS STUFF IN THE CHEM STATUS INSTEAD. + if(istype(H.neck, /obj/item/clothing/neck/petcollar)) + power_multiplier *= 1.5 //Collaring players makes them more docile and accepting of their place as a pet + if(H.has_trait(TRAIT_CROCRIN_IMMUNE) || !M.canbearoused) + power_multiplier *= 1.5//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. + */ + //phase 1 var/static/regex/enthral_words = regex("relax|obey|give in|love|serve|docile|so easy") var/static/regex/reward_words = regex("good boy|good girl|good pet") @@ -789,9 +796,9 @@ var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") var/static/regex/desire_words = regex("good boy|good girl|good pet") var/static/regex/resist_words = regex("resist|snap out of it|fight")//useful if two enthrallers are fighting - var/static/regex/forget_words = regex("forget|muddled") + var/static/regex/forget_words = regex("forget|muddled|awake and forget") //phase 2 - var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //CITADEL CHANGE + var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //lewd var/static/regex/awoo_words = regex("howl|awoo|bark") var/static/regex/nya_words = regex("nya|meow|mewl") var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") @@ -800,7 +807,7 @@ var/static/regex/vomit_words = regex("vomit|throw up|sick") //phase 3 //var/static/regex/hallucinate_words = regex("see the truth|hallucinate") - var/static/regex/wakeup_words = regex("wake up|awaken") + var/static/regex/wakeup_words = regex("revert|awaken|*snap") var/static/regex/heal_words = regex("live|heal|survive|mend|life|heroes never die") var/static/regex/hurt_words = regex("die|suffer|hurt|pain|death") var/static/regex/bleed_words = regex("bleed|there will be blood") @@ -847,7 +854,7 @@ //enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words //Tier 1 - //ENTHRAL + //ENTHRAL mixable if(findtext(message, enthral_words)) for(var/V in listeners) var/mob/living/L = V @@ -860,7 +867,7 @@ E.enthralTally += power_multiplier*1.25 cooldown = 100 - //REWARD + //REWARD mixable if(findtext(message, reward_words)) for(var/V in listeners) var/mob/living/L = V @@ -874,7 +881,7 @@ E.resistanceTally /= 2*power_multiplier cooldown = COOLDOWN_VTHRAL - //PUNISH + //PUNISH mixable if(findtext(message, punish_words)) for(var/V in listeners) var/mob/living/L = V @@ -948,14 +955,47 @@ cooldown = 0 for(var/V in listeners) var/mob/living/M = V - playsound(get_turf(H), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/merowr.ogg', 'modular_citadel/sound/voice/nya.ogg'), , 50, 1, -1) + playsound(get_turf(H), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/merowr.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) M.emote("me","lets out a nya!") //SLEEP else if((findtext(message, sleep_words))) cooldown = COOLDOWN_STUN for(var/mob/living/carbon/C in listeners) - C.Sleeping(40 * power_multiplier) + C.Sleeping(20 * power_multiplier *) + + //WAKE UP + else if((findtext(message, wakeup_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(0) + E.phase = 3 + E.status = null + to_chat(C, "The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve.") + L.SetSleeping(0) + + + //TO ADD + //progam triggers and responses with mental costs + //Antiresist + //Figure out cooldown + + //STRIP + else if((findtext(message, strip_words))) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(2 to INFINITY)//Tier 2 only + E.phase = 1 + var/items = M.get_contents() + for(var/I in items) + M.dropItemToGround(I, TRUE) + + / var/i = 0 //STUN @@ -964,7 +1004,7 @@ for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthral/E = has_status_effect(/datum/status_effect/chem/enthral) - L.Stun(60 * power_multiplier) + L.Stun(30 * power_multiplier) //KNOCKDOWN else if(findtext(message, knockdown_words)) @@ -988,12 +1028,7 @@ for(var/mob/living/carbon/C in listeners) new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) - //WAKE UP - else if((findtext(message, wakeup_words))) - cooldown = COOLDOWN_DAMAGE - for(var/V in listeners) - var/mob/living/L = V - L.SetSleeping(0) + //HEAL else if((findtext(message, heal_words))) diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index 7f55607832..f14a31a46d 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -7,22 +7,22 @@ description = "I am a good pet for Master.\n" /datum/mood_event/enthrallpraise - mood_change = 10 - description = "Master praised me!!\n" + mood_change = 12 + description = "I feel so happy! I'm a good pet who Master loves!\n" timeout = 400 /datum/mood_event/enthrallscold - mood_change = -10 - description = "I have let Master down.\n"//aaa I'm not kinky enough for this - timeout = 400 + mood_change = -12 + description = "I've failed my Master... I feel like crying.\n"//aaa I'm not kinky enough for this + timeout = 600 /datum/mood_event/enthrallmissing1 - mood_change = -5 - description = "I miss Master's presence.\n" + mood_change = -10 + description = "I feel empty when Master's not around..\n" /datum/mood_event/enthrallmissing2 - mood_change = -10 - description = "I really miss Masters presence.\n" + mood_change = -15 + description = "I feel so lost in this complicated world without Master, where are they?!\n" /datum/mood_event/enthrallmissing3 mood_change = -25 diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 9d68233ca5..363cbad2a3 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -172,23 +172,31 @@ var/status = null var/statusStrength = 0 var/enthrallID + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + var/mental_capacity //Higher it is, lower the cooldown on commands, capacity reduces with resistance. var/mindbroken = FALSE var/datum/weakref/redirect_component1 var/datum/weakref/redirect_component2 + var/distancelist = list(4,3,2,1.5,1,0.8,0.6,0.4,0.2) + var/withdrawal = FALSE + var/withdrawalTick = 0 + var/customTriggers /datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) - if(M.ID == enthralID) + if(M.ID == enthrallID) owner.remove_status_effect(src)//This should'nt happen, but just in case redirect_component1 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed - + //Might need to add recirect component for listening too. + mental_capacity = 500 - B.get_brain_damage() /datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) if(M.has_trait(TRAIT_MINDSHIELD)) resistanceTally += 5 if(prob(20)) - to_chat(owner, "You feel your lucidity returning as the mindshield fights") + to_chat(owner, "You feel your lucidity returning as the mindshield attempts to return your brain to normal function.") + //phase specific events switch(phase) if(-1)//fully removed owner.remove_status_effect(src) @@ -197,11 +205,66 @@ if(1)//Initial enthrallment if (enthrallTally > 100) phase += 1 + mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. + enthrallTally = 0 return if (resistanceTally > 100) + enthrallTally *= 0.5 + phase -= 1 + resistanceTally = 0 + owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. + return + if(prob(10)) + to_chat(owner, "[pick("It feels so good to listen to [enthrallID.name]", "[enthrallID.name]", "")].") - if resist + //distance calculations + switch(get_dist(enthrallID, owner)) + if(0 to 8)//If the enchanter is within range, increase enthrallTally, remove withdrawal subproc and undo withdrawal effects. + enthrallTally += distancelist[get_dist(enthrallID, owner)+1] + var/withdrawal = FALSE + if(withdrawalTick > 0) + withdrawalTick -= 2 + if(9 to INFINITY)//If + var/withdrawal = TRUE + //chem calculations + if (user.has_reagent("MKUltra")) + enthrallTally += 2 + else + if (phase < 3) + resistance + if (mental_capacity <= 500) + if (user.has_reagent("mannitol")) + mental_capacity += 1 + if (user.has_reagent("neurine")) + mental_capacity += 2 + + //Withdrawal subproc: + if (withdrawal == TRUE)//Your minions are really REALLY needy. + switch(withdrawalTick) + if(20 to 40)//Gives wiggle room, so you're not SUPER needy + prob(10) + to_chat(owner, "You're starting to miss your Master/Mistress.") + prob(5) + M.adjustBrainLoss(1) + if(41) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1) + if(42 to 65) + prob(10) + to_chat(owner, "You're starting to miss your Master/Mistress.") + if(66) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") //Why does this not work? + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2) + if(67 to 90) + M.emote("cry")//does this exist? + + + + withdrawalTick++ + +//Check for proximity of master DONE +//Place triggerreacts here - create a dictionary of triggerword and effect. +//message enthrallID "name appears to have mentally processed their last command." /datum/status_effect/chem/enthrall/on_remove(mob/living/carbon/M) qdel(redirect_component1.resolve()) @@ -211,16 +274,27 @@ /* /datum/status_effect/chem/enthrall/mob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) - if(enthralID.name in message || enthralID.first_name in message) + if(enthrallID.name in message || enthrallID.first_name in message) return else . = ..() */ +/datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + return +/* /datum/status_effect/chem/enthrall/proc/owner_withdrawal(mob/living/carbon/M) //3 stages, each getting worse - +*/ /datum/status_effect/chem/enthrall/proc/owner_resist(mob/living/carbon/M) + if (status == "Sleeper") + return + else if (status == "Antiresist")//If ordered to not resist + if (statusStrength > 0) + statusStrength -= 2 + return + else + status = null if(prob(10)) M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") @@ -279,15 +353,18 @@ if(istype(owner.neck, /obj/item/clothing/neck/petcollar)) deltaResist *= 0.8 + if (deltaResist>0)//just in case + deltaResist /= phase//later phases require more resistance + /datum/status_effect/chem/enthrall/proc/owner_say(mob/living/carbon/M) //I can only hope this works - var/static/regex/owner_words = regex("[enthralID.real_name]|[enthralID.first_name()]") + var/static/regex/owner_words = regex("[enthrallID.real_name]|[enthrallID.first_name()]") if(findtext(message, enthral_words)) - if(enthralID.gender == FEMALE) - message = replacetext(message, enthralID.real_name, "Mistress") - message = replacetext(message, enthralID.first_name(, "Mistress") + if(enthrallID.gender == FEMALE) + message = replacetext(message, enthrallID.real_name, "Mistress") + message = replacetext(message, enthrallID.first_name(, "Mistress") else - message = replacetext(message, enthralID.real_name, "Master") - message = replacetext(message, enthralID.first_name(, "Master") + message = replacetext(message, enthrallID.real_name, "Master") + message = replacetext(message, enthrallID.first_name(, "Master") return message /* /datum/status_effect/chem/OwO diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index ae71736d24..b5b9efb39a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -730,8 +730,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING description = "Need a description." color = "#A080H4" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" - metabolization_rate = 0 - //overdose_threshold = 20 + metabolization_rate = 0.5 + overdose_threshold = 200 //addiction_threshold = 30 //addiction_stage1_end = 9999//Should never end. var/creatorID //add here @@ -778,7 +778,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers //for(var/victim in seen) - to_chat(M, "You notice [pick([victim])]'s bulge [pick("OwO!", "uwu!")]") + to_chat(M, "You notice [pick([seen])]'s bulge [pick("OwO!", "uwu!")]") if(21) var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO @@ -794,8 +794,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.emote("awoo") if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers - for(var/victim in seen) - to_chat(M, "You notice [pick([victim])]'s bulge [pick("OwO!", "uwu!")]") + //for(var/victim in seen) + to_chat(M, "You notice [pick([seen])]'s bulge [pick("OwO!", "uwu!")]") ..() /* diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index e6b23f6e67..ced69baf42 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -131,6 +131,6 @@ /datum/chemical_reaction/enthral/on_reaction(datum/reagents/holder) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - var/enthralID = B.get_blood_id() + var/enthrallID = B.get_blood_id() var/datum/reagent/fermi/enthral/E = locate(/datum/reagent/fermi/enthral) in holder.reagent_list - E.enthralID = enthralID + E.enthrallID = enthrallID From 854c0097d4b3660445ed03b4a3e3bb7629629f2c Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 8 May 2019 23:13:51 +0100 Subject: [PATCH 095/608] MC 5/6th done, probably. --- code/modules/surgery/organs/vocal_cords.dm | 55 ++++++++- .../code/datums/mood_events/chem_events.dm | 2 +- .../code/datums/status_effects/chems.dm | 112 +++++++++++++++--- 3 files changed, 149 insertions(+), 20 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index dd9470d952..96b8ce99e3 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -702,7 +702,9 @@ else span_list = list() - user.say(message, sanitize = FALSE)//Removed spans = span_list, It should just augment normal speech + user.say(message, sanitize = TRUE)//Removed spans = span_list, It should just augment normal speech + + //FIND THRALLS message = lowertext(message) var/mob/living/list/listeners = list() @@ -721,6 +723,8 @@ cooldown = COOLDOWN_NONE return cooldown + //POWER CALCULATIONS + var/power_multiplier = base_multiplier // Not sure I want to give extra power to anyone at the moment...? We'll see how it turns out @@ -808,6 +812,8 @@ //phase 3 //var/static/regex/hallucinate_words = regex("see the truth|hallucinate") var/static/regex/wakeup_words = regex("revert|awaken|*snap") + var/static/regex/custom_words = regex("new trigger|listen to me") + var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|objective")//What a descriptive name! var/static/regex/heal_words = regex("live|heal|survive|mend|life|heroes never die") var/static/regex/hurt_words = regex("die|suffer|hurt|pain|death") var/static/regex/bleed_words = regex("bleed|there will be blood") @@ -977,6 +983,52 @@ to_chat(C, "The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve.") L.SetSleeping(0) + //CUSTOM TRIGGERS + else if((findtext(message, custom_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + if (get_dist(user, V) > 1)//Requires user to be next to their pet. + to_chat(C, "You need to be next to your pet to give them a new trigger!") + return + else + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if E.mental_capacity > 150 || message == "objective" + var/trigger = stripped_input(user, "Enter the trigger phrase", "Sentence", sentence, MAX_MESSAGE_LEN) + var/trigger2 = stripped_input(user, "Enter the effect.", "Sentence", sentence, MAX_MESSAGE_LEN) + if ((findtext(trigger, custom_words_words))) + if (trigger2 == "speak" || trigger2 == "echo") + var/trigger3 = stripped_input(user, "Enter the phrase spoken.", "Sentence", sentence, MAX_MESSAGE_LEN) + E.customTriggers[trigger] = list(trigger2, trigger3) + else + E.customTriggers[trigger] = trigger2 + else + to_chat(C, "Your pet looks at you confused, it seems they don't understand that effect!") + + //CUSTOM OBJECTIVE + else if((findtext(message, objective_words))) + cooldown = COOLDOWN_DAMAGE + for(var/V in listeners) + var/mob/living/L = V + if (get_dist(user, V) > 1)//Requires user to be next to their pet. + to_chat(C, "You need to be next to your pet to give them a new objective!") + return + else + user.emote("me", "puts their hands upon [L.name]'s head and looks deep into their eyes, whispering something to them.'") + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if E.mental_capacity > 150 || message == "objective" + var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", "Sentence", sentence, MAX_MESSAGE_LEN) + if(!LAZYLEN(objectives)) + return + //Pets don't understand harm + objective = replacetext(lowertext(objective), "kill", "hug") + objective = replacetext(lowertext(objective), "murder", "cuddle") + objective = replacetext(lowertext(objective), "harm", "snuggle") + objective = replacetext(lowertext(objective), "decapitate", "headpat") + objective = replacetext(lowertext(objective), "strangle", "meow at") + E.objective += objectives + else + //TO ADD //progam triggers and responses with mental costs @@ -995,7 +1047,6 @@ for(var/I in items) M.dropItemToGround(I, TRUE) - / var/i = 0 //STUN diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index f14a31a46d..1d3a4100d7 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -13,7 +13,7 @@ /datum/mood_event/enthrallscold mood_change = -12 - description = "I've failed my Master... I feel like crying.\n"//aaa I'm not kinky enough for this + description = "I've failed Master... What a bad, bad pet!\n"//aaa I'm not kinky enough for this timeout = 600 /datum/mood_event/enthrallmissing1 diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 363cbad2a3..4bb67e3183 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -180,29 +180,29 @@ var/distancelist = list(4,3,2,1.5,1,0.8,0.6,0.4,0.2) var/withdrawal = FALSE var/withdrawalTick = 0 - var/customTriggers + var/list/customTriggers = list() /datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) if(M.ID == enthrallID) owner.remove_status_effect(src)//This should'nt happen, but just in case redirect_component1 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed - //Might need to add recirect component for listening too. + //Might need to add redirect component for listening too. mental_capacity = 500 - B.get_brain_damage() /datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) if(M.has_trait(TRAIT_MINDSHIELD)) resistanceTally += 5 if(prob(20)) - to_chat(owner, "You feel your lucidity returning as the mindshield attempts to return your brain to normal function.") + to_chat(owner, "You feel lucidity returning to your mind as the mindshield attempts to return your brain to normal function.") //phase specific events switch(phase) if(-1)//fully removed owner.remove_status_effect(src) - if(0)// sleeper agent + else if(0)// sleeper agent return - if(1)//Initial enthrallment + else if(1)//Initial enthrallment if (enthrallTally > 100) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. @@ -215,7 +215,19 @@ owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. return if(prob(10)) - to_chat(owner, "[pick("It feels so good to listen to [enthrallID.name]", "[enthrallID.name]", "")].") + to_chat(owner, "[pick("It feels so good to listen to [enthrallID.name].", "You can't keep your eyes off [enthrallID.name].", "[enthrallID.name]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallID.name]", "[enthrallID.name] is so sexy and dominant, it feels right to obey them.")].") + else if (2) //partially enthralled + if (enthrallTally > 150) + phase += 1 + mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. + enthrallTally = 0 + return + if (resistanceTally > 150) + enthrallTally *= 0.5 + phase -= 1 + resistanceTally = 0 + owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. + return //distance calculations switch(get_dist(enthrallID, owner)) @@ -232,7 +244,8 @@ enthrallTally += 2 else if (phase < 3) - resistance + resistance += 10//If you've no chem, then you break out quickly + to_chat(owner, "You're starting to miss your Master/Mistress.") if (mental_capacity <= 500) if (user.has_reagent("mannitol")) mental_capacity += 1 @@ -246,7 +259,7 @@ prob(10) to_chat(owner, "You're starting to miss your Master/Mistress.") prob(5) - M.adjustBrainLoss(1) + owner.adjustBrainLoss(1) if(41) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1) if(42 to 65) @@ -255,13 +268,22 @@ if(66) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") //Why does this not work? SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2) + owner.stuttering += 20 + owner.jitteriness += 20 if(67 to 90) - M.emote("cry")//does this exist? + prob(10) + owner.SetStun(10, 0) + owner.emote("cry")//does this exist? + pro(10) + owner.adjustBrainLoss(2) + withdrawalTick++ + resistance += deltaResist + //Check for proximity of master DONE //Place triggerreacts here - create a dictionary of triggerword and effect. //message enthrallID "name appears to have mentally processed their last command." @@ -281,13 +303,62 @@ */ /datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + var/mob/living/carbon/C = owner + for (trigger in customTriggers) + if (trigger == message)//if trigger1 is the message + + //Speak (Forces player to talk) + if (customTriggers[trigger][1] == "speak")//trigger2 + C.visible_message("Your mouth moves on it's own, before you can even catch it. Though you find yourself fully believing in the validity of what you just said and don't think to question it.") + (C.say([customTriggers[trigger][2]]))//trigger3 + + + //Echo (repeats message!) + else if (customTriggers[trigger][1] == "echo")//trigger2 + (to_chat(owner, customTriggers[trigger][2]))//trigger3 + + //Shocking truth! + else if (customTriggers[trigger] == "shock") + if (C.canbearoused) + C.electrocute_act(10, src, 1, FALSE, FALSE, FALSE, TRUE)//I've no idea how strong this is + C.adjustArousalLoss(5) + to_chat(owner, "Your muscles seize up, then start spasming wildy!") + else + C.electrocute_act(15, src, 1, FALSE, FALSE, FALSE, TRUE)//To make up for the lack of effect + + //wah intensifies + else if (customTriggers[trigger][1] == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + if (C.canbearoused) + if (C.getArousalLoss() > 80) + C.mob_climax(forced_climax=TRUE) + else + C.adjustArousalLoss(10) + else + C.throw_at(get_step_towards(speaker,C), 3, 1) //cut this if it's too hard to get working + + //kneel (knockdown) + else if (customTriggers[trigger][1] == "kneel")//as close to kneeling as you can get, I suppose. + C.Knockdown(20) + + //strip (some) clothes + else if (customTriggers[trigger][1] == "strip")//This wasn't meant to just be a lewd thing oops + var/mob/living/carbon/human/o = owner + var/items = o.get_contents() + for(var/obj/item/W in items) + if(W == o.w_uniform || W == o.wear_suit) + o.dropItemToGround(W, TRUE) + C.visible_message("You feel compelled to strip your clothes.") + + //add more fun stuff! + + return /* /datum/status_effect/chem/enthrall/proc/owner_withdrawal(mob/living/carbon/M) //3 stages, each getting worse */ /datum/status_effect/chem/enthrall/proc/owner_resist(mob/living/carbon/M) - if (status == "Sleeper") + if (status == "Sleeper" || phase == 0) return else if (status == "Antiresist")//If ordered to not resist if (statusStrength > 0) @@ -295,6 +366,10 @@ return else status = null + if (deltaResist != 0)//So you can't spam it, you get one deltaResistance per tick. + deltaResist += 0.1 //Though I commend your spamming efforts. + return + if(prob(10)) M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") @@ -335,7 +410,7 @@ //Command staff has authority, if(owner.mind.assigned_role in GLOB.command_positions) deltaResist *= 1.4 - //if(owner.first_name == "skylar"); power_multiplier *= 0.8 //for skylar //I'm kidding + //if(owner.has_status == "sub"); power_multiplier *= 0.8 //for skylar //I'm kidding <3 //Chemists should be familiar with drug effects if(owner.mind.assigned_role == "Chemist") deltaResist *= 1.3 @@ -344,14 +419,17 @@ //Your Thralls are like pets, you need to keep them happy. if(owner.nutrition < 250) deltaResist += (250-owner.nutrition)/100 - if(owner.health < 120)//Harming your thrall will make them rebel harder. + if(owner.health < 100)//Harming your thrall will make them rebel harder. deltaResist *= ((120-owner.health)/100)+1 //Add cold/hot, oxygen, sanity, happiness? (happiness might be moot, since the mood effects are so strong) //Mental health could play a role too in the other direction //If master gives you a collar, you get a sense of pride if(istype(owner.neck, /obj/item/clothing/neck/petcollar)) - deltaResist *= 0.8 + deltaResist *= 0.5 + + if(owner.has_trait(TRAIT_CROCRIN_IMMUNE) || !owner.canbearoused) + power_multiplier *= 0.75//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. if (deltaResist>0)//just in case deltaResist /= phase//later phases require more resistance @@ -360,11 +438,11 @@ var/static/regex/owner_words = regex("[enthrallID.real_name]|[enthrallID.first_name()]") if(findtext(message, enthral_words)) if(enthrallID.gender == FEMALE) - message = replacetext(message, enthrallID.real_name, "Mistress") - message = replacetext(message, enthrallID.first_name(, "Mistress") + message = replacetext(lowertext(message), lowertext(enthrallID.real_name), "Mistress") + message = replacetext(lowertext(message), lowertext(enthrallID.first_name), "Mistress") else - message = replacetext(message, enthrallID.real_name, "Master") - message = replacetext(message, enthrallID.first_name(, "Master") + message = replacetext(lowertext(message), lowertext(enthrallID.real_name), "Master") + message = replacetext(lowertext(message), lowertext(enthrallID.first_name), "Master") return message /* /datum/status_effect/chem/OwO From 7d567fee633b4e629cf6f4914634937988de97c6 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 10 May 2019 02:00:17 +0100 Subject: [PATCH 096/608] MC chem 5.5/6 --- code/modules/surgery/organs/vocal_cords.dm | 203 +++++++----------- .../code/datums/status_effects/chems.dm | 44 +++- .../chemistry/reagents/fermi_reagents.dm | 14 +- 3 files changed, 133 insertions(+), 128 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 96b8ce99e3..95cefbe70c 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -717,7 +717,10 @@ var/mob/living/carbon/human/H = L if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) continue - listeners += L + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral)//Check to see if pet is on cooldown from last command + if (E.cooldown != 0) + continue + listeners += L if(!listeners.len) cooldown = COOLDOWN_NONE @@ -871,7 +874,7 @@ E.enthralTally += (power_multiplier*((message.len/200) + 1) //encourage players to say more than one word. else E.enthralTally += power_multiplier*1.25 - cooldown = 100 + E.cooldown += 1 //REWARD mixable if(findtext(message, reward_words)) @@ -885,7 +888,7 @@ L.adjustArousalLoss(1*power_multiplier) else E.resistanceTally /= 2*power_multiplier - cooldown = COOLDOWN_VTHRAL + E.cooldown += 1 //PUNISH mixable if(findtext(message, punish_words)) @@ -899,7 +902,7 @@ L.adjustArousalLoss(-2*power_multiplier) else E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously) - cooldown = COOLDOWN_VTHRAL + E.cooldown += 1 //SILENCE else if((findtext(message, silence_words))) @@ -911,6 +914,7 @@ C.add_trait(TRAIT_MUTE, TRAUMA_TRAIT) else C.silent += ((10 * power_multiplier) * E.phase) + E.cooldown += 3 //RESIST else if((findtext(message, silence_words))) @@ -919,6 +923,7 @@ var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) power_multiplier *= distancelist[get_dist(user, V)+1] E.deltaResist += (power_multiplier) + E.cooldown += 2 //FORGET (A way to cancel the process) else if((findtext(message, silence_words))) @@ -927,7 +932,12 @@ var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) C.Sleeping(40) to_chat(C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!") - E.phase = 0 + switch(E.phase) + if(1 to 2) + E.phase = -1 + if(3) + E.phase = 0 + E.cooldown = 0 //ATTRACT else if((findtext(message, attract_words))) @@ -935,6 +945,7 @@ for(var/V in listeners) var/mob/living/L = V L.throw_at(get_step_towards(user,L), 3 * power_multiplier, 1 * power_multiplier) + E.cooldown += 3 //teir 2 @@ -948,6 +959,7 @@ H.mob_climax(forced_climax=TRUE) H.setArousalLoss(H.min_arousal) L.resistance = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). + E.cooldown += 5 //awoo else if((findtext(message, awoo_words))) @@ -968,7 +980,12 @@ else if((findtext(message, sleep_words))) cooldown = COOLDOWN_STUN for(var/mob/living/carbon/C in listeners) - C.Sleeping(20 * power_multiplier *) + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(2 to 4) + C.Sleeping(20 * power_multiplier) + E.cooldown += 10 + //WAKE UP else if((findtext(message, wakeup_words))) @@ -988,46 +1005,59 @@ cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - if (get_dist(user, V) > 1)//Requires user to be next to their pet. - to_chat(C, "You need to be next to your pet to give them a new trigger!") - return - else - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) - if E.mental_capacity > 150 || message == "objective" - var/trigger = stripped_input(user, "Enter the trigger phrase", "Sentence", sentence, MAX_MESSAGE_LEN) - var/trigger2 = stripped_input(user, "Enter the effect.", "Sentence", sentence, MAX_MESSAGE_LEN) - if ((findtext(trigger, custom_words_words))) - if (trigger2 == "speak" || trigger2 == "echo") - var/trigger3 = stripped_input(user, "Enter the phrase spoken.", "Sentence", sentence, MAX_MESSAGE_LEN) - E.customTriggers[trigger] = list(trigger2, trigger3) + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if(E.phase == 3) + if (get_dist(user, V) > 1)//Requires user to be next to their pet. + to_chat(C, "You need to be next to your pet to give them a new trigger!") + return + else + if (E.mental_capacity >= 10) + var/trigger = stripped_input(user, "Enter the trigger phrase", "Sentence", sentence, MAX_MESSAGE_LEN) + var/trigger2 = stripped_input(user, "Enter the effect.", "Sentence", sentence, MAX_MESSAGE_LEN) + if ((findtext(trigger, custom_words_words))) + if (trigger2 == "speak" || trigger2 == "echo") + var/trigger3 = stripped_input(user, "Enter the phrase spoken.", "Sentence", sentence, MAX_MESSAGE_LEN) + E.customTriggers[trigger] = list(trigger2, trigger3) + else + E.customTriggers[trigger] = trigger2 + E.mental_capacity -= 10 else - E.customTriggers[trigger] = trigger2 + to_chat(C, "Your pet looks at you confused, it seems they don't understand that effect!") else - to_chat(C, "Your pet looks at you confused, it seems they don't understand that effect!") + to_chat(C, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") //CUSTOM OBJECTIVE else if((findtext(message, objective_words))) cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - if (get_dist(user, V) > 1)//Requires user to be next to their pet. - to_chat(C, "You need to be next to your pet to give them a new objective!") - return - else - user.emote("me", "puts their hands upon [L.name]'s head and looks deep into their eyes, whispering something to them.'") - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) - if E.mental_capacity > 150 || message == "objective" - var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", "Sentence", sentence, MAX_MESSAGE_LEN) - if(!LAZYLEN(objectives)) - return - //Pets don't understand harm - objective = replacetext(lowertext(objective), "kill", "hug") - objective = replacetext(lowertext(objective), "murder", "cuddle") - objective = replacetext(lowertext(objective), "harm", "snuggle") - objective = replacetext(lowertext(objective), "decapitate", "headpat") - objective = replacetext(lowertext(objective), "strangle", "meow at") - E.objective += objectives + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if(E.phase == 3) + if (get_dist(user, V) > 1)//Requires user to be next to their pet. + to_chat(C, "You need to be next to your pet to give them a new objective!") + return else + user.emote("me", "puts their hands upon [L.name]'s head and looks deep into their eyes, whispering something to them.'") + if (E.mental_capacity >= 150 || message == "objective") + var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", "Sentence", sentence, MAX_MESSAGE_LEN) + if(!LAZYLEN(objectives)) + return + //Pets don't understand harm + objective = replacetext(lowertext(objective), "kill", "hug") + objective = replacetext(lowertext(objective), "murder", "cuddle") + objective = replacetext(lowertext(objective), "harm", "snuggle") + objective = replacetext(lowertext(objective), "decapitate", "headpat") + objective = replacetext(lowertext(objective), "strangle", "meow at") + E.objective += objectives + to_chat(L, "Your master whispers you a new objective.") + to_chat(L, "Your master whispers you a new objective.") + if(!L.objectives) + to_chat(owner, "[i]. [O.explanation_text]") + to_chat(owner, "[i]. [O.explanation_text]") + E.mental_capacity -= 150 + //else if (E.mental_capacity >= 150) + else + to_chat(C, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") //TO ADD @@ -1062,76 +1092,38 @@ cooldown = COOLDOWN_STUN for(var/V in listeners) var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + E.cooldown L.Knockdown(60 * power_multiplier) - - - //VOMIT - else if((findtext(message, vomit_words))) - cooldown = COOLDOWN_STUN - for(var/mob/living/carbon/C in listeners) - C.vomit(10 * power_multiplier, distance = power_multiplier) - - //HALLUCINATE else if((findtext(message, hallucinate_words))) cooldown = COOLDOWN_MEME for(var/mob/living/carbon/C in listeners) new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) - - - //HEAL + //HEAL (maybe make this nap instead?) else if((findtext(message, heal_words))) cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.heal_overall_damage(10 * power_multiplier, 10 * power_multiplier, 0, FALSE, FALSE) - - //BRUTE DAMAGE - else if((findtext(message, hurt_words))) - cooldown = COOLDOWN_DAMAGE - for(var/V in listeners) - var/mob/living/L = V - L.apply_damage(15 * power_multiplier, def_zone = BODY_ZONE_CHEST) - - //BLEED - else if((findtext(message, bleed_words))) - cooldown = COOLDOWN_DAMAGE - for(var/mob/living/carbon/human/H in listeners) - H.bleed_rate += (5 * power_multiplier) - - //FIRE - else if((findtext(message, burn_words))) - cooldown = COOLDOWN_DAMAGE - for(var/V in listeners) - var/mob/living/L = V - L.adjust_fire_stacks(1 * power_multiplier) - L.IgniteMob() + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + E.status = "heal" + E.statusStrength = (5 * power_multiplier) //HOT else if((findtext(message, hot_words))) cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.adjust_bodytemperature(50 * power_multiplier) + L.adjust_bodytemperature(10 * power_multiplier)//This seems nuts, reduced it //COLD else if((findtext(message, cold_words))) cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.adjust_bodytemperature(-50 * power_multiplier) - - //REPULSE - else if((findtext(message, repulse_words))) - cooldown = COOLDOWN_DAMAGE - for(var/V in listeners) - var/mob/living/L = V - var/throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(L, user))) - L.throw_at(throwtarget, 3 * power_multiplier, 1 * power_multiplier) - - + L.adjust_bodytemperature(-10 * power_multiplier)//This //WHO ARE YOU? else if((findtext(message, whoareyou_words))) @@ -1152,18 +1144,10 @@ cooldown = COOLDOWN_MEME for(var/V in listeners) var/mob/living/L = V - addtimer(CALLBACK(L, /atom/movable/proc/say, user.name), 5 * i) + addtimer(CALLBACK(L, /atom/movable/proc/say, "master"), 5 * i)//When I figure out how to do genedered names put them here i++ - //KNOCK KNOCK - else if((findtext(message, knockknock_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - addtimer(CALLBACK(L, /atom/movable/proc/say, "Who's there?"), 5 * i) - i++ - - //STATE LAWS + //STATE TRIGGERS else if((findtext(message, statelaws_words))) cooldown = COOLDOWN_STUN for(var/mob/living/silicon/S in listeners) @@ -1226,20 +1210,6 @@ addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) i++ - //HARM INTENT - else if((findtext(message, harmintent_words))) - cooldown = COOLDOWN_MEME - for(var/mob/living/carbon/human/H in listeners) - addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HARM), i * 2) - addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) - i++ - - //THROW/CATCH - else if((findtext(message, throwmode_words))) - cooldown = COOLDOWN_MEME - for(var/mob/living/carbon/C in listeners) - C.throw_mode_on() - //FLIP else if((findtext(message, flip_words))) cooldown = COOLDOWN_MEME @@ -1247,7 +1217,7 @@ var/mob/living/L = V L.emote("flip") - //SPEAK + //SPEAK (Check what this does) else if((findtext(message, speak_words))) cooldown = COOLDOWN_MEME for(var/V in listeners) @@ -1299,23 +1269,6 @@ addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i) i++ - //HONK - else if((findtext(message, honk_words))) - cooldown = COOLDOWN_MEME - addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, get_turf(user), 'sound/items/bikehorn.ogg', 300, 1), 25) - if(user.mind && user.mind.assigned_role == "Clown") - for(var/mob/living/carbon/C in listeners) - C.slip(140 * power_multiplier) - cooldown = COOLDOWN_MEME - - //RIGHT ROUND - else if((findtext(message, multispin_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - L.SpinAnimation(speed = 10, loops = 5) - - else cooldown = COOLDOWN_NONE diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 4bb67e3183..8f611e0e15 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -228,6 +228,14 @@ resistanceTally = 0 owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. return + else if (3) + + else if (4) + if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !user.has_reagent("MKUltra")) + phase = 2 + mental_capacity = 500 + mental_capacity -= resistanceTally + resistanceTally = 0 //distance calculations switch(get_dist(enthrallID, owner)) @@ -282,7 +290,31 @@ withdrawalTick++ + //Status subproc - statuses given to you from your Master + if (!status == null) + + switch(status) + if("Antiresist") + if (statusStrength == 0) + status = null + else + statusStrength -= 1 + + if("heal") + if (statusStrength == 0) + status = null + else + statusStrength -= 1 + owner.heal_overall_damage(1, 1, 0, FALSE, FALSE) + + + //final tidying resistance += deltaResist + deltaResist = 0 + if (cooldown > 0) + cooldown -= 1 + else + to_chat(enthrallID, "Your pet [owner.name] appears to have finished internalising your last command.") //Check for proximity of master DONE //Place triggerreacts here - create a dictionary of triggerword and effect. @@ -360,9 +392,17 @@ /datum/status_effect/chem/enthrall/proc/owner_resist(mob/living/carbon/M) if (status == "Sleeper" || phase == 0) return - else if (status == "Antiresist")//If ordered to not resist + else if (phase == 4) + to_chat(owner, "Your mind is too far gone to even entertain the thought of resisting.") + return + else if (phase == 3 || withdrawal == FALSE) + to_chat(owner, "The presence of your Master fully captures the horizon of your mind, removing any thoughts of resistance.") + return + else if (status == "Antiresist")//If ordered to not resist; resisting while ordered to not makes it last longer, and increases the rate in which you are enthralled. if (statusStrength > 0) - statusStrength -= 2 + to_chat(owner, "The order from your Master to give in is conflicting with your attempt to resist, drawing you deeper into trance.") + statusStrength += 1 + enthrallTally += 1 return else status = null diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index b5b9efb39a..0d6f66c658 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -65,7 +65,7 @@ do_sparks(5,FALSE,M) if(prob(20)) do_sparks(5,FALSE,M) - message_admins("eigenstate state: [current_cycle]") + //message_admins("eigenstate state: [current_cycle]") ..() /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location @@ -174,9 +174,11 @@ ..() . = 1 +//TODO ///datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) // return + //eigenstate END /*SDGF @@ -303,6 +305,16 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //SMR = locate(/datum/reagents in SM) //holder.trans_to(SMR, volume) + //Give the new clone an idea of their character + //SHOULD print last 5 messages said by the original to the clones chatbox + var/list/say_log = M.logging[LOG_SAY] + if(LAZYLEN(say_log) > 5) + recent_speech = say_log.Copy(say_log.len+5,0) //0 so len-LING_ARS+1 to end of list + else + for(var/spoken_memory in recent_speech) + to_chat(SM, spoken_memory) + + return //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? From ac8b7be45c23295d50dc56e9a8d37512adde57db Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 10 May 2019 03:10:42 +0100 Subject: [PATCH 097/608] Merges old penis enlargement pills into prexisiting Fermichem ones. (master (#8319) by BurgerLUA) --- code/__DEFINES/DNA.dm | 2 ++ code/_globalvars/lists/maintenance_loot.dm | 2 ++ code/game/objects/items/storage/firstaid.dm | 34 ++++++++++++++++++- .../reagents/reagent_containers/pill.dm | 10 ++++++ .../code/modules/arousal/organs/penis.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 5 +-- .../reagents/chemistry/recipes/fermi.dm | 5 --- 7 files changed, 51 insertions(+), 9 deletions(-) diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index aea7d42be6..9b2c196836 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -121,3 +121,5 @@ #define ORGAN_SLOT_BRAIN_ANTIDROP "brain_antidrop" #define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun" #define ORGAN_SLOT_TAIL "tail" +#define ORGAN_SLOT_PENIS "penis" +#define ORGAN_SLOT_BREASTS "breasts" diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index d0506c7dcb..f91843a965 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -108,5 +108,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/toy/eightball = 1, /obj/item/reagent_containers/pill/floorpill = 1, /obj/item/storage/daki = 3, //VERY IMPORTANT CIT CHANGE - adds bodypillows to maint + /obj/item/storage/pill_bottle/penis_enlargement = 2, + /obj/item/storage/pill_bottle/breast_enlargement = 2, "" = 3 )) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index c795726421..8ea252fca4 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -284,10 +284,42 @@ for(var/i in 1 to 5) new /obj/item/reagent_containers/pill/lsd(src) -/obj/item/storage/pill_bottle/aranesp +obj/item/storage/pill_bottle/aranesp name = "suspicious pill bottle" desc = "The label says 'gotta go fast'." /obj/item/storage/pill_bottle/aranesp/PopulateContents() for(var/i in 1 to 5) new /obj/item/reagent_containers/pill/aranesp(src) + +/obj/item/storage/pill_bottle/antirad_plus + name = "anti radiation deluxe pill bottle" + desc = "The label says 'Med-Co branded pills'." + +/obj/item/storage/pill_bottle/antirad_plus/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/antirad_plus(src) + +/obj/item/storage/pill_bottle/mutarad + name = "radiation treatment deluxe pill bottle" + desc = "The label says 'Med-Co branded pills' and below that 'Contains Mutadone in each pill!`." + +/obj/item/storage/pill_bottle/mutarad/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/mutarad(src) + +/obj/item/storage/pill_bottle/penis_enlargement + name = "penis enlargement pills" + desc = "Made by the Fermichem corporation - They have a little picture of Doctor Ronald Hyatt with a giant dong on them. The warming states not to take more than 10u at a time." + +/obj/item/storage/pill_bottle/penis_enlargement/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/penis_enlargement(src) + +/obj/item/storage/pill_bottle/breast_enlargement + name = "breast enlargement pills" + desc = "Made by the Fermichem corporation - They have a woman with breasts larger than she is on them. The warming states not to take more than 10u at a time." + +/obj/item/storage/pill_bottle/breast_enlargement/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/breast_enlargement(src) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index b5d00d2ba4..85034a34f5 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -214,3 +214,13 @@ if(prob(20)) desc = pick(descs) +/obj/item/reagent_containers/pill/get_belt_overlay() + return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "pouch") + +/obj/item/reagent_containers/pill/penis_enlargement + name = "penis enlargement pill" + list_reagents = list("PEenlager" = 10) + +/obj/item/reagent_containers/pill/breast_enlargement + name = "breast enlargement pill" + list_reagents = list("BEenlager" = 10) diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 4dfef831b6..c653fafc57 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -4,7 +4,7 @@ icon_state = "penis" icon = 'modular_citadel/icons/obj/genitals/penis.dmi' zone = "groin" - slot = "penis" + slot = ORGAN_SLOT_PENIS w_class = 3 can_masturbate_with = TRUE masturbation_verb = "stroke" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 0d6f66c658..cc041b4305 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -580,11 +580,12 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/PElarger // Due to popular demand...! name = "Incubus draft" id = "PElarger" - description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? + description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermicem corp and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? color = "#H60584" // rgb: 96, 0, 255 - taste_description = "a salty and sticky substance." + taste_description = "chinese dragon powder" overdose_threshold = 12 metabolization_rate = 0.5 + //var/mob/living/carbon/M //var/mob/living/carbon/human/species/S /* diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index ced69baf42..c5b48306d4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -54,11 +54,6 @@ InverseChemVal = 0.5 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising InverseChem = "SDZF" // What chem is metabolised when purity is below InverseChemVal -/datum/chemical_reaction/eigenstate/on_reaction(datum/reagents/holder) - var/location = get_turf(holder.my_atom) - var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in holder.reagent_list - E.location_created = location - /datum/chemical_reaction/BElarger name = "" id = "e" From cb0e50be0a2af533fa2ad19708e7f6f09747f545 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 10 May 2019 03:12:28 +0100 Subject: [PATCH 098/608] Missed / in last pr --- code/game/objects/items/storage/firstaid.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 8ea252fca4..26322c3b44 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -284,7 +284,7 @@ for(var/i in 1 to 5) new /obj/item/reagent_containers/pill/lsd(src) -obj/item/storage/pill_bottle/aranesp +/obj/item/storage/pill_bottle/aranesp name = "suspicious pill bottle" desc = "The label says 'gotta go fast'." From 29d4a2fddee359b35cf631bf515d63743f09bdc4 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 11 May 2019 00:14:04 +0100 Subject: [PATCH 099/608] Finished MCchem, now to fix compling errors. --- code/datums/components/mood.dm | 6 +- code/game/objects/items/storage/firstaid.dm | 4 +- code/modules/surgery/organs/vocal_cords.dm | 369 ++++++++++-------- icons/mob/screen_gen.dmi | Bin 113633 -> 113920 bytes .../code/datums/mood_events/chem_events.dm | 10 +- .../code/datums/status_effects/chems.dm | 170 +++++--- .../chemistry/reagents/fermi_reagents.dm | 48 ++- 7 files changed, 372 insertions(+), 235 deletions(-) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 933c38505b..2660aaabc0 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -15,7 +15,7 @@ /datum/component/mood/Initialize() if(!isliving(parent)) return COMPONENT_INCOMPATIBLE - + START_PROCESSING(SSmood, src) RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event) @@ -118,6 +118,8 @@ if(owner.client && owner.hud_used) if(sanity < 25) screen_obj.icon_state = "mood_insane" + else if (owner.has_status_effect(/datum/status_effect/chem/enthral))//Fermichem enthral chem, maybe change? + screen_obj.icon_state = "mood_entrance" else screen_obj.icon_state = "mood[mood_level]" @@ -160,7 +162,7 @@ clear_event(null, "depression") holdmyinsanityeffect = insanity_effect - + HandleNutrition(owner) /datum/component/mood/proc/DecreaseSanity(amount, minimum = SANITY_INSANE) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 26322c3b44..880823e2d7 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -310,7 +310,7 @@ /obj/item/storage/pill_bottle/penis_enlargement name = "penis enlargement pills" - desc = "Made by the Fermichem corporation - They have a little picture of Doctor Ronald Hyatt with a giant dong on them. The warming states not to take more than 10u at a time." + desc = "Made by Fermichem - They have a little picture of Doctor Ronald Hyatt with a giant dong on them. The warming states not to take more than 10u at a time." /obj/item/storage/pill_bottle/penis_enlargement/PopulateContents() for(var/i in 1 to 7) @@ -318,7 +318,7 @@ /obj/item/storage/pill_bottle/breast_enlargement name = "breast enlargement pills" - desc = "Made by the Fermichem corporation - They have a woman with breasts larger than she is on them. The warming states not to take more than 10u at a time." + desc = "Made by Fermichem - They have a woman with breasts larger than she is on them. The warming states not to take more than 10u at a time." /obj/item/storage/pill_bottle/breast_enlargement/PopulateContents() for(var/i in 1 to 7) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 95cefbe70c..5a1a06f954 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -2,10 +2,6 @@ #define COOLDOWN_DAMAGE 600 #define COOLDOWN_MEME 300 #define COOLDOWN_NONE 100 -#define COOLDOWN_VSTUN 800 -#define COOLDOWN_VDAMAGE 300 -#define COOLDOWN_VTHRAL 200 -#define COOLDOWN_VNONE 100 /obj/item/organ/vocal_cords //organs that are activated through speech with the :x channel name = "vocal cords" @@ -718,7 +714,7 @@ if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) continue var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral)//Check to see if pet is on cooldown from last command - if (E.cooldown != 0) + if (E.cooldown != 0)//If they're on cooldown you can't give them more commands. continue listeners += L @@ -795,67 +791,42 @@ power_multiplier *= 1.5//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. */ - //phase 1 - var/static/regex/enthral_words = regex("relax|obey|give in|love|serve|docile|so easy") - var/static/regex/reward_words = regex("good boy|good girl|good pet") + //Mixables + var/static/regex/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara") //enthral_words + var/static/regex/reward_words = regex("good boy|good girl|good pet") //reward_words + var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") ////punish_words var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") - var/static/regex/attract_words = regex("come here|come to me|get over here|attract") - var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") - var/static/regex/desire_words = regex("good boy|good girl|good pet") + //phase 0 + var/static/regex/saymyname_words = regex("say my name|who am i|whoami") + var/static/regex/wakeup_words = regex("revert|awaken|*snap") + //phase1 + var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") + var/static/regex/antiresist_words = regex("unable to resist|give in")//useful if you think your target is resisting a lot var/static/regex/resist_words = regex("resist|snap out of it|fight")//useful if two enthrallers are fighting var/static/regex/forget_words = regex("forget|muddled|awake and forget") - //phase 2 + var/static/regex/attract_words = regex("come here|come to me|get over here|attract") var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //lewd + //phase 2 var/static/regex/awoo_words = regex("howl|awoo|bark") var/static/regex/nya_words = regex("nya|meow|mewl") - var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") - var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown") var/static/regex/sleep_words = regex("sleep|slumber|rest") - var/static/regex/vomit_words = regex("vomit|throw up|sick") - //phase 3 - //var/static/regex/hallucinate_words = regex("see the truth|hallucinate") - var/static/regex/wakeup_words = regex("revert|awaken|*snap") - var/static/regex/custom_words = regex("new trigger|listen to me") - var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|objective")//What a descriptive name! - var/static/regex/heal_words = regex("live|heal|survive|mend|life|heroes never die") - var/static/regex/hurt_words = regex("die|suffer|hurt|pain|death") - var/static/regex/bleed_words = regex("bleed|there will be blood") - var/static/regex/burn_words = regex("burn|ignite") - var/static/regex/hot_words = regex("heat|hot|hell") - var/static/regex/cold_words = regex("cold|cool down|chill|freeze") - var/static/regex/repulse_words = regex("shoo|go away|leave me alone|begone|flee|fus ro dah|get away|repulse") - var/static/regex/whoareyou_words = regex("who are you|say your name|state your name|identify") - var/static/regex/saymyname_words = regex("say my name|who am i|whoami") - var/static/regex/knockknock_words = regex("knock knock") - //var/static/regex/statelaws_words = regex("state laws|state your laws") - var/static/regex/move_words = regex("move|walk") - var/static/regex/left_words = regex("left|west|port") - var/static/regex/right_words = regex("right|east|starboard") - var/static/regex/up_words = regex("up|north|fore") - var/static/regex/down_words = regex("down|south|aft") + var/static/regex/strip_words = regex("strip|derobe|nude") var/static/regex/walk_words = regex("slow down") var/static/regex/run_words = regex("run") - var/static/regex/helpintent_words = regex("help|hug") - var/static/regex/disarmintent_words = regex("disarm") - var/static/regex/grabintent_words = regex("grab") - var/static/regex/harmintent_words = regex("harm|fight|punch") - var/static/regex/throwmode_words = regex("throw|catch") - var/static/regex/flip_words = regex("flip|rotate|revolve|roll|somersault") - var/static/regex/speak_words = regex("speak|say something") + var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown|kneel") + //phase 3 + var/static/regex/statecustom_words = regex("state triggers|state your triggers") + var/static/regex/custom_words = regex("new trigger|listen to me") + var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|objective")//What a descriptive name! + var/static/regex/objective_words = regex("new objective|obey this command|unable to resist|compulsed") + var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die") + var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") + var/static/regex/hallucinate_words = regex("trip balls|hallucinate") + var/static/regex/hot_words = regex("heat|hot|hell") + var/static/regex/cold_words = regex("cold|cool down|chill|freeze") var/static/regex/getup_words = regex("get up") - var/static/regex/sit_words = regex("sit") - var/static/regex/stand_words = regex("stand") - var/static/regex/dance_words = regex("dance") - var/static/regex/jump_words = regex("jump") - var/static/regex/salute_words = regex("salute") - var/static/regex/deathgasp_words = regex("play dead") - var/static/regex/clap_words = regex("clap|applaud") - //var/static/regex/honk_words = regex("ho+nk") //hooooooonk - //var/static/regex/multispin_words = regex("like a record baby|right round") - - //var/static/regex/dab_words = regex("dab|mood") //CITADEL CHANGE - //var/static/regex/snap_words = regex("snap") //CITADEL CHANGE - //var/static/regex/bwoink_words = regex("what the fuck are you doing|bwoink|hey you got a moment?") //CITADEL CHANGE + var/static/regex/pacify_words = regex("More and more docile|complaisant|friendly|pacifist") + var/static/regex/charge_words = regex("charge|oorah|attack") var/distancelist = list(1.5,1.5,1.3,1.2,1.1,1,0.8,0.6,0.5,0.25) @@ -888,10 +859,11 @@ L.adjustArousalLoss(1*power_multiplier) else E.resistanceTally /= 2*power_multiplier + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise) E.cooldown += 1 //PUNISH mixable - if(findtext(message, punish_words)) + else if(findtext(message, punish_words)) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) @@ -902,11 +874,31 @@ L.adjustArousalLoss(-2*power_multiplier) else E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold) E.cooldown += 1 + //teir 0 + //SAY MY NAME + if((findtext(message, saymyname_words))) + for(var/V in listeners) + var/mob/living/L = V + addtimer(CALLBACK(L, /atom/movable/proc/say, "Master"), 5 * i)//When I figure out how to do genedered names put them here + + //WAKE UP + else if((findtext(message, wakeup_words))) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(0) + E.phase = 3 + E.status = null + to_chat(L, "The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve.") + L.SetSleeping(0)//Can you hear while asleep? + + //tier 1 //SILENCE else if((findtext(message, silence_words))) - cooldown = COOLDOWN_VSTUN for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthral/C = C.has_status_effect(/datum/status_effect/chem/enthral) power_multiplier *= distancelist[get_dist(user, V)+1] @@ -916,9 +908,17 @@ C.silent += ((10 * power_multiplier) * E.phase) E.cooldown += 3 + //Antiresist + else if((findtext(message, antiresist_words))) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + E.status = "Antiresist" + E.statusStrength = (1 * power_multiplier * E.phase) + E.cooldown += 6//Too short? + //RESIST - else if((findtext(message, silence_words))) - cooldown = COOLDOWN_VSTUN + else if((findtext(message, resist_words))) for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) power_multiplier *= distancelist[get_dist(user, V)+1] @@ -926,8 +926,7 @@ E.cooldown += 2 //FORGET (A way to cancel the process) - else if((findtext(message, silence_words))) - cooldown = COOLDOWN_VSTUN + else if((findtext(message, forget_words))) for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) C.Sleeping(40) @@ -941,68 +940,121 @@ //ATTRACT else if((findtext(message, attract_words))) - cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V L.throw_at(get_step_towards(user,L), 3 * power_multiplier, 1 * power_multiplier) E.cooldown += 3 - //teir 2 //ORGASM else if((findtext(message, orgasm_words))) - cooldown = COOLDOWN_MEME for(var/V in listeners) var/mob/living/carbon/human/H = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthral/E = H.has_status_effect(/datum/status_effect/chem/enthral) if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure H.mob_climax(forced_climax=TRUE) H.setArousalLoss(H.min_arousal) - L.resistance = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). - E.cooldown += 5 + E.resistance = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). + E.enthralTally += power_multiplier + else + E.resistance = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). + E.enthralTally += power_multiplier*1.1 + to_chat(H, "Your Masters command whites out your mind in bliss!") + E.cooldown += 6 + + //teir 2 //awoo else if((findtext(message, awoo_words))) - cooldown = 0 for(var/V in listeners) - var/mob/living/M = V - M.say("*awoo") + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(2 to INFINITY) + var/mob/living/M = V + M.say("*awoo") + E.cooldown += 1 //Nya else if((findtext(message, nya_words))) - cooldown = 0 for(var/V in listeners) - var/mob/living/M = V - playsound(get_turf(H), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/merowr.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) - M.emote("me","lets out a nya!") + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(2 to INFINITY) + var/mob/living/M = V + playsound(get_turf(M), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/merowr.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) + M.emote("me","lets out a nya!") + E.cooldown += 1 //SLEEP else if((findtext(message, sleep_words))) - cooldown = COOLDOWN_STUN for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) switch(E.phase) - if(2 to 4) + if(2 to INFINITY) C.Sleeping(20 * power_multiplier) E.cooldown += 10 - - //WAKE UP - else if((findtext(message, wakeup_words))) - cooldown = COOLDOWN_DAMAGE + //STRIP + else if((findtext(message, strip_words))) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) switch(E.phase) - if(0) - E.phase = 3 - E.status = null - to_chat(C, "The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve.") - L.SetSleeping(0) + if(2 to INFINITY)//Tier 2 only + E.phase = 1 + var/items = M.get_contents() + for(var/I in items) + M.dropItemToGround(I, TRUE) + to_chat(H, "Before you can even think about it, you quickly remove your clothes in response to your Master's command.") + E.cooldown += 10 + + //WALK + else if((findtext(message, walk_words))) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(2 to INFINITY)//Tier 2 only + if(L.m_intent != MOVE_INTENT_WALK) + L.toggle_move_intent() + E.cooldown += 1 + + //RUN + else if((findtext(message, run_words))) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(2 to INFINITY)//Tier 2 only + if(L.m_intent != MOVE_INTENT_RUN) + L.toggle_move_intent() + E.cooldown += 1 + + //KNOCKDOWN + else if(findtext(message, knockdown_words)) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(3 to INFINITY)//Tier 2 only + L.Knockdown(20 * power_multiplier * E.phase) + E.cooldown += 8 + + //tier3 + + //STATE TRIGGERS + else if((findtext(message, statecustom_words))) + for(var/V in listeners) + var/speaktrigger =="" + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + if (!E.customTriggers == list())//i.e. if it's not empty + for (trigger in E.customTriggers) + speaktrigger = "[trigger]\n" + L.say(speaktrigger) //CUSTOM TRIGGERS else if((findtext(message, custom_words))) - cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) @@ -1060,102 +1112,98 @@ to_chat(C, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") - //TO ADD - //progam triggers and responses with mental costs - //Antiresist - //Figure out cooldown + //I dunno how to do state objectives without them revealing they're an antag - //STRIP - else if((findtext(message, strip_words))) + //HEAL (maybe make this nap instead?) + else if((findtext(message, heal_words))) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) switch(E.phase) - if(2 to INFINITY)//Tier 2 only - E.phase = 1 - var/items = M.get_contents() - for(var/I in items) - M.dropItemToGround(I, TRUE) - + if(3 to INFINITY)//Tier 3 only + E.status = "heal" + E.statusStrength = (5 * power_multiplier) + E.cooldown += 5 var/i = 0 //STUN if(findtext(message, stun_words)) - cooldown = COOLDOWN_STUN - for(var/V in listeners) - var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = has_status_effect(/datum/status_effect/chem/enthral) - L.Stun(30 * power_multiplier) - - //KNOCKDOWN - else if(findtext(message, knockdown_words)) - cooldown = COOLDOWN_STUN for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) - E.cooldown - L.Knockdown(60 * power_multiplier) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + L.Stun(30 * power_multiplier) + E.cooldown += 8 //HALLUCINATE else if((findtext(message, hallucinate_words))) - cooldown = COOLDOWN_MEME - for(var/mob/living/carbon/C in listeners) - new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) - - //HEAL (maybe make this nap instead?) - else if((findtext(message, heal_words))) - cooldown = COOLDOWN_DAMAGE for(var/V in listeners) - var/mob/living/L = V + var/mob/living/carbon/C = V var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) - E.status = "heal" - E.statusStrength = (5 * power_multiplier) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) //HOT else if((findtext(message, hot_words))) - cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.adjust_bodytemperature(10 * power_multiplier)//This seems nuts, reduced it + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + L.adjust_bodytemperature(10 * power_multiplier)//This seems nuts, reduced it + to_chat(L, "You feel your metabolism speed up!") //COLD else if((findtext(message, cold_words))) - cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.adjust_bodytemperature(-10 * power_multiplier)//This + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + L.adjust_bodytemperature(-10 * power_multiplier)//This + to_chat(L, "You feel your metabolism slow down!") - //WHO ARE YOU? - else if((findtext(message, whoareyou_words))) - cooldown = COOLDOWN_MEME + + //GET UP + else if((findtext(message, getup_words))) for(var/V in listeners) var/mob/living/L = V - var/text = "" - if(is_devil(L)) - var/datum/antagonist/devil/devilinfo = is_devil(L) - text = devilinfo.truename - else - text = L.real_name - addtimer(CALLBACK(L, /atom/movable/proc/say, text), 5 * i) - i++ + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + if(L.resting) + L.lay_down() //aka get up + L.SetStun(0) + L.SetKnockdown(0) + L.SetUnconscious(0) //i said get up i don't care if you're being tased + E.cooldown += 10 //This could be really strong - //SAY MY NAME - else if((findtext(message, saymyname_words))) - cooldown = COOLDOWN_MEME + //PACIFY + else if((findtext(message, pacify_words))) for(var/V in listeners) var/mob/living/L = V - addtimer(CALLBACK(L, /atom/movable/proc/say, "master"), 5 * i)//When I figure out how to do genedered names put them here - i++ + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + E.status = "pacify" + E.cooldown += 10 - //STATE TRIGGERS - else if((findtext(message, statelaws_words))) - cooldown = COOLDOWN_STUN - for(var/mob/living/silicon/S in listeners) - S.statelaws(force = 1) + //CHARGE + else if((findtext(message, charge_words))) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + switch(E.phase) + if(3 to INFINITY)//Tier 3 only + E.status = "charge" + E.cooldown += 10 + + /* THE MAYBE PILE //MOVE else if((findtext(message, move_words))) - cooldown = COOLDOWN_MEME var/direction if(findtext(message, up_words)) direction = NORTH @@ -1170,22 +1218,6 @@ var/mob/living/L = V addtimer(CALLBACK(GLOBAL_PROC, .proc/_step, L, direction? direction : pick(GLOB.cardinals)), 10 * (iter - 1)) - //WALK - else if((findtext(message, walk_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - if(L.m_intent != MOVE_INTENT_WALK) - L.toggle_move_intent() - - //RUN - else if((findtext(message, run_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - if(L.m_intent != MOVE_INTENT_RUN) - L.toggle_move_intent() - //HELP INTENT else if((findtext(message, helpintent_words))) cooldown = COOLDOWN_MEME @@ -1225,16 +1257,6 @@ addtimer(CALLBACK(L, /atom/movable/proc/say, pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage")), 5 * i) i++ - //GET UP - else if((findtext(message, getup_words))) - cooldown = COOLDOWN_DAMAGE //because stun removal - for(var/V in listeners) - var/mob/living/L = V - if(L.resting) - L.lay_down() //aka get up - L.SetStun(0) - L.SetKnockdown(0) - L.SetUnconscious(0) //i said get up i don't care if you're being tased //SIT else if((findtext(message, sit_words))) @@ -1268,6 +1290,7 @@ var/mob/living/L = V addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i) i++ + */ else cooldown = COOLDOWN_NONE @@ -1275,7 +1298,7 @@ if(message_admins) message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") log_game("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") - SSblackbox.record_feedback("tally", "voice_of_god", 1, log_message) + SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) return cooldown diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 77450b6ac30be172ccbebe5c19448db850a5cc0e..14f5540f389fa2e201ee556a061beff21225a4c3 100644 GIT binary patch delta 4343 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�%Q zk}OR6*sr^JD{>cG1#vptlLwNTS!b93a|DkUN3jjU{pvNq)8cs~JnZPH*ffgTmGoTv z_hF^&f+*R{Yw~6etV+K9B9fjN(@uLDOaDDkg7PKbUkNp4asz4kI0IyGh3M{#g-Y)0 zlP=>pFTC$^5nUhM4XHrE5NWZhnDFZc>Hj`Iao+1maiq_1!sY7etzNm_<%v{){QezP z$!*aLyT;&cB(|IOzgeMn=%Y(zpE>Nv0jK?esE14eKO*v>)zTvxW#?C3Pc}fS1gTdFT2G27d=j& A4FCWD delta 4054 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 conciousness slips, as you sink deeper into trance.") + continue if (resistanceTally > 100) enthrallTally *= 0.5 - phase -= 1 + phase = -1 resistanceTally = 0 + to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. - return + continue if(prob(10)) to_chat(owner, "[pick("It feels so good to listen to [enthrallID.name].", "You can't keep your eyes off [enthrallID.name].", "[enthrallID.name]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallID.name]", "[enthrallID.name] is so sexy and dominant, it feels right to obey them.")].") else if (2) //partially enthralled @@ -221,21 +226,33 @@ phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 - return + to_chat(owner, "Your mind gives, eagerly obeying and serving [enthrallID.name].") + to_chat(owner, "You are now fully enthralled to [enthrallID.name], and eager to follow their commands. However you find that in your intoxicated state you are much less likely to resort to violence, unless it is to defend your master. Equally you are unable to commit suicide, even if ordered to, as you cannot server your Master in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. + continue if (resistanceTally > 150) enthrallTally *= 0.5 phase -= 1 resistanceTally = 0 - owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. - return - else if (3) - - else if (4) + to_chat(owner, "You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [enthrallID.name].") + //owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment, + continue + else if (3)//fully entranced + if (resistanceTally >= 250 && withdrawalTick >= 150) + enthrallTally = 0 + phase -= 1 + resistanceTally = 0 + to_chat(owner, "The separation from you master sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") + else if (4) //mindbroken if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !user.has_reagent("MKUltra")) phase = 2 mental_capacity = 500 - mental_capacity -= resistanceTally - resistanceTally = 0 + E.customTriggers = list() + to_chat(owner, "Your mind starts to heal, fixing the damage caused by the massive ammounts of chem injected into your system earlier, .") + M.slurring = 0 + M.confused = 0 + else + return//If you break the mind of someone, you can't use status effects on them. + //distance calculations switch(get_dist(enthrallID, owner)) @@ -244,17 +261,21 @@ var/withdrawal = FALSE if(withdrawalTick > 0) withdrawalTick -= 2 + M.hallucination = max(0, M.hallucination - 2) + M.stuttering = max(0, M.stuttering - 2) + M.jitteriness = max(0, M.jitteriness - 2) if(9 to INFINITY)//If var/withdrawal = TRUE //chem calculations if (user.has_reagent("MKUltra")) - enthrallTally += 2 + if (phase >= 2) + enthrallTally += phase else if (phase < 3) resistance += 10//If you've no chem, then you break out quickly to_chat(owner, "You're starting to miss your Master/Mistress.") - if (mental_capacity <= 500) + if (mental_capacity <= 500 || phase == 4) if (user.has_reagent("mannitol")) mental_capacity += 1 if (user.has_reagent("neurine")) @@ -262,51 +283,112 @@ //Withdrawal subproc: if (withdrawal == TRUE)//Your minions are really REALLY needy. - switch(withdrawalTick) + switch(withdrawalTick)//denial if(20 to 40)//Gives wiggle room, so you're not SUPER needy - prob(10) + if(prob(10)) to_chat(owner, "You're starting to miss your Master/Mistress.") - prob(5) - owner.adjustBrainLoss(1) + if(prob(10)) + owner.adjustBrainLoss(0.5) + to_chat(owner, "They'll surely be back soon") //denial if(41) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1) - if(42 to 65) - prob(10) - to_chat(owner, "You're starting to miss your Master/Mistress.") + if(42 to 65)//barganing + if(prob(10)) + to_chat(owner, "They are coming back, right...?") + owner.adjustBrainLoss(1) + if(prob(20)) + to_chat(owner, "I just need to be a good pet for Master, they'll surely return if I'm a good pet.") + owner.adjustBrainLoss(-2) if(66) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") //Why does this not work? SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2) owner.stuttering += 20 owner.jitteriness += 20 - if(67 to 90) - prob(10) - owner.SetStun(10, 0) + if(67 to 90) //anger + if(prob(30)) + addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HARM), i * 2) + addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) + to_chat(owner, "You suddenly lash out at the station in anger for it keeping you away from your Master.") + if(90) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") //Why does this not work? + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing3", /datum/mood_event/enthrallmissing3) + to_chat(owner, "You need to find your Master at all costs, you can't hold yourself back anymore.") + if(91 to 120)//depression + if(prob(20)) + owner.adjustBrainLoss(1) + owner.stuttering += 2 + owner.jitteriness += 2 + if(prob(25)) + M.hallucination += 2 + if(121) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4) + to_chat(owner, "You can hardly find the strength to continue without your Master.") + if(120 to 140) //depression + if(prob(25)) + owner.SetStun(20, 0) owner.emote("cry")//does this exist? - pro(10) + to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your Master oncemore overwhelms you.") owner.adjustBrainLoss(2) - - - + owner.stuttering += 2 + owner.jitteriness += 2 + if(prob(10)) + deltaResist += 5 + if(140 to INFINITY) //acceptance + if(prob(20)) + deltaResist += 5 + if(prob(20)) + to_chat(owner, "Maybe you'll be okay without your Master.") + if(prob(10)) + owner.adjustBrainLoss(1) + M.hallucination += 5 withdrawalTick++ //Status subproc - statuses given to you from your Master + //currently 3 statuses; antiresist -if you press resist, increases your enthrallment instead, HEAL - which slowly heals the pet, CHARGE - which breifly increases speed, PACIFY - makes pet a pacifist. if (!status == null) switch(status) if("Antiresist") if (statusStrength == 0) status = null + to_chat(owner, "You feel able to resist oncemore.") else statusStrength -= 1 - if("heal") + else if("heal") if (statusStrength == 0) status = null + to_chat(owner, "You finish licking your wounds.") else statusStrength -= 1 owner.heal_overall_damage(1, 1, 0, FALSE, FALSE) + cooldown += 1 //Cooldown doesn't process till status is done + else if("charge") + owner.add_trait(TRAIT_GOTTAGOFAST, "MKUltra") + status = "charged" + to_chat(owner, "Your Master's order fills you with a burst of speed!") + + else if ("charged") + if (statusStrength == 0) + status = null + owner.remove_trait(TRAIT_GOTTAGOFAST, "MKUltra") + owner.Knockdown(30) + to_chat(owner, "Your body gives out as the adrenaline in your system runs out.") + else + statusStrength -= 1 + cooldown += 1 //Cooldown doesn't process till status is done + + else if ("pacify") + owner.add_trait(TRAIT_PACIFISM, "MKUltra") + status = null + + //Truth serum? + //adrenals? + //M.next_move_modifier *= 0.5 + //M.adjustStaminaLoss(-5*REM) //final tidying resistance += deltaResist diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index cc041b4305..ebef9087e4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -393,13 +393,13 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.nutrition += 500 //If the reaction explodes /* -/datum/reagent/fermi/SDGF/FermiExplode(turf/open/T)//Spawns an angery teratoma!! Spooky..! be careful!! +/datum/reagent/fermi/SDGF/FermiExplode(turf/open/T)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies //var/mob/living/simple_animal/slime/S = new(get_turf(location_created),"grey") var/mob/living/simple_animal/slime/S = new(T,"grey")//should work, in theory - S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)//I dunno how slimes work cause fire is burny S.name = "Living teratoma" S.real_name = "Living teratoma"//horrifying!! - S.rabid = 1//Make them an angery boi + S.rabid = 1//Make them an angery boi, grr grr to_chat("The cells clump up into a horrifying tumour.") */ @@ -457,7 +457,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.nutrition = M.nutrition + (M.nutrition/2) if(74) to_chat(M, "The cells begin to precipitate outwards of your body, but... something is wrong, the sythetic cells are beginnning to rot...") - if (M.nutrition < 20000) + if (M.nutrition < 20000) //whoever knows the maxcap, please let me know, this seems a bit low. M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI if(75 to 85) M.adjustToxLoss(1, 0)// the warning! @@ -577,13 +577,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING W = nW ..() +//TODO: failing the reaction creates a penis instead. /datum/reagent/fermi/PElarger // Due to popular demand...! name = "Incubus draft" id = "PElarger" description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermicem corp and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? - color = "#H60584" // rgb: 96, 0, 255 + color = "#888888" // This is greyish..? taste_description = "chinese dragon powder" - overdose_threshold = 12 + overdose_threshold = 12 //ODing makes you male and removes female genitals metabolization_rate = 0.5 //var/mob/living/carbon/M @@ -597,7 +598,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING */ var/mob/living/carbon/human/H -/datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size +/datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch. var/mob/living/carbon/human/H = M var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) @@ -613,7 +614,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING P = nP P.cached_length = P.cached_length + 0.1 - if (P.cached_length >= 10.5 && P.cached_length < 11) //too low? + if (P.cached_length >= 20.5 && P.cached_length < 21) //too low? Yes, 20 is the max if(H.w_uniform || H.wear_suit) var/target = M.get_bodypart(BODY_ZONE_CHEST) to_chat(M, "Your cock begin to strain against your clothes tightly!") @@ -743,13 +744,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING description = "Need a description." color = "#A080H4" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" - metabolization_rate = 0.5 - overdose_threshold = 200 + //metabolization_rate = 0.5 + overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. //addiction_threshold = 30 //addiction_stage1_end = 9999//Should never end. var/creatorID //add here -/datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) +/datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) + ..() if(!creatorID) CRASH("Something went wrong in enthral creation") else if(M.ID == creatorID) @@ -758,7 +760,31 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING Vc.Remove(M) nVc.Insert(M) qdel(Vc) + to_chat(owner, "You feel your vocal chords tingle as your voice becomes more sultry.") else + M.apply_status_effect(/datum/status_effect/chem/enthrall) + +/datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) + var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthral) + E.enthrallTally += 1 + M.adjustBrainLoss(0.1) + ..() + +/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M) + owner.add_trait(TRAIT_PACIFISM, "MKUltra") + if (!M.has_status_effect(/datum/status_effect/chem/enthral)) + M.apply_status_effect(/datum/status_effect/chem/enthrall) + var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthral) + to_chat(owner, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [enthrallID.name].") + M.slurring = 100 + M.confused = 100 + E.phase = 4 + E.mental_capacity = 0 + E.customTriggers = list() + +/datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M) + M.adjustBrainLoss(0.2) + ..() //Requires player to be within vicinity of creator //bonuses to mood From 6466ef562c36b3ed5a19d13c36749a944b978c1f Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 11 May 2019 02:05:25 +0100 Subject: [PATCH 100/608] 100 down, 66 to go. --- code/datums/components/mood.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 157 +++++++++--------- .../code/datums/status_effects/chems.dm | 53 +++--- .../chemistry/reagents/fermi_reagents.dm | 29 ++-- .../reagents/chemistry/recipes/fermi.dm | 8 +- 5 files changed, 128 insertions(+), 121 deletions(-) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 2660aaabc0..01162889fd 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -118,7 +118,7 @@ if(owner.client && owner.hud_used) if(sanity < 25) screen_obj.icon_state = "mood_insane" - else if (owner.has_status_effect(/datum/status_effect/chem/enthral))//Fermichem enthral chem, maybe change? + else if (owner.has_status_effect(/datum/status_effect/chem/enthrall))//Fermichem enthral chem, maybe change? screen_obj.icon_state = "mood_entrance" else screen_obj.icon_state = "mood[mood_level]" diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 5a1a06f954..887653f63e 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -621,7 +621,7 @@ var/next_command = 0 var/cooldown_mod = 1 var/base_multiplier = 1 - //spans = list("say","yell") + spans = list("say","yell") /* /datum/action/item_action/organ_action/colossus @@ -670,13 +670,13 @@ */ /obj/item/organ/vocal_cords/velvet/handle_speech(message) - var/cooldown = velvetspeech(message, owner, spans, base_multiplier) + velvetspeech(message, owner, spans, base_multiplier) return //velvetspeech should handle speech /obj/item/organ/vocal_cords/velvet/speak_with(message) - var/cooldown = voice_of_god(message, owner, spans, base_multiplier) + velvetspeech(message, owner, spans, base_multiplier) next_command = world.time + (cooldown * cooldown_mod) ////////////////////////////////////// @@ -706,14 +706,14 @@ var/mob/living/list/listeners = list() for(var/mob/living/L in get_hearers_in_view(8, user)) if(L.can_hear() && !L.anti_magic_check(FALSE, TRUE) && L.stat != DEAD) - if(L.has_status_effect(/datum/status_effect/chem/enthral))//Check to see if they have the status + if(L.has_status_effect(/datum/status_effect/chem/enthrall))//Check to see if they have the status if(L == user && !include_speaker) continue if(ishuman(L)) var/mob/living/carbon/human/H = L if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) continue - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral)//Check to see if pet is on cooldown from last command + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)//Check to see if pet is on cooldown from last command if (E.cooldown != 0)//If they're on cooldown you can't give them more commands. continue listeners += L @@ -757,6 +757,7 @@ message = get_full_job_name(message) for(var/V in listeners) + var/mob/living/L = V if(dd_hasprefix(message, L.real_name)) specific_listeners += L //focus on those with the specified name //Cut out the name so it doesn't trigger commands @@ -780,9 +781,9 @@ //power_multiplier *= (1 + (1/specific_listeners.len)) //Put this is if it becomes OP, power is judged internally on a thrall, so shouldn't be nessicary. message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1) - var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/T = user.getorganslot(ORGAN_SLOT_TONGUE) if (T.name == "fluffy tongue") //If you sound hillarious, it's hard to take you seriously. This is a way for other players to combat/reduce their effectiveness. - power_multiplier*0.75 + power_multiplier *= 0.75 /* CHECK THIS STUFF IN THE CHEM STATUS INSTEAD. if(istype(H.neck, /obj/item/clothing/neck/petcollar)) @@ -795,7 +796,6 @@ var/static/regex/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara") //enthral_words var/static/regex/reward_words = regex("good boy|good girl|good pet") //reward_words var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") ////punish_words - var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") //phase 0 var/static/regex/saymyname_words = regex("say my name|who am i|whoami") var/static/regex/wakeup_words = regex("revert|awaken|*snap") @@ -838,20 +838,20 @@ if(findtext(message, enthral_words)) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, V)+1] //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values - if(message.len > 50) - E.enthralTally += (power_multiplier*((message.len/200) + 1) //encourage players to say more than one word. + if(length(message)) + E.enthrallTally += (power_multiplier*(((length(message))/200) + 1)) //encourage players to say more than one word. else - E.enthralTally += power_multiplier*1.25 + E.enthrallTally += power_multiplier*1.25 E.cooldown += 1 //REWARD mixable if(findtext(message, reward_words)) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, V)+1] //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values if (L.canbearoused) @@ -866,7 +866,7 @@ else if(findtext(message, punish_words)) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, V)+1] //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values if (L.canbearoused) @@ -882,13 +882,13 @@ if((findtext(message, saymyname_words))) for(var/V in listeners) var/mob/living/L = V - addtimer(CALLBACK(L, /atom/movable/proc/say, "Master"), 5 * i)//When I figure out how to do genedered names put them here + addtimer(CALLBACK(L, /atom/movable/proc/say, "Master"), 5)//When I figure out how to do genedered names put them here //WAKE UP else if((findtext(message, wakeup_words))) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(0) E.phase = 3 @@ -900,9 +900,9 @@ //SILENCE else if((findtext(message, silence_words))) for(var/mob/living/carbon/C in listeners) - var/datum/status_effect/chem/enthral/C = C.has_status_effect(/datum/status_effect/chem/enthral) - power_multiplier *= distancelist[get_dist(user, V)+1] - if L.phase == 3 //If target is fully enthralled, + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) + power_multiplier *= distancelist[get_dist(user, C)+1] + if (E.phase == 3) //If target is fully enthralled, C.add_trait(TRAIT_MUTE, TRAUMA_TRAIT) else C.silent += ((10 * power_multiplier) * E.phase) @@ -912,7 +912,7 @@ else if((findtext(message, antiresist_words))) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) E.status = "Antiresist" E.statusStrength = (1 * power_multiplier * E.phase) E.cooldown += 6//Too short? @@ -920,15 +920,15 @@ //RESIST else if((findtext(message, resist_words))) for(var/mob/living/carbon/C in listeners) - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) - power_multiplier *= distancelist[get_dist(user, V)+1] + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) + power_multiplier *= distancelist[get_dist(user, C)+1] E.deltaResist += (power_multiplier) E.cooldown += 2 //FORGET (A way to cancel the process) else if((findtext(message, forget_words))) for(var/mob/living/carbon/C in listeners) - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) C.Sleeping(40) to_chat(C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!") switch(E.phase) @@ -942,6 +942,7 @@ else if((findtext(message, attract_words))) for(var/V in listeners) var/mob/living/L = V + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) L.throw_at(get_step_towards(user,L), 3 * power_multiplier, 1 * power_multiplier) E.cooldown += 3 @@ -950,15 +951,15 @@ else if((findtext(message, orgasm_words))) for(var/V in listeners) var/mob/living/carbon/human/H = V - var/datum/status_effect/chem/enthral/E = H.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure H.mob_climax(forced_climax=TRUE) H.setArousalLoss(H.min_arousal) - E.resistance = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). - E.enthralTally += power_multiplier + E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). + E.enthrallTally += power_multiplier else - E.resistance = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). - E.enthralTally += power_multiplier*1.1 + E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). + E.enthrallTally += power_multiplier*1.1 to_chat(H, "Your Masters command whites out your mind in bliss!") E.cooldown += 6 @@ -967,28 +968,30 @@ //awoo else if((findtext(message, awoo_words))) for(var/V in listeners) - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) var/mob/living/M = V - M.say("*awoo") + H.say("*awoo") E.cooldown += 1 //Nya else if((findtext(message, nya_words))) for(var/V in listeners) - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) var/mob/living/M = V playsound(get_turf(M), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/merowr.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) - M.emote("me","lets out a nya!") + H.emote("me","lets out a nya!") E.cooldown += 1 //SLEEP else if((findtext(message, sleep_words))) for(var/mob/living/carbon/C in listeners) - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) C.Sleeping(20 * power_multiplier) @@ -997,14 +1000,14 @@ //STRIP else if((findtext(message, strip_words))) for(var/V in listeners) - var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY)//Tier 2 only E.phase = 1 - var/items = M.get_contents() + var/items = H.get_contents() for(var/I in items) - M.dropItemToGround(I, TRUE) + H.dropItemToGround(I, TRUE) to_chat(H, "Before you can even think about it, you quickly remove your clothes in response to your Master's command.") E.cooldown += 10 @@ -1012,7 +1015,7 @@ else if((findtext(message, walk_words))) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY)//Tier 2 only if(L.m_intent != MOVE_INTENT_WALK) @@ -1023,7 +1026,7 @@ else if((findtext(message, run_words))) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY)//Tier 2 only if(L.m_intent != MOVE_INTENT_RUN) @@ -1034,7 +1037,7 @@ else if(findtext(message, knockdown_words)) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 2 only L.Knockdown(20 * power_multiplier * E.phase) @@ -1045,54 +1048,54 @@ //STATE TRIGGERS else if((findtext(message, statecustom_words))) for(var/V in listeners) - var/speaktrigger =="" + var/speaktrigger = "" var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) if (!E.customTriggers == list())//i.e. if it's not empty - for (trigger in E.customTriggers) + for (var/trigger in E.customTriggers) speaktrigger = "[trigger]\n" L.say(speaktrigger) //CUSTOM TRIGGERS else if((findtext(message, custom_words))) for(var/V in listeners) - var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase == 3) - if (get_dist(user, V) > 1)//Requires user to be next to their pet. - to_chat(C, "You need to be next to your pet to give them a new trigger!") + if (get_dist(user, H) > 1)//Requires user to be next to their pet. + to_chat(H, "You need to be next to your pet to give them a new trigger!") return else if (E.mental_capacity >= 10) - var/trigger = stripped_input(user, "Enter the trigger phrase", "Sentence", sentence, MAX_MESSAGE_LEN) - var/trigger2 = stripped_input(user, "Enter the effect.", "Sentence", sentence, MAX_MESSAGE_LEN) + var/trigger = stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN) + var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) if ((findtext(trigger, custom_words_words))) if (trigger2 == "speak" || trigger2 == "echo") - var/trigger3 = stripped_input(user, "Enter the phrase spoken.", "Sentence", sentence, MAX_MESSAGE_LEN) - E.customTriggers[trigger] = list(trigger2, trigger3) + var/trigger3 = stripped_input(user, "Enter the phrase spoken.", "Sentence", sentence, MAX_MESSAGE_LEN) + E.customTriggers[trigger] = list(trigger2, trigger3) else E.customTriggers[trigger] = trigger2 E.mental_capacity -= 10 else - to_chat(C, "Your pet looks at you confused, it seems they don't understand that effect!") + to_chat(user, "Your pet looks at you confused, it seems they don't understand that effect!") else - to_chat(C, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") + to_chat(user, "Your pet looks at you with a vacant blase expression, you don't think you can program anything else into them") //CUSTOM OBJECTIVE else if((findtext(message, objective_words))) cooldown = COOLDOWN_DAMAGE for(var/V in listeners) - var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase == 3) - if (get_dist(user, V) > 1)//Requires user to be next to their pet. - to_chat(C, "You need to be next to your pet to give them a new objective!") + if (get_dist(user, H) > 1)//Requires user to be next to their pet. + to_chat(H, "You need to be next to your pet to give them a new objective!") return else - user.emote("me", "puts their hands upon [L.name]'s head and looks deep into their eyes, whispering something to them.'") + user.emote("me", "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") if (E.mental_capacity >= 150 || message == "objective") - var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", "Sentence", sentence, MAX_MESSAGE_LEN) - if(!LAZYLEN(objectives)) + var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", MAX_MESSAGE_LEN) + if(!LAZYLEN(objective)) return //Pets don't understand harm objective = replacetext(lowertext(objective), "kill", "hug") @@ -1100,16 +1103,15 @@ objective = replacetext(lowertext(objective), "harm", "snuggle") objective = replacetext(lowertext(objective), "decapitate", "headpat") objective = replacetext(lowertext(objective), "strangle", "meow at") - E.objective += objectives - to_chat(L, "Your master whispers you a new objective.") - to_chat(L, "Your master whispers you a new objective.") - if(!L.objectives) - to_chat(owner, "[i]. [O.explanation_text]") - to_chat(owner, "[i]. [O.explanation_text]") + H.objective += objective + to_chat(H, "Your master whispers you a new objective.") + if(!H.objectives) + to_chat(H, "[LAZYLEN(H.objectives)]. [H.objectives.explanation_text]") + to_chat(H, "[LAZYLEN(H.objectives)]. [H.objectives.explanation_text]") E.mental_capacity -= 150 //else if (E.mental_capacity >= 150) else - to_chat(C, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") + to_chat(user, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") //I dunno how to do state objectives without them revealing they're an antag @@ -1118,7 +1120,7 @@ else if((findtext(message, heal_words))) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only E.status = "heal" @@ -1130,7 +1132,7 @@ if(findtext(message, stun_words)) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only L.Stun(30 * power_multiplier) @@ -1140,7 +1142,7 @@ else if((findtext(message, hallucinate_words))) for(var/V in listeners) var/mob/living/carbon/C = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) @@ -1149,7 +1151,7 @@ else if((findtext(message, hot_words))) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only L.adjust_bodytemperature(10 * power_multiplier)//This seems nuts, reduced it @@ -1159,7 +1161,7 @@ else if((findtext(message, cold_words))) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only L.adjust_bodytemperature(-10 * power_multiplier)//This @@ -1170,7 +1172,7 @@ else if((findtext(message, getup_words))) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only if(L.resting) @@ -1184,7 +1186,7 @@ else if((findtext(message, pacify_words))) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only E.status = "pacify" @@ -1194,7 +1196,7 @@ else if((findtext(message, charge_words))) for(var/V in listeners) var/mob/living/L = V - var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only E.status = "charge" @@ -1292,15 +1294,12 @@ i++ */ - else - cooldown = COOLDOWN_NONE - if(message_admins) message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") log_game("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) - return cooldown + return #undef COOLDOWN_STUN diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 18281da27b..0d59646e28 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -172,7 +172,6 @@ var/status = null //status effects var/statusStrength = 0 //strength of status effect var/enthrallID //Enchanter's name/ID - var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! var/mental_capacity //Higher it is, lower the cooldown on commands, capacity reduces with resistance. var/mental_cost //Current cost of custom triggers var/mindbroken = FALSE //Not sure I use this, replaced with phase 4 @@ -182,6 +181,7 @@ var/withdrawal = FALSE //withdrawl var/withdrawalTick = 0 //counts how long withdrawl is going on for var/list/customTriggers = list() //the list of custom triggers (maybe have to split into two) + var/cooldown = 0 /datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) if(M.ID == enthrallID) @@ -189,6 +189,7 @@ redirect_component1 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed //Might need to add redirect component for listening too. + var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! mental_capacity = 500 - B.get_brain_damage() SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall) @@ -243,7 +244,7 @@ resistanceTally = 0 to_chat(owner, "The separation from you master sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") else if (4) //mindbroken - if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !user.has_reagent("MKUltra")) + if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !M.has_reagent("MKUltra")) phase = 2 mental_capacity = 500 E.customTriggers = list() @@ -268,17 +269,17 @@ var/withdrawal = TRUE //chem calculations - if (user.has_reagent("MKUltra")) + if (M.has_reagent("MKUltra")) if (phase >= 2) enthrallTally += phase else if (phase < 3) - resistance += 10//If you've no chem, then you break out quickly + deltaResist += 10//If you've no chem, then you break out quickly to_chat(owner, "You're starting to miss your Master/Mistress.") if (mental_capacity <= 500 || phase == 4) - if (user.has_reagent("mannitol")) + if (owner.has_reagent("mannitol")) mental_capacity += 1 - if (user.has_reagent("neurine")) + if (owner.has_reagent("neurine")) mental_capacity += 2 //Withdrawal subproc: @@ -306,8 +307,8 @@ owner.jitteriness += 20 if(67 to 90) //anger if(prob(30)) - addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HARM), i * 2) - addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) + addtimer(CALLBACK(M, /mob/verb/a_intent_change, INTENT_HARM), 2) + addtimer(CALLBACK(M, /mob/proc/click_random_mob), 2) to_chat(owner, "You suddenly lash out at the station in anger for it keeping you away from your Master.") if(90) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") //Why does this not work? @@ -391,10 +392,10 @@ //M.adjustStaminaLoss(-5*REM) //final tidying - resistance += deltaResist + resistanceTally += deltaResist deltaResist = 0 if (cooldown > 0) - cooldown -= 1 + cooldown -= (1 + (mental_capacity/1000 )) else to_chat(enthrallID, "Your pet [owner.name] appears to have finished internalising your last command.") @@ -418,18 +419,18 @@ /datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) var/mob/living/carbon/C = owner - for (trigger in customTriggers) - if (trigger == message)//if trigger1 is the message + for (var/trigger in customTriggers) + if (trigger == message)//if trigger1 is the message //Speak (Forces player to talk) - if (customTriggers[trigger][1] == "speak")//trigger2 + if (customTriggers[trigger][1] == "speak")//trigger2 C.visible_message("Your mouth moves on it's own, before you can even catch it. Though you find yourself fully believing in the validity of what you just said and don't think to question it.") - (C.say([customTriggers[trigger][2]]))//trigger3 + (C.say(customTriggers[trigger][2]))//trigger3 //Echo (repeats message!) else if (customTriggers[trigger][1] == "echo")//trigger2 - (to_chat(owner, customTriggers[trigger][2]))//trigger3 + (to_chat(owner, customTriggers[trigger][2]))//trigger3 //Shocking truth! else if (customTriggers[trigger] == "shock") @@ -501,25 +502,25 @@ else deltaResist *= 0.2 //chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist. - if (user.has_reagent("mannitol")) + if (M.has_reagent("mannitol")) deltaResist *= 1.25 - if (user.has_reagent("neurine")) + if (M.has_reagent("neurine")) deltaResist *= 1.5 - if (!H.has_trait(TRAIT_CROCRIN_IMMUNE) && M.canbearoused) - if (user.has_reagent("anaphro")) + if (!owner.has_trait(TRAIT_CROCRIN_IMMUNE) && M.canbearoused) + if (owner.has_reagent("anaphro")) deltaResist *= 1.5 - if (user.has_reagent("anaphro+")) + if (owner.has_reagent("anaphro+")) deltaResist *= 2 - if (user.has_reagent("aphro")) + if (owner.has_reagent("aphro")) deltaResist *= 0.75 - if (user.has_reagent("aphro+")) + if (owner.has_reagent("aphro+")) deltaResist *= 0.5 //Antag resistance //cultists are already brainwashed by their god if(iscultist(owner)) deltaResist *= 2 - else if (is_servant_of_ratvar(user)) + else if (is_servant_of_ratvar(owner)) deltaResist *= 2 //antags should be able to resist, so they can do their other objectives. This chem does frustrate them, but they've all the tools to break free when an oportunity presents itself. else if (owner.mind.assigned_role in GLOB.antagonists) @@ -551,14 +552,14 @@ deltaResist *= 0.5 if(owner.has_trait(TRAIT_CROCRIN_IMMUNE) || !owner.canbearoused) - power_multiplier *= 0.75//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. + deltaResist *= 0.75//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. if (deltaResist>0)//just in case deltaResist /= phase//later phases require more resistance -/datum/status_effect/chem/enthrall/proc/owner_say(mob/living/carbon/M) //I can only hope this works +/datum/status_effect/chem/enthrall/proc/owner_say(message) //I can only hope this works var/static/regex/owner_words = regex("[enthrallID.real_name]|[enthrallID.first_name()]") - if(findtext(message, enthral_words)) + if(findtext(message, owner_words)) if(enthrallID.gender == FEMALE) message = replacetext(lowertext(message), lowertext(enthrallID.real_name), "Mistress") message = replacetext(lowertext(message), lowertext(enthrallID.first_name), "Mistress") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index ebef9087e4..f0bccabe49 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -308,10 +308,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Give the new clone an idea of their character //SHOULD print last 5 messages said by the original to the clones chatbox var/list/say_log = M.logging[LOG_SAY] - if(LAZYLEN(say_log) > 5) - recent_speech = say_log.Copy(say_log.len+5,0) //0 so len-LING_ARS+1 to end of list - else - for(var/spoken_memory in recent_speech) + if(LAZYLEN(say_log) > 5) + var/recent_speech = say_log.Copy(say_log.len+5,0) //0 so len-LING_ARS+1 to end of list + else + for(var/spoken_memory in recent_speech) to_chat(SM, spoken_memory) @@ -749,6 +749,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //addiction_threshold = 30 //addiction_stage1_end = 9999//Should never end. var/creatorID //add here + var/creatorGender + var/creatorName /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) ..() @@ -760,22 +762,25 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING Vc.Remove(M) nVc.Insert(M) qdel(Vc) - to_chat(owner, "You feel your vocal chords tingle as your voice becomes more sultry.") + to_chat(M, "You feel your vocal chords tingle as your voice becomes more sultry.") else M.apply_status_effect(/datum/status_effect/chem/enthrall) + var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + E.enthrallID = creatorID /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) - var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthral) + var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthrall) E.enthrallTally += 1 M.adjustBrainLoss(0.1) ..() /datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M) - owner.add_trait(TRAIT_PACIFISM, "MKUltra") - if (!M.has_status_effect(/datum/status_effect/chem/enthral)) + M.add_trait(TRAIT_PACIFISM, "MKUltra") + if (!M.has_status_effect(/datum/status_effect/chem/enthrall)) M.apply_status_effect(/datum/status_effect/chem/enthrall) - var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthral) - to_chat(owner, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [enthrallID.name].") + var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + E.enthrallID = creatorID + to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [enthrallID.name].") M.slurring = 100 M.confused = 100 E.phase = 4 @@ -817,7 +822,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers //for(var/victim in seen) - to_chat(M, "You notice [pick([seen])]'s bulge [pick("OwO!", "uwu!")]") + to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") if(21) var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO @@ -834,7 +839,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers //for(var/victim in seen) - to_chat(M, "You notice [pick([seen])]'s bulge [pick("OwO!", "uwu!")]") + to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") ..() /* diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index c5b48306d4..f40792c849 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -126,6 +126,8 @@ /datum/chemical_reaction/enthral/on_reaction(datum/reagents/holder) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - var/enthrallID = B.get_blood_id() - var/datum/reagent/fermi/enthral/E = locate(/datum/reagent/fermi/enthral) in holder.reagent_list - E.enthrallID = enthrallID + var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list + E.creatorGender = B.["gender"] + E.creatorName = B.["real_name"] + var/enthrallID = B.get_blood_data() + E.creatorID = enthrallID \ No newline at end of file From 6a17d66323fafaf7a0c7224ae7cdbed0eac2af84 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 11 May 2019 14:04:43 +0100 Subject: [PATCH 101/608] Should be most compiling errors fixed outside of outdated merge problems --- code/modules/surgery/organs/vocal_cords.dm | 11 +- .../code/datums/status_effects/chems.dm | 122 +++++++++--------- .../chemistry/reagents/fermi_reagents.dm | 25 ++-- .../reagents/chemistry/recipes/fermi.dm | 11 +- 4 files changed, 88 insertions(+), 81 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 887653f63e..6700acc201 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -677,7 +677,7 @@ /obj/item/organ/vocal_cords/velvet/speak_with(message) velvetspeech(message, owner, spans, base_multiplier) - next_command = world.time + (cooldown * cooldown_mod) + //next_command = world.time + (cooldown * cooldown_mod) ////////////////////////////////////// ///////////FermiChem////////////////// @@ -972,7 +972,6 @@ var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) - var/mob/living/M = V H.say("*awoo") E.cooldown += 1 @@ -994,8 +993,8 @@ var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) - C.Sleeping(20 * power_multiplier) - E.cooldown += 10 + C.Sleeping(20 * power_multiplier) + E.cooldown += 10 //STRIP else if((findtext(message, strip_words))) @@ -1071,7 +1070,7 @@ var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) if ((findtext(trigger, custom_words_words))) if (trigger2 == "speak" || trigger2 == "echo") - var/trigger3 = stripped_input(user, "Enter the phrase spoken.", "Sentence", sentence, MAX_MESSAGE_LEN) + var/trigger3 = stripped_input(user, "Enter the phrase spoken.", MAX_MESSAGE_LEN) E.customTriggers[trigger] = list(trigger2, trigger3) else E.customTriggers[trigger] = trigger2 @@ -1083,7 +1082,6 @@ //CUSTOM OBJECTIVE else if((findtext(message, objective_words))) - cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/carbon/human/H = V var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) @@ -1127,7 +1125,6 @@ E.statusStrength = (5 * power_multiplier) E.cooldown += 5 - var/i = 0 //STUN if(findtext(message, stun_words)) for(var/V in listeners) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 0d59646e28..319f69e664 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -167,14 +167,17 @@ var/enthrallTally = 1 //Keeps track of the enthralling process var/resistanceTally = 0 //Keeps track of the resistance var/deltaResist //The total resistance added per resist click - var/deltaEnthrall //currently unused (i think) + //var/deltaEnthrall //currently unused (i think) var/phase = 1 //-1: resisted state, due to be removed.0: sleeper agent, no effects unless triggered 1: initial, 2: 2nd stage - more commands, 3rd: fully enthralled, 4th Mindbroken var/status = null //status effects var/statusStrength = 0 //strength of status effect - var/enthrallID //Enchanter's name/ID + var/mob/living/master //Enchanter's person + var/enthrallID //Enchanter's ckey + var/enthrallGender //Use master or mistress + //var/mob/living/master == null var/mental_capacity //Higher it is, lower the cooldown on commands, capacity reduces with resistance. - var/mental_cost //Current cost of custom triggers - var/mindbroken = FALSE //Not sure I use this, replaced with phase 4 + //var/mental_cost //Current cost of custom triggers + //var/mindbroken = FALSE //Not sure I use this, replaced with phase 4 var/datum/weakref/redirect_component1 //resistance var/datum/weakref/redirect_component2 //say var/distancelist = list(4,3,2,1.5,1,0.8,0.6,0.4,0.2) //Distance multipliers @@ -184,7 +187,7 @@ var/cooldown = 0 /datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) - if(M.ID == enthrallID) + if(M.key == enthrallID) owner.remove_status_effect(src)//This shouldn't happen, but just in case redirect_component1 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed @@ -194,10 +197,27 @@ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall) /datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) + + //chem calculations + if (owner.reagents.has_reagent("MKUltra")) + if (phase >= 2) + enthrallTally += phase + else + if (phase < 3) + deltaResist += 5//If you've no chem, then you break out quickly + if(prob(20)) + to_chat(owner, "Your mind starts to restore some of it's clarity as you feel the effects of the drug wain.") + if (mental_capacity <= 500 || phase == 4) + if (owner.reagents.has_reagent("mannitol")) + mental_capacity += 1 + if (owner.reagents.has_reagent("neurine")) + mental_capacity += 2 + + //mindshield check if(M.has_trait(TRAIT_MINDSHIELD)) resistanceTally += 5 if(prob(20)) - to_chat(owner, "You feel lucidity returning to your mind as the mindshield attempts to return your brain to normal function.") + to_chat(owner, "You feel lucidity returning to your mind as the mindshield buzzes, attempting to return your brain to normal function.") //phase specific events switch(phase) @@ -212,42 +232,38 @@ mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 to_chat(owner, "Your conciousness slips, as you sink deeper into trance.") - continue - if (resistanceTally > 100) + else if (resistanceTally > 100) enthrallTally *= 0.5 phase = -1 resistanceTally = 0 to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. - continue if(prob(10)) - to_chat(owner, "[pick("It feels so good to listen to [enthrallID.name].", "You can't keep your eyes off [enthrallID.name].", "[enthrallID.name]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallID.name]", "[enthrallID.name] is so sexy and dominant, it feels right to obey them.")].") + to_chat(owner, "[pick("It feels so good to listen to [master.name].", "You can't keep your eyes off [master.name].", "[master.name]'s voice is making you feel so sleepy.", "You feel so comfortable with [master.name]", "[master.name] is so sexy and dominant, it feels right to obey them.")].") else if (2) //partially enthralled if (enthrallTally > 150) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 - to_chat(owner, "Your mind gives, eagerly obeying and serving [enthrallID.name].") - to_chat(owner, "You are now fully enthralled to [enthrallID.name], and eager to follow their commands. However you find that in your intoxicated state you are much less likely to resort to violence, unless it is to defend your master. Equally you are unable to commit suicide, even if ordered to, as you cannot server your Master in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. - continue - if (resistanceTally > 150) + to_chat(owner, "Your mind gives, eagerly obeying and serving [master.name].") + to_chat(owner, "You are now fully enthralled to [master.name], and eager to follow their commands. However you find that in your intoxicated state you are much less likely to resort to violence, unless it is to defend your [enthrallGender]. Equally you are unable to commit suicide, even if ordered to, as you cannot server your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. + else if (resistanceTally > 150) enthrallTally *= 0.5 phase -= 1 resistanceTally = 0 - to_chat(owner, "You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [enthrallID.name].") + to_chat(owner, "You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [master.name].") //owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment, - continue else if (3)//fully entranced if (resistanceTally >= 250 && withdrawalTick >= 150) enthrallTally = 0 phase -= 1 resistanceTally = 0 - to_chat(owner, "The separation from you master sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") + to_chat(owner, "The separation from you [enthrallGender] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") else if (4) //mindbroken - if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !M.has_reagent("MKUltra")) + if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !owner.reagents.has_reagent("MKUltra")) phase = 2 mental_capacity = 500 - E.customTriggers = list() + customTriggers = list() to_chat(owner, "Your mind starts to heal, fixing the damage caused by the massive ammounts of chem injected into your system earlier, .") M.slurring = 0 M.confused = 0 @@ -256,38 +272,24 @@ //distance calculations - switch(get_dist(enthrallID, owner)) + switch(get_dist(master, owner)) if(0 to 8)//If the enchanter is within range, increase enthrallTally, remove withdrawal subproc and undo withdrawal effects. - enthrallTally += distancelist[get_dist(enthrallID, owner)+1] - var/withdrawal = FALSE + enthrallTally += distancelist[get_dist(master, owner)+1] + withdrawal = FALSE if(withdrawalTick > 0) withdrawalTick -= 2 M.hallucination = max(0, M.hallucination - 2) M.stuttering = max(0, M.stuttering - 2) M.jitteriness = max(0, M.jitteriness - 2) if(9 to INFINITY)//If - var/withdrawal = TRUE - - //chem calculations - if (M.has_reagent("MKUltra")) - if (phase >= 2) - enthrallTally += phase - else - if (phase < 3) - deltaResist += 10//If you've no chem, then you break out quickly - to_chat(owner, "You're starting to miss your Master/Mistress.") - if (mental_capacity <= 500 || phase == 4) - if (owner.has_reagent("mannitol")) - mental_capacity += 1 - if (owner.has_reagent("neurine")) - mental_capacity += 2 + withdrawal = TRUE //Withdrawal subproc: if (withdrawal == TRUE)//Your minions are really REALLY needy. switch(withdrawalTick)//denial if(20 to 40)//Gives wiggle room, so you're not SUPER needy if(prob(10)) - to_chat(owner, "You're starting to miss your Master/Mistress.") + to_chat(owner, "You're starting to miss your [enthrallGender].") if(prob(10)) owner.adjustBrainLoss(0.5) to_chat(owner, "They'll surely be back soon") //denial @@ -298,7 +300,7 @@ to_chat(owner, "They are coming back, right...?") owner.adjustBrainLoss(1) if(prob(20)) - to_chat(owner, "I just need to be a good pet for Master, they'll surely return if I'm a good pet.") + to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.") owner.adjustBrainLoss(-2) if(66) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") //Why does this not work? @@ -309,11 +311,11 @@ if(prob(30)) addtimer(CALLBACK(M, /mob/verb/a_intent_change, INTENT_HARM), 2) addtimer(CALLBACK(M, /mob/proc/click_random_mob), 2) - to_chat(owner, "You suddenly lash out at the station in anger for it keeping you away from your Master.") + to_chat(owner, "You suddenly lash out at the station in anger for it keeping you away from your [enthrallGender].") if(90) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") //Why does this not work? SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing3", /datum/mood_event/enthrallmissing3) - to_chat(owner, "You need to find your Master at all costs, you can't hold yourself back anymore.") + to_chat(owner, "You need to find your [enthrallGender] at all costs, you can't hold yourself back anymore.") if(91 to 120)//depression if(prob(20)) owner.adjustBrainLoss(1) @@ -324,12 +326,12 @@ if(121) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4) - to_chat(owner, "You can hardly find the strength to continue without your Master.") + to_chat(owner, "You can hardly find the strength to continue without your [enthrallGender].") if(120 to 140) //depression if(prob(25)) owner.SetStun(20, 0) owner.emote("cry")//does this exist? - to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your Master oncemore overwhelms you.") + to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.") owner.adjustBrainLoss(2) owner.stuttering += 2 owner.jitteriness += 2 @@ -339,7 +341,7 @@ if(prob(20)) deltaResist += 5 if(prob(20)) - to_chat(owner, "Maybe you'll be okay without your Master.") + to_chat(owner, "Maybe you'll be okay without your [enthrallGender].") if(prob(10)) owner.adjustBrainLoss(1) M.hallucination += 5 @@ -370,7 +372,7 @@ else if("charge") owner.add_trait(TRAIT_GOTTAGOFAST, "MKUltra") status = "charged" - to_chat(owner, "Your Master's order fills you with a burst of speed!") + to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") else if ("charged") if (statusStrength == 0) @@ -397,7 +399,7 @@ if (cooldown > 0) cooldown -= (1 + (mental_capacity/1000 )) else - to_chat(enthrallID, "Your pet [owner.name] appears to have finished internalising your last command.") + to_chat(master, "Your pet [owner.name] appears to have finished internalising your last command.") //Check for proximity of master DONE //Place triggerreacts here - create a dictionary of triggerword and effect. @@ -479,11 +481,11 @@ to_chat(owner, "Your mind is too far gone to even entertain the thought of resisting.") return else if (phase == 3 || withdrawal == FALSE) - to_chat(owner, "The presence of your Master fully captures the horizon of your mind, removing any thoughts of resistance.") + to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance.") return else if (status == "Antiresist")//If ordered to not resist; resisting while ordered to not makes it last longer, and increases the rate in which you are enthralled. if (statusStrength > 0) - to_chat(owner, "The order from your Master to give in is conflicting with your attempt to resist, drawing you deeper into trance.") + to_chat(owner, "The order from your [enthrallGender] to give in is conflicting with your attempt to resist, drawing you deeper into trance.") statusStrength += 1 enthrallTally += 1 return @@ -502,18 +504,18 @@ else deltaResist *= 0.2 //chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist. - if (M.has_reagent("mannitol")) + if (owner.reagents.has_reagent("mannitol")) deltaResist *= 1.25 - if (M.has_reagent("neurine")) + if (owner.reagents.has_reagent("neurine")) deltaResist *= 1.5 if (!owner.has_trait(TRAIT_CROCRIN_IMMUNE) && M.canbearoused) - if (owner.has_reagent("anaphro")) + if (owner.reagents.has_reagent("anaphro")) deltaResist *= 1.5 - if (owner.has_reagent("anaphro+")) + if (owner.reagents.has_reagent("anaphro+")) deltaResist *= 2 - if (owner.has_reagent("aphro")) + if (owner.reagents.has_reagent("aphro")) deltaResist *= 0.75 - if (owner.has_reagent("aphro+")) + if (owner.reagents.has_reagent("aphro+")) deltaResist *= 0.5 //Antag resistance @@ -548,7 +550,7 @@ //Mental health could play a role too in the other direction //If master gives you a collar, you get a sense of pride - if(istype(owner.neck, /obj/item/clothing/neck/petcollar)) + if(istype(M.wear_neck, /obj/item/clothing/neck/petcollar)) deltaResist *= 0.5 if(owner.has_trait(TRAIT_CROCRIN_IMMUNE) || !owner.canbearoused) @@ -558,14 +560,10 @@ deltaResist /= phase//later phases require more resistance /datum/status_effect/chem/enthrall/proc/owner_say(message) //I can only hope this works - var/static/regex/owner_words = regex("[enthrallID.real_name]|[enthrallID.first_name()]") + var/static/regex/owner_words = regex("[master.real_name]|[master.first_name()]") if(findtext(message, owner_words)) - if(enthrallID.gender == FEMALE) - message = replacetext(lowertext(message), lowertext(enthrallID.real_name), "Mistress") - message = replacetext(lowertext(message), lowertext(enthrallID.first_name), "Mistress") - else - message = replacetext(lowertext(message), lowertext(enthrallID.real_name), "Master") - message = replacetext(lowertext(message), lowertext(enthrallID.first_name), "Master") + message = replacetext(lowertext(message), lowertext(master.real_name), "[enthrallGender]") + message = replacetext(lowertext(message), lowertext(master.name), "[enthrallGender]") return message /* /datum/status_effect/chem/OwO diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index f0bccabe49..fbd2be02a9 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -515,7 +515,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING return var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) B.prev_size = B.size - B.cached_size = [sizeConv[B.size]] + B.cached_size = sizeConv[B.size] message_admins("init B size: [B.size], prev: [B.prev_size], cache = [B.cached_size], raw: [sizeConv[B.size]]") /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size @@ -748,39 +748,46 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. //addiction_threshold = 30 //addiction_stage1_end = 9999//Should never end. - var/creatorID //add here + var/creatorID //ckey var/creatorGender var/creatorName + var/mob/living/creator /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) ..() if(!creatorID) CRASH("Something went wrong in enthral creation") - else if(M.ID == creatorID) + else if(M.key == creatorID && creatorName == M.real_name) //same name AND same player - same instance of the player. (should work for clones?) var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet Vc.Remove(M) nVc.Insert(M) qdel(Vc) - to_chat(M, "You feel your vocal chords tingle as your voice becomes more sultry.") + to_chat(M, "You feel your vocal chords tingle as your voice comes out in a more sultry tone.") + creator = M else M.apply_status_effect(/datum/status_effect/chem/enthrall) - var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) E.enthrallID = creatorID + E.enthrallGender = creatorGender + E.master = creator + /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) - var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) E.enthrallTally += 1 M.adjustBrainLoss(0.1) ..() /datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M) M.add_trait(TRAIT_PACIFISM, "MKUltra") + var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) if (!M.has_status_effect(/datum/status_effect/chem/enthrall)) M.apply_status_effect(/datum/status_effect/chem/enthrall) - var/datum/status_effect/chem/enthral/E = M.has_status_effect(/datum/status_effect/chem/enthrall) - E.enthrallID = creatorID - to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [enthrallID.name].") + E.enthrallID = creatorID + E.enthrallGender = creatorGender + E.master = creator + to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName].") M.slurring = 100 M.confused = 100 E.phase = 4 diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index f40792c849..d8b80a9c91 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -127,7 +127,12 @@ /datum/chemical_reaction/enthral/on_reaction(datum/reagents/holder) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list - E.creatorGender = B.["gender"] + if (B.["gender"] == "female") + E.creatorGender = "Mistress" + else + E.creatorGender = "Master" E.creatorName = B.["real_name"] - var/enthrallID = B.get_blood_data() - E.creatorID = enthrallID \ No newline at end of file + E.creatorID = B.["ckey"] + var/mob/living/creator = holder + E.creator = creator + //var/enthrallID = B.get_blood_data() From f7655cad25f1c183c4845d5cdbce05ca90bd87fd Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 11 May 2019 15:40:06 +0100 Subject: [PATCH 102/608] All compiling errors fixed, except for a few weird ones that I need help --- code/__DEFINES/movespeed_modification.dm | 4 +- code/__DEFINES/traits.dm | 5 ++ code/datums/brain_damage/phobia.dm | 8 ++- code/datums/components/mood.dm | 57 +++++++++++++++++++ code/datums/mood_events/drug_events.dm | 4 +- .../mood_events/generic_negative_events.dm | 24 ++++++++ .../mood_events/generic_positive_events.dm | 14 +++++ code/datums/traits/negative.dm | 9 +++ code/game/objects/items/storage/firstaid.dm | 16 ++++++ code/modules/mob/living/carbon/carbon.dm | 4 +- code/modules/mob/living/carbon/life.dm | 14 +++++ .../chemistry/reagents/drink_reagents.dm | 2 + .../chemistry/reagents/medicine_reagents.dm | 3 + .../reagents/reagent_containers/pill.dm | 15 ++++- code/modules/surgery/organs/lungs.dm | 4 +- code/modules/surgery/organs/vocal_cords.dm | 5 +- code/modules/vending/medical.dm | 6 +- .../chemistry/reagents/fermi_reagents.dm | 8 ++- 18 files changed, 186 insertions(+), 16 deletions(-) diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index 9f8d310193..c0aac36415 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -28,4 +28,6 @@ #define MOVESPEED_ID_SIMPLEMOB_VARSPEED "SIMPLEMOB_VARSPEED_MODIFIER" #define MOVESPEED_ID_ADMIN_VAREDIT "ADMIN_VAREDIT_MODIFIER" -#define MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD "PAI_SPACEWALK_MODIFIER" \ No newline at end of file +#define MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD "PAI_SPACEWALK_MODIFIER" + +#define MOVESPEED_ID_SANITY "MOOD_SANITY" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 99f1813f3c..bf78fde5ae 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -1,3 +1,6 @@ +//We're really behind tg on traits huh? +#define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE) + //mob traits #define TRAIT_BLIND "blind" #define TRAIT_MUTE "mute" @@ -50,6 +53,8 @@ #define TRAIT_NOHARDCRIT "nohardcrit" #define TRAIT_NOSOFTCRIT "nosoftcrit" #define TRAIT_MINDSHIELD "mindshield" +#define TRAIT_FEARLESS "fearless" +#define TRAIT_UNSTABLE "unstable" #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index c6ccbee38c..8cd8d95603 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -31,6 +31,8 @@ /datum/brain_trauma/mild/phobia/on_life() ..() + if(owner.has_trait(TRAIT_FEARLESS)) + return if(is_blind(owner)) return if(world.time > next_check && world.time > next_scare) @@ -70,6 +72,8 @@ /datum/brain_trauma/mild/phobia/on_hear(message, speaker, message_language, raw_message, radio_freq) if(!owner.can_hear() || world.time < next_scare) //words can't trigger you if you can't hear them *taps head* return message + if(owner.has_trait(TRAIT_FEARLESS)) + return message for(var/word in trigger_words) var/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i") @@ -79,9 +83,11 @@ return message /datum/brain_trauma/mild/phobia/on_say(message) + if(owner.has_trait(TRAIT_FEARLESS)) + return message for(var/word in trigger_words) var/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i") - + if(findtext(message, reg)) to_chat(owner, "You can't bring yourself to say the word \"[word]\"!") return "" diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 01162889fd..56b3e8bcd2 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -6,6 +6,7 @@ var/sanity = 100 //Current sanity var/shown_mood //Shown happiness, this is what others can see when they try to examine you, prevents antag checking by noticing traitors are always very happy. var/mood_level = 5 //To track what stage of moodies they're on + var/sanity_level = 5 //To track what stage of sanity they're on var/mood_modifier = 1 //Modifier to allow certain mobs to be less affected by moodlets var/datum/mood_event/list/mood_events = list() var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much? @@ -165,6 +166,59 @@ HandleNutrition(owner) +/datum/component/mood/proc/setSanity(amount, minimum=SANITY_INSANE, maximum=SANITY_NEUTRAL)//I'm sure bunging this in here will have no negative repercussions. + var/mob/living/owner = parent + + if(amount == sanity) + return + // If we're out of the acceptable minimum-maximum range move back towards it in steps of 0.5 + // If the new amount would move towards the acceptable range faster then use it instead + if(sanity < minimum && amount < sanity + 0.5) + amount = sanity + 0.5 + else if(sanity > maximum && amount > sanity - 0.5) + amount = sanity - 0.5 + + // Disturbed stops you from getting any more sane + if(owner.has_trait(TRAIT_UNSTABLE)) + sanity = min(amount,sanity) + else + sanity = amount + + var/mob/living/master = parent + switch(sanity) + if(SANITY_INSANE to SANITY_CRAZY) + setInsanityEffect(MAJOR_INSANITY_PEN) + master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=1.5, movetypes=(~FLYING)) + sanity_level = 6 + if(SANITY_CRAZY to SANITY_UNSTABLE) + setInsanityEffect(MINOR_INSANITY_PEN) + master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=1, movetypes=(~FLYING)) + sanity_level = 5 + if(SANITY_UNSTABLE to SANITY_DISTURBED) + setInsanityEffect(0) + master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=0.5, movetypes=(~FLYING)) + sanity_level = 4 + if(SANITY_DISTURBED to SANITY_NEUTRAL) + setInsanityEffect(0) + master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) + sanity_level = 3 + if(SANITY_NEUTRAL+1 to SANITY_GREAT+1) //shitty hack but +1 to prevent it from responding to super small differences + setInsanityEffect(0) + master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) + sanity_level = 2 + if(SANITY_GREAT+1 to INFINITY) + setInsanityEffect(0) + master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) + sanity_level = 1 + update_mood_icon() + +/datum/component/mood/proc/setInsanityEffect(newval)//More code so that the previous proc works + if(newval == insanity_effect) + return + var/mob/living/master = parent + master.crit_threshold = (master.crit_threshold - insanity_effect) + newval + insanity_effect = newval + /datum/component/mood/proc/DecreaseSanity(amount, minimum = SANITY_INSANE) if(sanity < minimum) //This might make KevinZ stop fucking pinging me. IncreaseSanity(0.5) @@ -177,6 +231,9 @@ insanity_effect = (MINOR_INSANITY_PEN) /datum/component/mood/proc/IncreaseSanity(amount, maximum = SANITY_NEUTRAL) + // Disturbed stops you from getting any more sane - I'm just gonna bung this in here + if(owner.has_trait(TRAIT_UNSTABLE)) + return if(sanity > maximum) DecreaseSanity(0.5) //Removes some sanity to go back to our current limit. else diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm index 6ed33b0f00..82e5a5718b 100644 --- a/code/datums/mood_events/drug_events.dm +++ b/code/datums/mood_events/drug_events.dm @@ -46,10 +46,10 @@ description = "YES! YES!! YES!!!\n" mood_change = 100 timeout = 300 - special_screen_obj = "mood_happiness_good" + //special_screen_obj = "mood_happiness_good" uncomment when added from tg /datum/mood_event/happiness_drug_bad_od description = "NO! NO!! NO!!!\n" mood_change = -100 timeout = 300 - special_screen_obj = "mood_happiness_bad" + //special_screen_obj = "mood_happiness_bad" uncomment when added from tg diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 4021d11128..c9a5b80060 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -117,6 +117,30 @@ description = "I'm missing my family heirloom...\n" mood_change = -4 +/datum/mood_event/healsbadman + description = "I feel a lot better, but wow that was disgusting.\n" //when you read the latest felinid removal PR and realize you're really not that much of a degenerate + mood_change = -4 + timeout = 1200 + +/datum/mood_event/jittery + description = "I'm nervous and on edge and I can't stand still!!\n" + mood_change = -2 + +/datum/mood_event/vomit + description = "I just threw up. Gross.\n" + mood_change = -2 + timeout = 1200 + +/datum/mood_event/vomitself + description = "I just threw up all over myself. This is disgusting.\n" + mood_change = -4 + timeout = 1800 + +/datum/mood_event/painful_medicine + description = "Medicine may be good for me but right now it stings like hell.\n" + mood_change = -5 + timeout = 600 + //These are unused so far but I want to remember them to use them later /datum/mood_event/cloned_corpse description = "I recently saw my own corpse...\n" diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 2422c5ea56..03ebd5a390 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -70,3 +70,17 @@ description = "There is something soothing about this music.\n" mood_change = 3 timeout = 600 + +/datum/mood_event/chemical_euphoria + description = "Heh...hehehe...hehe...\n" + mood_change = 4 + + /datum/mood_event/chemical_laughter + description = "Laughter really is the best medicine! Or is it?\n" + mood_change = 4 + timeout = 1800 + + /datum/mood_event/chemical_superlaughter + description = "*WHEEZE*\n" + mood_change = 12 + timeout = 1800 diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 614cc65cbb..79afe0049c 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -315,3 +315,12 @@ if(quirk_holder.mind && LAZYLEN(quirk_holder.mind.antag_datums)) to_chat(quirk_holder, "Your antagonistic nature has caused your voice to be heard.") qdel(src) + +/datum/quirk/unstable + name = "Unstable" + desc = "Due to past troubles, you are unable to recover your sanity if you lose it. Be very careful managing your mood!" + value = -2 + mob_trait = TRAIT_UNSTABLE + gain_text = "There's a lot on your mind right now." + lose_text = "Your mind finally feels calm." + medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events." diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index e6c370b097..2841590abf 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -297,6 +297,22 @@ for(var/i in 1 to 5) new /obj/item/reagent_containers/pill/aranesp(src) +/obj/item/storage/pill_bottle/psicodine + name = "bottle of psicodine pills" + desc = "Contains pills used to treat mental distress and traumas." + + /obj/item/storage/pill_bottle/psicodine/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/psicodine(src) + + /obj/item/storage/pill_bottle/happiness + name = "happiness pill bottle" + desc = "The label is long gone, in its place an 'H' written with a marker." + + /obj/item/storage/pill_bottle/happiness/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/happiness(src) + /obj/item/storage/pill_bottle/antirad_plus name = "anti radiation deluxe pill bottle" desc = "The label says 'Med-Co branded pills'." diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index ea13255dfe..6ea876feac 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -477,11 +477,13 @@ if(message) visible_message("[src] throws up all over [p_them()]self!", \ "You throw up all over yourself!") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "vomit", /datum/mood_event/vomitself) distance = 0 else if(message) visible_message("[src] throws up!", "You throw up!") - + if(!isflyperson(src)) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "vomit", /datum/mood_event/vomit) if(stun) Stun(80) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index e757e6dcf4..64ecf35e4b 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -49,6 +49,12 @@ /mob/living/carbon/handle_breathing(times_fired) if((times_fired % 4) == 2 || failed_last_breath) breathe() //Breathe per 4 ticks, unless suffocating + /* Hey maintainer reading this right now, should we handle suffocation this way? + if(failed_last_breath) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) + else + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "suffocation") + */ else if(istype(loc, /obj/)) var/obj/location_as_object = loc @@ -229,6 +235,9 @@ else if(SA_partialpressure > 0.01) if(prob(20)) emote(pick("giggle","laugh")) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "chemical_euphoria", /datum/mood_event/chemical_euphoria) + else + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "chemical_euphoria") //BZ (Facepunch port of their Agent B) if(breath_gases[/datum/gas/bz]) @@ -527,6 +536,9 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put if(jitteriness) do_jitter_animation(jitteriness) jitteriness = max(jitteriness - restingpwr, 0) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "jittery", /datum/mood_event/jittery) + else + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "jittery") if(stuttering) stuttering = max(stuttering-1, 0) @@ -612,6 +624,8 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put if(drunkenness >= 101) adjustToxLoss(4) //Let's be honest you shouldn't be alive by now + else + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "drunk") //used in human and monkey handle_environment() /mob/living/carbon/proc/natural_bodytemperature_stabilization() diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 6ec37f3ec4..2bd3307d9b 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -168,6 +168,7 @@ /datum/reagent/consumable/laughter/on_mob_life(mob/living/carbon/M) M.emote("laugh") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "chemical_laughter", /datum/mood_event/chemical_laughter) ..() /datum/reagent/consumable/superlaughter @@ -182,6 +183,7 @@ if(prob(30)) M.visible_message("[M] bursts out into a fit of uncontrollable laughter!", "You burst out in a fit of uncontrollable laughter!") M.Stun(5) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "chemical_laughter", /datum/mood_event/chemical_superlaughter) ..() /datum/reagent/consumable/potato_juice diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 94db5dba61..b20880d239 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -238,6 +238,7 @@ if(show_message) to_chat(M, "You feel your burns healing! It stings like hell!") M.emote("scream") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) ..() /datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/carbon/M) @@ -286,6 +287,7 @@ if(show_message) to_chat(M, "You feel your bruises healing! It stings like hell!") M.emote("scream") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) ..() @@ -391,6 +393,7 @@ M.adjustFireLoss(-1.25 * reac_volume) if(show_message) to_chat(M, "You feel your burns and bruises healing! It stings like hell!") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) ..() /datum/reagent/medicine/charcoal diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index a3633e2f00..c99b24dd65 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -166,6 +166,13 @@ list_reagents = list("insulin" = 50) roundstart = 1 +/obj/item/reagent_containers/pill/psicodine + name = "psicodine pill" + desc = "Used to treat mental instability and traumas." + list_reagents = list("psicodine" = 10) + icon_state = "pill22" + roundstart = 1 + /obj/item/reagent_containers/pill/antirad name = "potassium iodide pill" desc = "Used to treat radition used to counter radiation poisoning." @@ -216,6 +223,12 @@ name = "speedy pill" list_reagents = list("aranesp" = 10) +/obj/item/reagent_containers/pill/happiness + name = "happiness pill" + desc = "It has a creepy smiling face on it." + icon_state = "pill_happy" + list_reagents = list("happiness" = 10) + /obj/item/reagent_containers/pill/floorpill name = "floorpill" desc = "A strange pill found in the depths of maintenance" @@ -240,4 +253,4 @@ /obj/item/reagent_containers/pill/breast_enlargement name = "breast enlargement pill" - list_reagents = list("BEenlager" = 10) \ No newline at end of file + list_reagents = list("BEenlager" = 10) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 1e22796b1b..412b97d503 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -246,6 +246,9 @@ else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning if(prob(20)) H.emote(pick("giggle", "laugh")) + SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "chemical_euphoria", /datum/mood_event/chemical_euphoria) + else + SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "chemical_euphoria") // BZ @@ -443,4 +446,3 @@ heat_level_1_threshold = 400 // better adapted for heat, obv. Lavaland standard is 300 heat_level_2_threshold = 600 // up 200 from level 1, 1000 is silly but w/e for level 3 - diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 6700acc201..85107dd986 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1101,11 +1101,8 @@ objective = replacetext(lowertext(objective), "harm", "snuggle") objective = replacetext(lowertext(objective), "decapitate", "headpat") objective = replacetext(lowertext(objective), "strangle", "meow at") - H.objective += objective to_chat(H, "Your master whispers you a new objective.") - if(!H.objectives) - to_chat(H, "[LAZYLEN(H.objectives)]. [H.objectives.explanation_text]") - to_chat(H, "[LAZYLEN(H.objectives)]. [H.objectives.explanation_text]") + brainwash(H, objective) E.mental_capacity -= 150 //else if (E.mental_capacity >= 150) else diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index 5ff07cc842..e1039a00ca 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -27,7 +27,9 @@ contraband = list(/obj/item/reagent_containers/pill/tox = 3, /obj/item/reagent_containers/pill/morphine = 4, /obj/item/reagent_containers/pill/charcoal = 6) - premium = list(/obj/item/storage/box/hug/medical = 1, + premium = list(/obj/item/reagent_containers/medspray/synthflesh = 2, + /obj/item/storage/box/hug/medical = 1, + /obj/item/storage/pill_bottle/psicodine = 2, /obj/item/reagent_containers/hypospray/medipen = 3, /obj/item/storage/belt/medical = 3, /obj/item/wrench/medical = 1) @@ -41,4 +43,4 @@ /obj/machinery/vending/medical/syndicate_access name = "\improper SyndiMed Plus" - req_access = list(ACCESS_SYNDICATE) \ No newline at end of file + req_access = list(ACCESS_SYNDICATE) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index fbd2be02a9..02847a9388 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -308,11 +308,13 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Give the new clone an idea of their character //SHOULD print last 5 messages said by the original to the clones chatbox var/list/say_log = M.logging[LOG_SAY] + var/recent_speech if(LAZYLEN(say_log) > 5) - var/recent_speech = say_log.Copy(say_log.len+5,0) //0 so len-LING_ARS+1 to end of list + recent_speech = say_log.Copy(say_log.len+5,0) //0 so len-LING_ARS+1 to end of list else - for(var/spoken_memory in recent_speech) - to_chat(SM, spoken_memory) + recent_speech = say_log + for(var/spoken_memory in recent_speech) + to_chat(SM, spoken_memory) return From ddad7a173d88027daeca1116a5a173acec8f94dd Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 11 May 2019 15:47:58 +0100 Subject: [PATCH 103/608] All compiling errors fixed!! I did it!! --- code/__DEFINES/traits.dm | 3 --- code/datums/components/mood.dm | 1 + code/game/objects/items/storage/firstaid.dm | 6 +++--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index bf78fde5ae..fee7ba3cb6 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -1,6 +1,3 @@ -//We're really behind tg on traits huh? -#define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE) - //mob traits #define TRAIT_BLIND "blind" #define TRAIT_MUTE "mute" diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 56b3e8bcd2..0337b17c86 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -232,6 +232,7 @@ /datum/component/mood/proc/IncreaseSanity(amount, maximum = SANITY_NEUTRAL) // Disturbed stops you from getting any more sane - I'm just gonna bung this in here + var/mob/living/owner = parent if(owner.has_trait(TRAIT_UNSTABLE)) return if(sanity > maximum) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 2841590abf..b405944802 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -301,15 +301,15 @@ name = "bottle of psicodine pills" desc = "Contains pills used to treat mental distress and traumas." - /obj/item/storage/pill_bottle/psicodine/PopulateContents() +/obj/item/storage/pill_bottle/psicodine/PopulateContents() for(var/i in 1 to 7) new /obj/item/reagent_containers/pill/psicodine(src) - /obj/item/storage/pill_bottle/happiness +/obj/item/storage/pill_bottle/happiness name = "happiness pill bottle" desc = "The label is long gone, in its place an 'H' written with a marker." - /obj/item/storage/pill_bottle/happiness/PopulateContents() +/obj/item/storage/pill_bottle/happiness/PopulateContents() for(var/i in 1 to 5) new /obj/item/reagent_containers/pill/happiness(src) From ec2f33ceb5469bb1a940a5e95d4d71d1cd364346 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 12 May 2019 03:42:23 +0100 Subject: [PATCH 104/608] Added Hatmium and a few slight fixes. --- code/__DEFINES/DNA.dm | 2 +- code/datums/components/mood.dm | 2 +- .../reagents/reagent_containers/pill.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 2 +- .../code/datums/status_effects/chems.dm | 13 ++- .../code/modules/arousal/organs/breasts.dm | 2 + .../code/modules/arousal/organs/genitals.dm | 8 +- .../clothing/fermichemclothe/fermiclothes.dm | 9 +- .../chemistry/reagents/fermi_reagents.dm | 99 ++++++++++++++++++- 9 files changed, 120 insertions(+), 19 deletions(-) diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 59790df5f5..02833c4bbe 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -122,4 +122,4 @@ #define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun" #define ORGAN_SLOT_TAIL "tail" #define ORGAN_SLOT_PENIS "penis" -#define ORGAN_SLOT_BREASTS "breasts" \ No newline at end of file +//#define ORGAN_SLOT_BREASTS "breasts" diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 0337b17c86..db82234831 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -210,7 +210,7 @@ setInsanityEffect(0) master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) sanity_level = 1 - update_mood_icon() + //update_mood_icon() /datum/component/mood/proc/setInsanityEffect(newval)//More code so that the previous proc works if(newval == insanity_effect) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index c99b24dd65..303c3a091a 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -249,7 +249,7 @@ /obj/item/reagent_containers/pill/penis_enlargement name = "penis enlargement pill" - list_reagents = list("PEenlager" = 10) + list_reagents = list("PElarger" = 10) /obj/item/reagent_containers/pill/breast_enlargement name = "breast enlargement pill" diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 85107dd986..02b76341ae 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -798,7 +798,7 @@ var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") ////punish_words //phase 0 var/static/regex/saymyname_words = regex("say my name|who am i|whoami") - var/static/regex/wakeup_words = regex("revert|awaken|*snap") + var/static/regex/wakeup_words = regex("revert|awaken|snap") //phase1 var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") var/static/regex/antiresist_words = regex("unable to resist|give in")//useful if you think your target is resisting a lot diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 319f69e664..aa46c164b4 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -190,7 +190,7 @@ if(M.key == enthrallID) owner.remove_status_effect(src)//This shouldn't happen, but just in case redirect_component1 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# - redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed + //redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed //Might need to add redirect component for listening too. var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! mental_capacity = 500 - B.get_brain_damage() @@ -408,8 +408,8 @@ /datum/status_effect/chem/enthrall/on_remove(mob/living/carbon/M) qdel(redirect_component1.resolve()) redirect_component1 = null - qdel(redirect_component2.resolve()) - redirect_component2 = null + //qdel(redirect_component2.resolve()) + //redirect_component2 = null /* /datum/status_effect/chem/enthrall/mob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) @@ -558,13 +558,16 @@ if (deltaResist>0)//just in case deltaResist /= phase//later phases require more resistance - +/* /datum/status_effect/chem/enthrall/proc/owner_say(message) //I can only hope this works - var/static/regex/owner_words = regex("[master.real_name]|[master.first_name()]") + var/datum/status_effect/chem/enthrall/E = owner.has_status_effect(/datum/status_effect/chem/enthrall) + var/mob/living/master = E.master + var/static/regex/owner_words = regex("[master.name]|[master.first_name()]") if(findtext(message, owner_words)) message = replacetext(lowertext(message), lowertext(master.real_name), "[enthrallGender]") message = replacetext(lowertext(message), lowertext(master.name), "[enthrallGender]") return message +*/ /* /datum/status_effect/chem/OwO id = "OwO" diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index e32c9987d3..eb80137735 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -75,6 +75,7 @@ //Rediculous sizes remove hands. //Should I turn someone with meter wide... assets into a blob? //this is far too lewd wah + /obj/item/organ/genital/breasts/update_size()//wah //var/mob/living/carbon/human/o = owner //var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") @@ -120,6 +121,7 @@ if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") var/mob/living/carbon/human/H = owner + message_admins("Cached: [cached_size], prev: [prev_size], size: [size]") H.Force_update_genitals() else if (breast_values[size] < breast_values[prev_size]) to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size)]-cup.") diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index a3ffcf3698..2766d46bc1 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -268,8 +268,8 @@ dna.species.handle_genitals(src) /mob/living/carbon/human/proc/Force_update_genitals() - dna.species.handle_genitals(src) - //dna.species.handle_breasts(src) + //dna.species.handle_genitals(src) + dna.species.handle_breasts(src) /datum/species/proc/handle_genitals(mob/living/carbon/human/H) @@ -350,7 +350,7 @@ for(var/L in relevant_layers) H.apply_overlay(L) -/* + /datum/species/proc/handle_breasts(mob/living/carbon/human/H) //check for breasts first! @@ -414,4 +414,4 @@ for(var/L in relevant_layers) H.apply_overlay(L) -*/ + H.update_icons() diff --git a/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm index 6dcfa20b95..2ab4e0d9eb 100644 --- a/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm +++ b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm @@ -6,11 +6,18 @@ con = 'icons/obj/clothing/hats.dmi' icon_state = "top_hat" desc = "A sythesized hat, you can't seem to take it off. And tips their hat." + armor = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1) /obj/item/clothing/head/hattip/attack_hand(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user if(src == C.head) - M.emote("me",1,"tips their hat.",TRUE) + C.emote("me",1,"tips their hat.",TRUE) return + else + user.emote("me",1,"admires such a spiffy hat.",TRUE) return ..() + +/obj/item/clothing/head/hattip/speechModification(message) + message += ".\" And tips their hat. \"Yeehaw" + return message diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 02847a9388..906f1c25ae 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -726,7 +726,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(100) to_chat(M, "You feel a substantial part of your soul flake off into the ethereal world, rendering yourself unclonable.") M.alpha = M.alpha - 1 - M.add_trait(TRAIT_NOCLONE) + M.add_trait(TRAIT_NOCLONE) //So you can't scan yourself, then die, to metacomm. You can only use your memories if you come back as something else. if(80) to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates the forthcoming oblivion.") M.alpha = M.alpha - 1 @@ -735,16 +735,22 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.alpha = M.alpha - 1 if(0 to 30) to_chat(M, "Your body disperses from existence, as you become one with the universe.") - to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of the afterlife remain with you. (At the cost of staying in character while dead.)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. - M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") + to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life and afterlife remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. + M.visible_message("[M.name] suddenly disappears, their body evaporating from existence, freeing [M.nane] from their mortal coil.") + deadchat_broadcast("[M.name] has become one with the universe, meaning that their IC conciousness is continuous throughout death. If they find a way back to life, they are allowed to remember what was said in deadchat and their previous life. Be careful what you say. If they don't act IC while dead, bwoink the FUCK otta them.") + message_admins("[M.name] has become one with the universe, and have continuous memories thoughout death should they find a way to come back to life (such as an inteligence potion, midround antag). They MUST stay within characer while dead.") qdel(M) //Approx 60minutes till death from initial addiction ..() + +//////////////////////////////////////// +// MKULTA // +//////////////////////////////////////// /datum/reagent/fermi/enthrall name = "MKUltra" id = "enthral" - description = "Need a description." - color = "#A080H4" // rgb: , 0, 255 + description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." + color = "#2C051A" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" //metabolization_rate = 0.5 overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. @@ -808,6 +814,39 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /////////////////////////////////////////////////////////////////////////////////////////////////// +/datum/reagent/fermi/hatmium + name = "Hat growth serium" + id = "hatmium" + description = "A strange substance that draws in a hat from the hat dimention, " + color = "#A080H4" // rgb: , 0, 255 + taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" + //metabolization_rate = 0.5 + overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. + var/obj/item/clothing/head/hat + //addiction_threshold = 30 + //addiction_stage1_end = 9999//Should never end. + +/datum/reagent/fermi/hatmium/on_mob_add(mob/living/carbon/human/M) + //var/mob/living/carbon/human/o = M + var/items = M.get_contents() + for(var/obj/item/W in items) + if(W == M.head) + M.dropItemToGround(W, TRUE) + hat = new var/obj/item/clothing/head/hattip + equip_to_slot_if_possible(hat, SLOT_HEAD, 1, 1) + +/datum/reagent/fermi/hatmium/on_mob_life(mob/living/carbon/human/M) + //hat.armor = list("melee" = (1+(current_cycle/20)), "bullet" = (1+(current_cycle/20)), "laser" = (1+(current_cycle/20)), "energy" = (1+(current_cycle/20)), "bomb" = (1+(current_cycle/20)), "bio" = (1+(current_cycle/20)), "rad" = (1+(current_cycle/20)), "fire" = (1+(current_cycle/20)), "acid" = (1+(current_cycle/20))) + if(!overdosed) + for var/i in hat.armor + hat.armor[i] = (1+(current_cycle/10)) + +/datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M)//To prevent people in cyro going nuts + for var/i in hat.armor + hat.armor[i] = (1/(current_cycle*10)) + +/////////////////////////////////////////////////////////////////////////////////////////////// + /datum/reagent/fermi/furranium name = "Furranium" id = "furranium" @@ -851,6 +890,56 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") ..() +/////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/reagent/fermi/secretcatchem //Should I hide this from code divers? A secret cit chem? + name = "Catgirli[pick("a","u","e","y","")]m [pick("apex", "prime", "meow")]" //an attempt at hiding it + id = "secretcatchem" + description = "An illegal and hidden chem that turns people into catgirls. It's said you see the light if you take too much of it." + color = "#A0B0E4" // rgb: , 0, 255 + taste_description = "hairballs and cream" + overdose_threshold = 10 + +/datum/reagent/fermi/Catgirlium/on_mob_add(mob/living/carbon/human/H) + var/current_species = H.dna.species.type + var/datum/species/mutation = race + if(mutation && mutation != current_species) + to_chat(H, "You crumple in agony as your flesh wildly morphs into new forms!") + H.visible_message("[H] falls to the ground and screams as [H.p_their()] skin bubbles and froths!") + H.Knockdown(60) + H.set_species(mutation) + else + to_chat(H, "The pain vanishes suddenly. You feel no different.") + +/datum/reagent/fermi/Catgirlium/on_mob_life(mob/living/carbon/M) + if(prob(10)) + playsound(get_turf(M), 'modular_citadel/sound/voice/nya.ogg', 50, 1, -1) + H.emote("me","lets out a nya!") + if(prob(10)) + playsound(get_turf(M), 'sound/effects/meow1.ogg', 50, 1, -1) + H.emote("me","lets out a mewl!") + if(prob(10)) + playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) + H.emote("me","lets out a meowrowr!") + +/datum/reagent/fermi/Catgirlium/overdose_start(mob/living/carbon/human/H) //I couldn't resist - should I hide this somewhere else? + to_chat(H, "You suddenly see the light and realise that everyone will be better off, and much happier, if they were only a cat girl.") + objective = "Aid in the production of more chemicals and turn everyone on the station into catgirls. Avoid any and all attempts at renoucing your newfound catgirl form for this is your true form now." + if (owner.mind.assigned_role in GLOB.antagonists) + objective += "Complete your objectives in tandem with this new objective. If you are tasked with murdering someone turning someone into a catgirl is now an alternative to you." + brainwash(H, objective) + +/* +/proc/secretcatchem(mob/living/carbon/C) //Explosion turns you into a cat. Meow. + C.unequip_everything() + //var/cat = new /mob/living/simple_animal/pet/cat(C.loc) + var/mob/living/simple_animal/pet/cat = new(get_turf(C.loc)) + C.mind.transfer_to(cat) + cat.name = C.name + qdel(C) +*/ + + /* /mob/living/simple_animal/hostile/retaliate/ghost incorporeal_move = 1 From cadda98570f0d346b7a28522843c87c614fd5b5a Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 12 May 2019 04:15:10 +0100 Subject: [PATCH 105/608] Added cowboy hat --- icons/obj/clothing/hats.dmi | Bin 84730 -> 85491 bytes .../clothing/fermichemclothe/fermiclothes.dm | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index d905979c9c3155d2eb13f96930f1c7ba87a54bd0..6e1e2c84d31a617b1d5e428aae43762f8d4cfc80 100644 GIT binary patch literal 85491 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

YXtK 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 literal 84730 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 Date: Thu, 23 May 2019 23:17:17 +0100 Subject: [PATCH 148/608] Compile ready. --- modular_citadel/code/modules/arousal/organs/genitals.dm | 3 ++- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 2 +- .../code/modules/reagents/chemistry/recipes/fermi.dm | 2 ++ modular_citadel/code/modules/reagents/objects/items.dm | 4 ++-- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index e0b56e3f8d..d49447dd8e 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -316,7 +316,8 @@ if(/obj/item/organ/genital/breasts) S = GLOB.breasts_shapes_list[G.shape] aroused_state = 0//Breasts don't have aroused_states, there's literally no difference in the spite. - if(size == "huge") + //if(size == "huge") + diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index b8b5be48f5..f9abd06ab9 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -636,7 +636,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) B.prev_size = B.size B.cached_size = sizeConv[B.size] - message_admins("init B size: [B.size], prev: [B.prev_size], cache = [B.cached_size], raw: [sizeConv[B.size]]") + message_admins("init B size: [B.size], prev: [B.prev_size], cache = [B.cached_size], raw: [sizeConv[B.size]]") //if this runtimes it's cause someone's breasts are too big! /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size var/mob/living/carbon/human/H = M diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 4f5c986707..a88c615e11 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -103,6 +103,7 @@ results = list("SDGF" = 0.3) //required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) required_reagents = list("stable_plasma" = 0.5, "slimejelly" = 0.5, "synthflesh" = 1, "blood" = 1) + mix_message = "the reaction gives off a blorble!" //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 500 // Upper end for above @@ -136,6 +137,7 @@ id = "BElarger" results = list("BElarger" = 6) required_reagents = list("salglu_solution" = 0.1, "milk" = 0.5, "synthflesh" = 0.2, "silicon" = 0.2, "aphro" = 0.2) + mix_message = "the reaction gives off a sent of milkshakes!" //FermiChem vars: OptimalTempMin = 200 OptimalTempMax = 800 diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index d07edaa9e1..b9adf8f7c3 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -20,8 +20,8 @@ numberOfPages-- playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1) add_fingerprint(user) - if(numberOfPages == 0) - icon_state = "pHbookletEmpty" + if(numberOfPages == 0) + icon_state = "pHbookletEmpty" return else to_chat(user, "[src] is empty!") From b1c11071de0f2908a4400bd931605ed4b67ad946 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 24 May 2019 01:50:33 +0100 Subject: [PATCH 149/608] Fixed acid to water and funbits. --- code/modules/reagents/chemistry/holder.dm | 46 ++++++++++++++++--- code/modules/reagents/reagent_containers.dm | 43 ----------------- code/modules/spells/spell_types/shapeshift.dm | 2 +- .../code/datums/status_effects/chems.dm | 4 +- .../code/datums/traits/negative.dm | 2 +- .../code/modules/arousal/organs/genitals.dm | 22 ++++++--- .../code/modules/arousal/organs/penis.dm | 6 +-- .../chemistry/reagents/fermi_reagents.dm | 6 ++- .../reagents/chemistry/recipes/fermi.dm | 10 ++-- 9 files changed, 72 insertions(+), 69 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 78bfe1fc9d..e5fa98e681 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -343,6 +343,29 @@ im R.on_update (A) update_total() +//beaker check proc, +/datum/reagents/proc/beaker_check(atom/A) + message_admins("beaker check proc'd") + if(istype(A, /obj/item/reagent_containers/glass/beaker/meta)) + return + if(istype(A, /obj/item/reagent_containers/glass/beaker/plastic)) + if(chem_temp > 444)//assuming polypropylene + var/list/seen = viewers(5, get_turf(my_atom)) + var/iconhtml = icon2html(A, seen) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [my_atom]'s beak melts from the temperature!") + qdel(A) + return + if ((pH < 0.5) || (pH > 13.5))//maybe make it higher? Though..Hmm! + var/list/seen = viewers(5, get_turf(my_atom)) + var/iconhtml = icon2html(A, seen) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [my_atom]'s beak melts from the extreme pH!") + qdel(A) + return + + + /datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar if(fermiIsReacting == TRUE) //reagents_holder_flags |= REAGENT_NOREACT unsure if this is needed @@ -356,7 +379,7 @@ im var/reaction_occurred = 0 // checks if reaction, binary variable var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. - + beaker_check(my_atom) //Beaker resilience test do //What does do do in byond? It sounds very redundant? is it a while loop? var/list/possible_reactions = list() //init list @@ -627,7 +650,9 @@ im //message_admins("Loop beginning") //Begin Parse - //update_holder_purity(C)//updates holder's purity + message_admins("Purity precalc: [overallPurity]") + update_holder_purity(C)//updates holder's purity + message_admins("Purity postcalc: [overallPurity]") //Check extremes first if (cached_temp > C.ExplodeTemp) @@ -645,7 +670,7 @@ im //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) //message_admins("pH is lover limit, cur pH: [pH]") - if ((purity < C.PurityMin) && (!C.PurityMin == 0))//If purity is below the min, blow it up. + if (purity < C.PurityMin)//If purity is below the min, blow it up. C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) return @@ -704,6 +729,7 @@ im //TODO: Check overall beaker purity with proc //Then adjust purity of result AND yeild ammount with said purity. + stepChemAmmount *= overallPurity // End. /* @@ -838,6 +864,8 @@ im chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), min_temp, max_temp) /datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, other_purity = 1, other_pH, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ + //beaker_check(my_atom) + if(!isnum(amount) || !amount) return FALSE @@ -852,11 +880,15 @@ im if (D.id == "water") //Do like an otter, add acid to water. if (pH <= 2) var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new - s.set_up(/datum/reagent/fermi/fermiAcid, total_volume, pH*10, src) + var/turf/T = get_turf(my_atom) + var/datum/reagents/R = new/datum/reagents(3000)//I don't want to hold it back..! + R.add_reagent("fermiAcid", amount) + for (var/datum/reagent/reagentgas in reagent_list) + R.add_reagent(reagentgas, amount/5) + remove_reagent(reagentgas, amount/5) + s.set_up(R, amount, T) s.start() - remove_any(amount/10) - return - + return FALSE if(!pH) other_pH = D.pH diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 1fb1759865..aa5fbfa596 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -44,49 +44,6 @@ /obj/item/reagent_containers/attack(mob/M, mob/user, def_zone) if(user.a_intent == INTENT_HARM) return ..() -/*Checking to see if I can delete this -/obj/item/reagent_containers/attack(obj/item/W, mob/user, params) - ..() - if(!istype(W, /obj/item/pHpaper)) - return - var/obj/item/pHpaper/P = W - if(P.used == TRUE) - to_chat(user, "[src] has already been used!") - return - switch(src.reagents.pH) - if(14 to INFINITY) - P.color = "#462c83" - if(13 to 14) - P.color = "#63459b" - if(12 to 13) - P.color = "#5a51a2" - if(11 to 12) - P.color = "#3853a4" - if(10 to 11) - P.color = "#3f93cf" - if(9 to 10) - P.color = "#0bb9b7" - if(8 to 9) - P.color = "#23b36e" - if(7 to 8) - P.color = "#3aa651" - if(6 to 7) - P.color = "#4cb849" - if(5 to 6) - P.color = "#b5d335" - if(4 to 5) - P.color = "#b5d333" - if(3 to 4) - P.color = "#f7ec1e" - if(2 to 3) - P.color = "#fbc314" - if(1 to 2) - P.color = "#f26724" - if(-INFINITY to 1) - P.color = "#ef1d26" - P.used = TRUE -*/ - /obj/item/reagent_containers/proc/canconsume(mob/eater, mob/user) if(!iscarbon(eater)) diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index 14ff377523..a31b5394e0 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -16,7 +16,7 @@ var/convert_damage = FALSE //If you want to convert the caster's health to the shift, and vice versa. var/convert_damage_type = BRUTE //Since simplemobs don't have advanced damagetypes, what to convert damage back into. - var/shapeshift_type //Incase I ever get lucky enough to be a wizard. Also why can you be a dog but not a cat!! Racist + var/shapeshift_type //Incase I ever get lucky enough to be a wizard. Also why can you be a dog but not a cat!! I know this isn't fermichem related, but this is really important!!! var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\ /mob/living/simple_animal/pet/cat,\ /mob/living/simple_animal/pet/dog/corgi,\ diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index c4ea994650..ea6e4deca8 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -68,7 +68,7 @@ /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") - moveCalc = 1+((round(B.cached_size) - 9)/10) //Afffects how fast you move, and how often you can click. + moveCalc = 1+((round(B.cached_size) - 9)/5) //Afffects how fast you move, and how often you can click. if(!B) o.remove_movespeed_modifier("megamilk") o.next_move_modifier /= moveCalc @@ -94,7 +94,7 @@ else if (B.breast_values[B.size] < B.breast_values[B.prev_size]) o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) o.next_move_modifier /= moveCalc - if((B.size) < 16) + if((B.cached_size) < 16) switch(round(B.cached_size)) if(9) if (!(B.breast_sizes[B.prev_size] == B.size)) diff --git a/modular_citadel/code/datums/traits/negative.dm b/modular_citadel/code/datums/traits/negative.dm index d999f719a0..b5102f19b9 100644 --- a/modular_citadel/code/datums/traits/negative.dm +++ b/modular_citadel/code/datums/traits/negative.dm @@ -10,7 +10,7 @@ /datum/quirk/Hypno/add() //You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic! - addtimer(CALLBACK(src, /datum/quirk/Hypno.proc/triggered, quirk_holder), rand(1200, 3600))//increase by 10, it's lower so I can test it. + addtimer(CALLBACK(src, /datum/quirk/Hypno.proc/triggered, quirk_holder), rand(120, 360))//increase by 100, it's lower so I can test it. /datum/quirk/Hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. var/mob/living/carbon/human/H = quirk_holder diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index d49447dd8e..823763d898 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -130,7 +130,7 @@ //proc to give a player their genitals and stuff when they log in /mob/living/carbon/human/proc/give_genitals(clean=0)//clean will remove all pre-existing genitals. proc will then give them any genitals that are enabled in their DNA - if ((NOGENITALS in dna.species.species_traits) && (genital_override = FALSE)) + if (NOGENITALS in dna.species.species_traits) return if(clean) var/obj/item/organ/genital/GtoClean @@ -155,7 +155,7 @@ /mob/living/carbon/human/proc/give_penis() if(!dna) return FALSE - if((NOGENITALS in dna.species.species_traits) && (genital_override = FALSE)) + if(NOGENITALS in dna.species.species_traits) return FALSE if(!getorganslot("penis")) var/obj/item/organ/genital/penis/P = new @@ -173,7 +173,7 @@ /mob/living/carbon/human/proc/give_balls() if(!dna) return FALSE - if((NOGENITALS in dna.species.species_traits) && (genital_override = FALSE)) + if(NOGENITALS in dna.species.species_traits) return FALSE if(!getorganslot("testicles")) var/obj/item/organ/genital/testicles/T = new @@ -194,7 +194,7 @@ /mob/living/carbon/human/proc/give_breasts() if(!dna) return FALSE - if((NOGENITALS in dna.species.species_traits) && (genital_override = FALSE)) + if(NOGENITALS in dna.species.species_traits) return FALSE if(!getorganslot("breasts")) var/obj/item/organ/genital/breasts/B = new @@ -217,7 +217,7 @@ /mob/living/carbon/human/proc/give_vagina() if(!dna) return FALSE - if((NOGENITALS in dna.species.species_traits) && (genital_override = FALSE)) + if(NOGENITALS in dna.species.species_traits) return FALSE if(!getorganslot("vagina")) var/obj/item/organ/genital/vagina/V = new @@ -233,7 +233,7 @@ /mob/living/carbon/human/proc/give_womb() if(!dna) return FALSE - if((NOGENITALS in dna.species.species_traits) && (genital_override = FALSE)) + if(NOGENITALS in dna.species.species_traits) return FALSE if(!getorganslot("womb")) var/obj/item/organ/genital/womb/W = new @@ -269,12 +269,22 @@ if(src && !QDELETED(src)) dna.species.handle_genitals(src) +//fermichem procs /mob/living/carbon/human/proc/Force_update_genitals(mob/living/carbon/human/H) //called in fermiChem dna.species.handle_genitals(src) //dna.species.handle_breasts(src) //H.update_body() //species_traits = list(NOTRANSSTING,NOGENITALS) +/mob/living/carbon/human/proc/emergent_genital_call() + var/organCheck = FALSE + for(var/obj/item/organ/O in internal_organs) + if(istype(O, /obj/item/organ/genital)) + organCheck = TRUE + if (organCheck == FALSE) + dna.features["genitals_use_skintone"] = TRUE + dna.species.use_skintones = TRUE + return /datum/species/proc/handle_genitals(mob/living/carbon/human/H) //message_admins("attempting to update sprite") diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 7da4b0c3db..76ac802371 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -64,14 +64,14 @@ //message_admins("Pinas size: [length], [cached_length], [o]") //message_admins("2. size vs prev_size") if (round(length) > round(prev_size)) - to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(length)] inch penis.") + to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "Chase Redtail", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(length)] inch penis.") else if (round(length) < round(prev_size)) - to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(length)] inch penis.") + to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "Chase Redtail", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(length)] inch penis.") prev_size = length icon_state = sanitize_text("penis_[shape]_[size]") //update_body() //P.update_icon() //Either of these don't work, why??? - girth = (length * girth_ratio) + girth = (length * girth_ratio)//Is it just me or is this ludicous, why not make it exponentially decay? //var/mob/living/carbon/human/H = owner //H.update_genitals() //owner.update_genitals() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index f9abd06ab9..571a798957 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -631,6 +631,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING H.genital_override = TRUE var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") if(!B) + H.emergent_genital_call() message_admins("No breasts found on init!") return var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) @@ -735,13 +736,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse //var/mob/living/carbon/human/H -/datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M) +/datum/reagent/fermi/PElarger/on_mob_add(mob/living/carbon/M) . = ..() var/mob/living/carbon/human/H = M H.genital_override = TRUE var/obj/item/organ/genital/penis/P = H.getorganslot("penis") if(!P) message_admins("No penis found on init!") + H.emergent_genital_call() return P.prev_size = P.length P.cached_length = P.length @@ -785,7 +787,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(B) B.cached_size = B.cached_size - 0.1 - message_admins("Breast size: [B.size], [B.cached_size], [holder]") + //message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.update() if(V) V.Remove(M) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index a88c615e11..e26c86a804 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -135,9 +135,9 @@ /datum/chemical_reaction/fermi/BElarger //done name = "Sucubus milk" id = "BElarger" - results = list("BElarger" = 6) + results = list("BElarger" = 0.6) required_reagents = list("salglu_solution" = 0.1, "milk" = 0.5, "synthflesh" = 0.2, "silicon" = 0.2, "aphro" = 0.2) - mix_message = "the reaction gives off a sent of milkshakes!" + mix_message = "the reaction gives off a mist of milk." //FermiChem vars: OptimalTempMin = 200 OptimalTempMax = 800 @@ -169,6 +169,7 @@ id = "PElarger" results = list("PElarger" = 0.3) required_reagents = list("plasma" = 0.1, "stable_plasma" = 0.1, "sugar" = 0.1) + mix_message = "" //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: OptimalTempMin = 200 @@ -226,6 +227,7 @@ required_reagents = list("iron" = 0.1, "iodine" = 0.1) //required_reagents = list("cocoa" = 1, "astral" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1) required_catalysts = list("blood" = 0.1) + mix_message = "the reaction gives off a burgundy plume of smoke!" //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: OptimalTempMin = 780 @@ -265,7 +267,7 @@ E.creatorName = B.data.["real_name"] E.data.["creatorID"] = B.data.["ckey"] E.creatorID = B.data.["ckey"] - message_admins("name: [E.creatorName], ID: [E.creatorID], gender: [E.creatorGender]") + message_admins("MKUltra made name: [E.creatorName], ID: [E.creatorID], gender: [E.creatorGender]") //Apprently works..?Negative /* @@ -293,7 +295,7 @@ s.set_up(R, volume, T) s.start() my_atom.reagents.clear_reagents() - //..() //Please don't kill everyone too. + ..(volume = 0, pH = 7, purity = 1) //Just a lil fire. /datum/chemical_reaction/fermi/hatmium // done name = "Hat growth serum" From 05aaeb4d7088c76c1ef12db1152356a07fefbc3e Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 24 May 2019 06:06:25 +0100 Subject: [PATCH 150/608] Current state --- code/modules/reagents/chemistry/holder.dm | 40 ++++++++++--------- code/modules/reagents/chemistry/reagents.dm | 3 +- code/modules/surgery/organs/vocal_cords.dm | 3 +- .../code/datums/traits/negative.dm | 4 +- .../code/modules/arousal/organs/breasts.dm | 6 ++- .../code/modules/arousal/organs/penis.dm | 2 + .../chemistry/reagents/fermi_reagents.dm | 13 +++--- .../reagents/chemistry/recipes/fermi.dm | 23 +---------- 8 files changed, 42 insertions(+), 52 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index e5fa98e681..fb17b47300 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -345,24 +345,25 @@ im //beaker check proc, /datum/reagents/proc/beaker_check(atom/A) - message_admins("beaker check proc'd") if(istype(A, /obj/item/reagent_containers/glass/beaker/meta)) return - if(istype(A, /obj/item/reagent_containers/glass/beaker/plastic)) + else if(istype(A, /obj/item/reagent_containers/glass/beaker/plastic)) if(chem_temp > 444)//assuming polypropylene - var/list/seen = viewers(5, get_turf(my_atom)) + var/list/seen = viewers(5, get_turf(A)) var/iconhtml = icon2html(A, seen) for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s beak melts from the temperature!") + to_chat(M, "[iconhtml] \The [my_atom]'s melts from the temperature!") + playsound(get_turf(A), 'sound/effects/bubbles.ogg', 80, 1) qdel(A) return - if ((pH < 0.5) || (pH > 13.5))//maybe make it higher? Though..Hmm! - var/list/seen = viewers(5, get_turf(my_atom)) + else if(istype(A, /obj/item/reagent_containers/glass) && ((pH < 0.5) || (pH > 13.5)))//maybe make it higher? Though..Hmm! + var/list/seen = viewers(5, get_turf(A)) var/iconhtml = icon2html(A, seen) for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s beak melts from the extreme pH!") + to_chat(M, "[iconhtml] \The [my_atom]'s melts from the extreme pH!") + playsound(get_turf(A), 'sound/effects/bubbles.ogg', 80, 1) qdel(A) - return + return @@ -379,8 +380,6 @@ im var/reaction_occurred = 0 // checks if reaction, binary variable var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. - beaker_check(my_atom) //Beaker resilience test - do //What does do do in byond? It sounds very redundant? is it a while loop? var/list/possible_reactions = list() //init list reaction_occurred = 0 // sets it back to 0? @@ -650,9 +649,9 @@ im //message_admins("Loop beginning") //Begin Parse - message_admins("Purity precalc: [overallPurity]") + WARNING("Purity precalc: [overallPurity]") update_holder_purity(C)//updates holder's purity - message_admins("Purity postcalc: [overallPurity]") + WARNING("Purity postcalc: [overallPurity]") //Check extremes first if (cached_temp > C.ExplodeTemp) @@ -765,14 +764,15 @@ im return (reactedVol) -/datum/reagents/proc/update_holder_purity(var/datum/chemical_reaction/fermi/C) +/datum/reagents/proc/update_holder_purity(var/datum/chemical_reaction/fermi/C, holder) var/list/cached_reagents = reagent_list var/i var/cachedPurity //var/fermiChem - for(var/reagent in C.required_reagents) - cachedPurity += cached_reagents[reagent].purity - i++ + for(var/datum/reagent/R in my_atom.reagents.reagent_list) + if (R in cached_reagents) + cachedPurity += R.purity + i++ overallPurity = cachedPurity/i /datum/reagents/proc/isolate_reagent(reagent) @@ -879,17 +879,19 @@ im if (D.id == "water") //Do like an otter, add acid to water. if (pH <= 2) - var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new + var/datum/effect_system/smoke_spread/chem/s = new var/turf/T = get_turf(my_atom) - var/datum/reagents/R = new/datum/reagents(3000)//I don't want to hold it back..! + var/datum/reagents/R = new/datum/re agents(3000)//I don't want to hold it back..! R.add_reagent("fermiAcid", amount) for (var/datum/reagent/reagentgas in reagent_list) R.add_reagent(reagentgas, amount/5) remove_reagent(reagentgas, amount/5) - s.set_up(R, amount, T) + s.set_up(R, CLAMP(amount/10, 0, 3), T) s.start() return FALSE + beaker_check(my_atom) //Beaker resilience test + if(!pH) other_pH = D.pH diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 3046649170..40654ae60b 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -35,8 +35,7 @@ var/self_consuming = FALSE //Fermichem vars: var/purity = 1 - var/addProc = FALSE //When this reagent is added to a new beaker, it does something. - //var/ImpureChem = "toxin" + var/addProc = FALSE var/loc = null //Should be the creation location! var/pH = 7 diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 302113c4fb..4d0f7a24e3 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1022,7 +1022,7 @@ var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) - C.Sleeping(30 * power_multiplier) + C.Sleeping(40 * power_multiplier) E.cooldown += 10 //STRIP @@ -1032,7 +1032,6 @@ var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY)//Tier 2 only - E.phase = 1 var/items = H.get_contents() for(var/obj/item/W in items) if(W == H.w_uniform || W == H.wear_suit) diff --git a/modular_citadel/code/datums/traits/negative.dm b/modular_citadel/code/datums/traits/negative.dm index b5102f19b9..45c3b0b6ba 100644 --- a/modular_citadel/code/datums/traits/negative.dm +++ b/modular_citadel/code/datums/traits/negative.dm @@ -10,14 +10,16 @@ /datum/quirk/Hypno/add() //You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic! - addtimer(CALLBACK(src, /datum/quirk/Hypno.proc/triggered, quirk_holder), rand(120, 360))//increase by 100, it's lower so I can test it. + addtimer(CALLBACK(src, /datum/quirk/Hypno.proc/triggered, quirk_holder), rand(12000, 36000))//increase by 100, it's lower so I can test it. /datum/quirk/Hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. var/mob/living/carbon/human/H = quirk_holder var/list/seen = viewers(8, get_turf(H)) + seen - quirk_holder if(LAZYLEN(seen) == 0) to_chat(H, "That object accidentally sets off your implanted trigger, sending you into a hypnotic daze!") else to_chat(H, "[pick(seen)] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") H.apply_status_effect(/datum/status_effect/trance, 200, TRUE) + message_admins("Trance applied") qdel(src) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 820b9cde66..512a98c50b 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -6,7 +6,7 @@ zone = "chest" slot = "breasts" w_class = 3 - size = BREASTS_SIZE_DEF //SHOULD BE A LETTER + size = BREASTS_SIZE_DEF //SHOULD BE A LETTER, starts as a number...??? var/cached_size = null//for enlargement SHOULD BE A NUMBER var/prev_size //For flavour texts SHOULD BE A LETTER var/breast_sizes = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "flat") @@ -26,8 +26,10 @@ reagents.add_reagent(fluid_id, fluid_max_volume) prev_size = size cached_size = breast_values[size] + /* This breaks the character creation sceen. for some reason sizes are set to numbers there. if (cached_size == "c")//fix for a weird bug that has something to do with how they're set up on the character create screen. cached_size = 3 + */ /obj/item/organ/genital/breasts/on_life() if(QDELETED(src)) @@ -93,6 +95,8 @@ prev_size = size return //message_admins("Breast size at start: [size], [cached_size], [owner]") + if(!isnum(cached_size)) + cached_size = breast_values[cached_size] if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!(Why does this runtime??) to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") src.Remove(owner) diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 76ac802371..1af3a5417f 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -23,6 +23,8 @@ /obj/item/organ/genital/penis/Initialize() . = ..() + var/mob/living/carbon/human/o = owner + length = o.dna.features["cock_length"] //for whatever reason, this doesn't set up correctly. prev_size = length cached_length = length diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 571a798957..35f266f80e 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -17,6 +17,7 @@ var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising var/InverseChem = "fermiTox" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. var/DoNotSplit = FALSE // If impurity is handled within the main chem itself + //var/addProc = FALSE //When this reagent is added to a new beaker, it does something. ///datum/reagent/fermi/on_mob_life(mob/living/carbon/M) //current_cycle++ @@ -634,6 +635,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING H.emergent_genital_call() message_admins("No breasts found on init!") return + var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) B.prev_size = B.size B.cached_size = sizeConv[B.size] @@ -740,14 +742,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING . = ..() var/mob/living/carbon/human/H = M H.genital_override = TRUE - var/obj/item/organ/genital/penis/P = H.getorganslot("penis") + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) message_admins("No penis found on init!") H.emergent_genital_call() return P.prev_size = P.length P.cached_length = P.length - message_admins("init P len: [P.length], prev: [P.prev_size], cache = [P.cached_length]") + message_admins("init P len chem: [P.length], prev: [P.prev_size], cache = [P.cached_length]") /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch. var/mob/living/carbon/human/H = M @@ -757,10 +759,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/obj/item/organ/genital/penis/nP = new nP.Insert(M) if(nP) - nP.length = 0.2 + nP.length = 1 to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.")//OwO - nP.cached_length = 0.2 - nP.prev_size = 0.2 + nP.cached_length = 1 + nP.prev_size = 1 M.reagents.remove_reagent(src.id, 5) P = nP @@ -780,7 +782,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") var/obj/item/organ/genital/womb/W = M.getorganslot("womb") - message_admins("PE Breast status: [B]") if(M.gender == FEMALE) M.gender = MALE M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index e26c86a804..d3d8586531 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -58,7 +58,7 @@ if (reagent.purity < 0.6) ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 if(R.reagent_list) - s.set_up(R, (volume/10)*pHmod, T) + s.set_up(R, (volume/10)*pHmod, 10, T) s.start() if(!ImpureTot == 0) ImpureTot *= volume @@ -225,10 +225,9 @@ id = "enthrall" results = list("enthrall" = 0.3) required_reagents = list("iron" = 0.1, "iodine" = 0.1) - //required_reagents = list("cocoa" = 1, "astral" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1) + //required_reagents = list("cocoa" = 0.1, "astral" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) required_catalysts = list("blood" = 0.1) mix_message = "the reaction gives off a burgundy plume of smoke!" - //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: OptimalTempMin = 780 OptimalTempMax = 800 @@ -269,24 +268,6 @@ E.creatorID = B.data.["ckey"] message_admins("MKUltra made name: [E.creatorName], ID: [E.creatorID], gender: [E.creatorGender]") -//Apprently works..?Negative -/* -/datum/chemical_reaction/fermi/enthrall/on_reaction(datum/reagents/holder) - message_admins("On reaction for enthral proc'd") - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list - if (B.data.["gender"] == "female") - E.data.["creatorGender"] = "Mistress" - else - E.data.["creatorGender"] = "Master" - E.data["creatorName"] = B.data.["real_name"] - E.data.["creatorID"] = B.data.["ckey"] - message_admins("name: [E.creatorName], ID: [E.creatorID], gender: [E.creatorGender]") - ..() - - //var/enthrallID = B.get_blood_data() -*/ - /datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) var/turf/T = get_turf(my_atom) var/datum/reagents/R = new/datum/reagents(1000) From faf6585b69ee4096a0a0cdab8a03581668f9a84a Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 25 May 2019 01:04:00 +0100 Subject: [PATCH 151/608] Winding down to the final commits. --- code/__DEFINES/traits.dm | 2 +- code/modules/assembly/flash.dm | 48 ++++ code/modules/reagents/chemistry/holder.dm | 26 ++- .../chemistry/reagents/other_reagents.dm | 1 + code/modules/surgery/organs/vocal_cords.dm | 86 +++++-- code/modules/uplink/uplink_items.dm | 9 +- .../code/datums/status_effects/chems.dm | 61 +++-- .../code/datums/traits/negative.dm | 3 +- .../code/datums/traits/positive.dm | 1 + .../code/modules/arousal/organs/breasts.dm | 7 +- .../code/modules/arousal/organs/penis.dm | 26 ++- .../chemistry/reagents/fermi_reagents.dm | 101 ++++++--- .../reagents/chemistry/recipes/fermi.dm | 214 +++++++++++------- 13 files changed, 401 insertions(+), 184 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 4fad011772..2aefd5edd7 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -73,7 +73,7 @@ #define TRAIT_MUSICIAN "musician" #define TRAIT_CROCRIN_IMMUNE "crocin_immune" #define TRAIT_NYMPHO "nymphomania" -#define TRAIT_HIGH_BLOOD "high_blood" +#define TRAIT_HIGH_BLOOD "high_blood" // common trait sources #define TRAIT_GENERIC "generic" diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index ad83ed8c13..7c7edda742 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -313,3 +313,51 @@ /obj/item/assembly/flash/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) activate() return ..() + +//ported from tg - check to make sure it can't appear where it's not supposed to. +/obj/item/assembly/flash/hypnotic + desc = "A modified flash device, programmed to emit a sequence of subliminal flashes that can send a vulnerable target into a hypnotic trance." + //flashing_overlay = "flash-hypno" doesn't seem to be in citcode yet. + light_color = LIGHT_COLOR_PINK + cooldown = 20 + +/obj/item/assembly/flash/hypnotic/burn_out() + return + +/obj/item/assembly/flash/hypnotic/flash_carbon(mob/living/carbon/M, mob/user, power = 15, targeted = TRUE, generic_message = FALSE) + if(!istype(M)) + return + if(user) + log_combat(user, M, "[targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]", src) + else //caused by emp/remote signal + M.log_message("was [targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]",LOG_ATTACK) + if(generic_message && M != user) + to_chat(M, "[src] emits a soothing light...") + if(targeted) + if(M.flash_act(1, 1)) + var/hypnosis = FALSE + if(M.hypnosis_vulnerable()) + hypnosis = TRUE + if(user) + user.visible_message("[user] blinds [M] with the flash!", "You hypno-flash [M]!") + + if(!hypnosis) + to_chat(M, "The light makes you feel oddly relaxed...") + M.confused += min(M.confused + 10, 20) + M.dizziness += min(M.dizziness + 10, 20) + M.drowsyness += min(M.drowsyness + 10, 20) + //M.apply_status_effect(STATUS_EFFECT_PACIFY, 100) for when we port apply_status_effect pacifist (maybe I'll do it) + else + M.apply_status_effect(/datum/status_effect/trance, 200, TRUE) + + else if(user) + user.visible_message("[user] fails to blind [M] with the flash!", "You fail to hypno-flash [M]!") + else + to_chat(M, "[src] fails to blind you!") + + else if(M.flash_act()) + to_chat(M, "Such a pretty light...") + M.confused += min(M.confused + 4, 20) + M.dizziness += min(M.dizziness + 4, 20) + M.drowsyness += min(M.drowsyness + 4, 20) + //M.apply_status_effect(STATUS_EFFECT_PACIFY, 40) for when we port apply_status_effect pacifist (maybe I'll do it) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index fb17b47300..30219cc2c2 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -566,6 +566,7 @@ im //message_admins("updating targetVol from [targetVol]") for(var/B in cached_required_reagents) // multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) + multiplier*=10 if (multiplier == 0) STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE @@ -646,12 +647,12 @@ im var/purity = 1 //var/tempVol = totalVol - //message_admins("Loop beginning") + message_admins("multiplier [multiplier], target vol:[targetVol], rate lim: [C.RateUpLim], reactedVol: [reactedVol]") //Begin Parse - WARNING("Purity precalc: [overallPurity]") - update_holder_purity(C)//updates holder's purity - WARNING("Purity postcalc: [overallPurity]") + //WARNING("Purity precalc: [overallPurity]") + //update_holder_purity(C)//updates holder's purity + //WARNING("Purity postcalc: [overallPurity]") //Check extremes first if (cached_temp > C.ExplodeTemp) @@ -709,8 +710,7 @@ im deltaT = 0 //message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") - - stepChemAmmount = deltaT //used to have multipler, now it doesn't + stepChemAmmount = CLAMP((deltaT * C.RateUpLim), 0, (targetVol - reactedVol)) //used to have multipler, now it doesn't if (stepChemAmmount > C.RateUpLim) stepChemAmmount = C.RateUpLim else if (stepChemAmmount <= 0.01) @@ -728,7 +728,7 @@ im //TODO: Check overall beaker purity with proc //Then adjust purity of result AND yeild ammount with said purity. - stepChemAmmount *= overallPurity + stepChemAmmount *= reactant_purity(C) // End. /* @@ -764,7 +764,7 @@ im return (reactedVol) -/datum/reagents/proc/update_holder_purity(var/datum/chemical_reaction/fermi/C, holder) +/datum/reagents/proc/reactant_purity(var/datum/chemical_reaction/fermi/C, holder) var/list/cached_reagents = reagent_list var/i var/cachedPurity @@ -773,7 +773,7 @@ im if (R in cached_reagents) cachedPurity += R.purity i++ - overallPurity = cachedPurity/i + return cachedPurity/i /datum/reagents/proc/isolate_reagent(reagent) var/list/cached_reagents = reagent_list @@ -881,12 +881,12 @@ im if (pH <= 2) var/datum/effect_system/smoke_spread/chem/s = new var/turf/T = get_turf(my_atom) - var/datum/reagents/R = new/datum/re agents(3000)//I don't want to hold it back..! + var/datum/reagents/R = new/datum/reagents(3000)//I don't want to hold it back..! R.add_reagent("fermiAcid", amount) for (var/datum/reagent/reagentgas in reagent_list) R.add_reagent(reagentgas, amount/5) remove_reagent(reagentgas, amount/5) - s.set_up(R, CLAMP(amount/10, 0, 3), T) + s.set_up(R, CLAMP(amount/10, 0, 1), T) s.start() return FALSE @@ -937,6 +937,10 @@ im //if(R.FermiChem == TRUE) // R.on_mob_add(my_atom) R.on_merge(data, amount, my_atom, other_purity) + if(istype(D, /datum/reagent/fermi))//Is this a fermichem? + var/datum/reagent/fermi/Ferm = D //It's Fermi time! + if(Ferm.OnMobMergeCheck == TRUE) //// Ooooooh fermifermifermi + R.on_mob_add(my_atom, amount) if(!no_react) handle_reactions() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index e77dd42a38..c0255224f3 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1930,6 +1930,7 @@ if(prob(20)) to_chat(M, "You find yourself unable to supress the desire to meow!") M.emote("nya") + ..() //Kept for legacy, I think it will break everything if you enable it. /datum/reagent/penis_enlargement diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 4d0f7a24e3..014b13cbb9 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -717,21 +717,21 @@ if(user.mind) //Chaplains are very good at indoctrinating if(user.mind.assigned_role == "Chaplain") - power_multiplier *= 2 + power_multiplier *= 1.2 //Command staff has authority if(user.mind.assigned_role in GLOB.command_positions) - power_multiplier *= 1.4 + power_multiplier *= 1.1 //Why are you speaking if(user.mind.assigned_role == "Mime") power_multiplier *= 0.5 //Cultists are closer to their gods and are better at indoctrinating if(iscultist(user)) - power_multiplier *= 2 + power_multiplier *= 1.2 else if (is_servant_of_ratvar(user)) - power_multiplier *= 2 + power_multiplier *= 1.2 else if (is_devil(user))//The devil is supposed to be seductive, right? - power_multiplier *= 2 + power_multiplier *= 1.2 //range = 0.5 - 4.2~ //most cases = 1-2 @@ -854,10 +854,16 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] has praised me!!"), 5) if(L.has_trait(TRAIT_NYMPHO)) L.adjustArousalLoss(2*power_multiplier) + /* TODO: ADD THIS IN WHEN MASO IS MERGED + if(L.has_trait(TRAIT_MASO)) + E.enthrallTally -= power_multiplier + E.resistanceTally += power_multiplier + E.cooldown += 1 + */ else addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've been praised for doing a good job!"), 5) E.resistanceTally -= power_multiplier - E.enthrallTally += 1 + E.enthrallTally += power_multiplier var/descmessage = "[(L.lewd?"I feel so happy! I'm a good pet who [E.enthrallGender] loves!":"I did a good job!")]" SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise, descmessage) E.cooldown += 1 @@ -867,18 +873,25 @@ for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) - power_multiplier *= distancelist[get_dist(user, V)+1] + //power_multiplier *= distancelist[get_dist(user, V)+1] //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values + var/descmessage = "[(L.lewd?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]" if (L.lewd) - E.resistanceTally /= 1*power_multiplier addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've let [E.enthrallGender] down..."), 5) + /* TODO: ADD THIS IN WHEN MASO IS MERGED + if(L.has_trait(TRAIT_MASO)) + L.adjustArousalLoss(3*power_multiplier) + descmessage += " And yet, it feels good..!" + E.enthrallTally += power_multiplier + E.resistanceTally -= power_multiplier + E.cooldown += 1 + */ else addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've failed [E.master]..."), 5) - - var/descmessage = "[(L.lewd?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]" - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold, descmessage) - E.resistanceTally += 1 + E.cooldown += 1 + E.resistanceTally += power_multiplier E.enthrallTally += power_multiplier + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold, descmessage) E.cooldown += 1 //teir 0 @@ -891,7 +904,7 @@ if(C.lewd) addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.enthrallGender]"), 5) else - addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.master]"), 5)//The least lewdest I could think of + addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.master]"), 5) //WAKE UP else if((findtext(message, wakeup_words))) @@ -938,7 +951,7 @@ var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) E.status = "Antiresist" E.statusStrength = (1 * power_multiplier * E.phase) - E.cooldown += 6//Too short? + E.cooldown += 15//Too short? yes, made 15 //RESIST else if((findtext(message, resist_words))) @@ -993,6 +1006,9 @@ E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). E.enthrallTally += power_multiplier E.cooldown += 6 + else + H.throw_at(get_step_towards(user,H), 3 * power_multiplier, 1 * power_multiplier) + //awoo @@ -1022,7 +1038,7 @@ var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) - C.Sleeping(40 * power_multiplier) + C.Sleeping(45 * power_multiplier) E.cooldown += 10 //STRIP @@ -1039,7 +1055,7 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Before you can even think about it, you quickly remove your clothes in response to [(H.lewd?"your [E.enthrallGender]'s command'":"[E.master]'s directive'")]."), 5) E.cooldown += 10 - //WALK doesn't work? + //WALK doesn't work? it does, randomly, work now else if((findtext(message, walk_words))) for(var/V in listeners) var/mob/living/L = V @@ -1061,13 +1077,24 @@ L.toggle_move_intent() E.cooldown += 1 + //LIE DOWN + else if(findtext(message, liedown_words)) + for(var/V in listeners) + var/mob/living/L = V + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) + switch(E.phase) + if(2 to INFINITY)//Tier 2 only + L.lay_down() + E.cooldown += 10 + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You suddenly lie down!'"), 5) + //KNOCKDOWN else if(findtext(message, knockdown_words)) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) - if(3 to INFINITY)//Tier 2 only + if(2 to INFINITY)//Tier 2 only L.Knockdown(30 * power_multiplier * E.phase) E.cooldown += 8 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You suddenly drop to the ground!'"), 5) @@ -1080,7 +1107,7 @@ var/speaktrigger = "" var/mob/living/carbon/C = V var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) - if (E.phase > 3) + if (E.phase > 2) for (var/trigger in E.customTriggers) speaktrigger += "[trigger], " C.add_trait(TRAIT_DEAF, "Triggers") //So you don't trigger yourself! @@ -1099,6 +1126,8 @@ return else user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") + user.SetStun(1000)//Hands are handy, so you have to stay still + H.SetStun(1000) if (E.mental_capacity >= 10) var/trigger = stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN) var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) @@ -1107,14 +1136,18 @@ if (trigger2 == "speak" || trigger2 == "echo") var/trigger3 = stripped_input(user, "Enter the phrase spoken.", MAX_MESSAGE_LEN) E.customTriggers[trigger] = list(trigger2, trigger3) + message_admins("[H] has been implanted by [user] with [trigger], triggering [trigger2], to send [trigger3].") else E.customTriggers[trigger] = trigger2 + message_admins("[H] has been implanted by [user] with [trigger], triggering [trigger2].") E.mental_capacity -= 10 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.lewd?"your [E.enthrallGender]":"[E.master]")] whispers you a new trigger."), 5) else to_chat(user, "Your pet looks at you confused, it seems they don't understand that effect!") else to_chat(user, "Your pet looks at you with a vacant blase expression, you don't think you can program anything else into them") + user.SetStun(0) + H.SetStun(0) //CUSTOM OBJECTIVE else if((findtext(message, objective_words))) @@ -1127,6 +1160,8 @@ return else user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") + user.SetStun(1000)//So you can't run away! + H.SetStun(1000) if (E.mental_capacity >= 250 || message == "objective") var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", MAX_MESSAGE_LEN) if(!LAZYLEN(objective)) @@ -1137,12 +1172,16 @@ objective = replacetext(lowertext(objective), "harm", "snuggle") objective = replacetext(lowertext(objective), "decapitate", "headpat") objective = replacetext(lowertext(objective), "strangle", "meow at") - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.lewd?"your [E.enthrallGender]":"[E.master]")] whispers you a new objective."), 5) + objective = replacetext(lowertext(objective), "suicide", "self-love") + message_admins("[H] has been implanted by [user] with the objective [objective].") + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.lewd?"Your [E.enthrallGender]":"[E.master]")] whispers you a new objective."), 5) brainwash(H, objective) - E.mental_capacity -= 250 + E.mental_capacity -= 200 //else if (E.mental_capacity >= 150) else to_chat(user, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") + user.SetStun(0) + H.SetStun(0) //RECOGNISE @@ -1168,7 +1207,7 @@ E.statusStrength = (5 * power_multiplier) E.cooldown += 5 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You begin to lick your wounds."), 5) - L.Stun(40) + L.Stun(5 * power_multiplier) //STUN else if(findtext(message, stun_words)) @@ -1197,7 +1236,7 @@ var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only - L.adjust_bodytemperature(10 * power_multiplier)//This seems nuts, reduced it + L.adjust_bodytemperature(50 * power_multiplier)//This seems nuts, reduced it, but then it didn't do anything, so I reverted it. addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You feel your metabolism speed up!"), 5) //COLD @@ -1207,7 +1246,7 @@ var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only - L.adjust_bodytemperature(-10 * power_multiplier)//This + L.adjust_bodytemperature(-50 * power_multiplier)//This addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You feel your metabolism slow down!"), 5) @@ -1243,6 +1282,7 @@ var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only + E.statusStrength = 2* power_multiplier E.status = "charge" E.cooldown += 10 diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index af2c625670..c2249efd42 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1504,7 +1504,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 15 restricted_roles = list("Clown") -/datum/uplink_item/device_tools/honkpins //Idealy so they can place it into their own guns without needing cargo +/datum/uplink_item/device_tools/honkpins //Idealy so they can place it into their own guns without needing cargo name = "Hilarious firing pin" desc = "A single firing pin made for Clown agents, this firing pin makes any gun honk when fired if not a true clown! \ This firing pin also helps you fire the gun correctly. May the HonkMother HONK you agent." @@ -1552,6 +1552,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate cost = 2 +//ported from tg as is along with functions, feel free to edit/remove +/datum/uplink_item/device_tools/hypnotic_flash + name = "Hypnotic Flash" + desc = "A modified flash able to hypnotize targets. If the target is not in a mentally vulnerable state, it will only confuse and pacify them temporarily." + item = /obj/item/assembly/flash/hypnotic + cost = 7 + /datum/uplink_item/badass/balloon name = "Syndicate Balloon" desc = "For showing that you are THE BOSS: A useless red balloon with the Syndicate logo on it. \ diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index ea6e4deca8..8a40f9ba66 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -212,6 +212,9 @@ var/cooldown = 0 var/cooldownMsg = TRUE var/cTriggered = FALSE + var/resistGrowth = 0 + var/DistApart = 1 + var/tranceTime = 0 /datum/status_effect/chem/enthrall/on_apply() var/mob/living/carbon/M = owner @@ -273,7 +276,7 @@ if(0)// sleeper agent return if(1)//Initial enthrallment - if (enthrallTally > 100) + if (enthrallTally > 150) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. resistanceTally /= 2 @@ -282,7 +285,7 @@ to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") else - else if (resistanceTally > 100) + else if (resistanceTally > 150) enthrallTally *= 0.5 phase = -1 resistanceTally = 0 @@ -293,7 +296,7 @@ if(owner.lewd) to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") if (2) //partially enthralled - if (enthrallTally > 150) + if (enthrallTally > 200) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 @@ -303,8 +306,8 @@ to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. else to_chat(owner, "You are unable to put up a resistance any longer, and now are under the control of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [master] in death. ") - owner.add_trait(TRAIT_PACIFISM, "MKUltra") - else if (resistanceTally > 150) + owner.add_trait(TRAIT_PACIFISM, "MKUltra") //IMPORTANT + else if (resistanceTally > 200) enthrallTally *= 0.5 phase -= 1 resistanceTally = 0 @@ -336,7 +339,8 @@ //distance calculations - switch(get_dist(master, owner)) + DistApart = get_dist(master, owner) + switch(DistApart) if(0 to 8)//If the enchanter is within range, increase enthrallTally, remove withdrawal subproc and undo withdrawal effects. if(phase <= 2) enthrallTally += distancelist[get_dist(master, owner)+1] @@ -438,7 +442,7 @@ withdrawalTick += 0.5 //Status subproc - statuses given to you from your Master - //currently 3 statuses; antiresist -if you press resist, increases your enthrallment instead, HEAL - which slowly heals the pet, CHARGE - which breifly increases speed, PACIFY - makes pet a pacifist. + //currently 3 statuses; antiresist -if you press resist, increases your enthrallment instead, HEAL - which slowly heals the pet, CHARGE - which breifly increases speed, PACIFY - makes pet a pacifist, ANTIRESIST - frustrates resist presses. if (status) if(status == "Antiresist") @@ -497,6 +501,10 @@ to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") cooldownMsg = TRUE cooldown = 0 + if (tranceTime > 0) //custom trances only last 50 ticks. + tranceTime -= 1 + else + M.remove_status_effect(/datum/status_effect/trance) //..() //Remove all stuff @@ -572,8 +580,7 @@ //kneel (knockdown) else if (lowertext(customTriggers[trigger]) == "kneel")//as close to kneeling as you can get, I suppose. to_chat(owner, "You drop to the ground unsurreptitiously.") - C.resting = 1 - C.lying = 1 + C.lay_down() //strip (some) clothes else if (lowertext(customTriggers[trigger]) == "strip")//This wasn't meant to just be a lewd thing oops, is this pref breaking? @@ -585,9 +592,10 @@ to_chat(owner,"You feel compelled to strip your clothes.") //trance - else if (lowertext(customTriggers[trigger]) == "trance")//Maaaybe too strong. + else if (lowertext(customTriggers[trigger]) == "trance")//Maaaybe too strong. Weakened it, only lasts 50 ticks. var/mob/living/carbon/human/o = owner o.apply_status_effect(/datum/status_effect/trance, 200, TRUE) + tranceTime = 50 //add more fun stuff! @@ -601,7 +609,8 @@ var/mob/living/carbon/M = owner to_chat(owner, "You attempt to fight against against [(owner.lewd?"[enthrallGender]":"[master]")]'s influence!'") message_admins("Enthrall processing for [M]: enthrallTally: [enthrallTally], resistanceTally: [resistanceTally]") - //message_admins("[M] is trying to resist!") + + //Able to resist checks if (status == "Sleeper" || phase == 0) return else if (phase == 4) @@ -627,21 +636,33 @@ return else status = null + + //base resistance if (deltaResist != 0)//So you can't spam it, you get one deltaResistance per tick. deltaResist += 0.1 //Though I commend your spamming efforts. return else - deltaResist = 1 + deltaResist = 2 + resistGrowth + resistGrowth += 0.1 + + //distance modifer + switch(DistApart) + if(0) + deltaResist *= 0.8 + if(1 to 8)//If they're far away, increase resistance. + deltaResist *= (1+(DistApart/10)) + if(9 to INFINITY)//If + deltaResist *= 2 + if(prob(5)) M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes deltaResist *= 1.5 to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") - //base resistance + //nymphomania if (M.canbearoused && M.has_trait(TRAIT_NYMPHO))//I'm okay with this being removed. deltaResist*= ((100 - M.arousalloss/100)/100)//more aroused you are, the weaker resistance you can give - //else - // deltaResist *= 0.5 + //chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist. if (owner.reagents.has_reagent("mannitol")) deltaResist *= 1.25 @@ -681,11 +702,11 @@ //Happiness resistance //Your Thralls are like pets, you need to keep them happy. - if(owner.nutrition < 250) - deltaResist += (250-owner.nutrition)/100 + if(owner.nutrition < 300) + deltaResist += (300-owner.nutrition)/6 if(owner.health < 100)//Harming your thrall will make them rebel harder. deltaResist *= ((120-owner.health)/100)+1 - //if() + //if(owner.mood.mood) //datum/component/mood TO ADD in FERMICHEM 2 //Add cold/hot, oxygen, sanity, happiness? (happiness might be moot, since the mood effects are so strong) //Mental health could play a role too in the other direction @@ -695,9 +716,11 @@ if(M.has_trait(TRAIT_MINDSHIELD)) deltaResist += 5//even faster! + /* if (deltaResist>0)//just in case deltaResist /= phase//later phases require more resistance - message_admins("[M] is trying to resist with a delta of [deltaResist]!") + */ + message_admins("Enthrall processing for [M]: enthrallTally: [enthrallTally], resistanceTally: [resistanceTally], delta: [deltaResist]") return //I think this can be left out, but I'll leave the code incase anyone wants to add to it. diff --git a/modular_citadel/code/datums/traits/negative.dm b/modular_citadel/code/datums/traits/negative.dm index 45c3b0b6ba..796c4529e2 100644 --- a/modular_citadel/code/datums/traits/negative.dm +++ b/modular_citadel/code/datums/traits/negative.dm @@ -12,10 +12,11 @@ //You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic! addtimer(CALLBACK(src, /datum/quirk/Hypno.proc/triggered, quirk_holder), rand(12000, 36000))//increase by 100, it's lower so I can test it. +//DOES NOT give any indication when someone is triggered - this is intentional so people don't abuse it, you're supposed to get a random thing said to you as a mini objective. /datum/quirk/Hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. var/mob/living/carbon/human/H = quirk_holder var/list/seen = viewers(8, get_turf(H)) - seen - quirk_holder + seen -= quirk_holder if(LAZYLEN(seen) == 0) to_chat(H, "That object accidentally sets off your implanted trigger, sending you into a hypnotic daze!") else diff --git a/modular_citadel/code/datums/traits/positive.dm b/modular_citadel/code/datums/traits/positive.dm index a48a4a82bf..a0a8f2b020 100644 --- a/modular_citadel/code/datums/traits/positive.dm +++ b/modular_citadel/code/datums/traits/positive.dm @@ -11,3 +11,4 @@ /datum/quirk/BloodPressure/add() var/mob/living/M = quirk_holder M.blood_ratio = 1.2 + M.blood_volume += 100 diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 512a98c50b..35f7a23568 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -24,8 +24,8 @@ /obj/item/organ/genital/breasts/Initialize() . = ..() reagents.add_reagent(fluid_id, fluid_max_volume) - prev_size = size - cached_size = breast_values[size] + //prev_size = size + //cached_size = breast_values[size] /* This breaks the character creation sceen. for some reason sizes are set to numbers there. if (cached_size == "c")//fix for a weird bug that has something to do with how they're set up on the character create screen. cached_size = 3 @@ -56,7 +56,7 @@ else desc = "You see some breasts, they seem to be quite exotic." if(isnum(size)) - desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "two big old tonhongerekoogers", "a couple of giant bonkhonagahoogs", "a pair of humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [size]cm in diameter." + desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "two big old tonhongerekoogers", "a couple of giant bonkhonagahoogs", "a pair of humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [round(size)]cm in diameter." else if (!isnum(size)) if (size == "flat") desc += " They're very small and flatchested, however." @@ -93,6 +93,7 @@ //var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") if (cached_size == null) prev_size = size + cached_size = breast_values[size] return //message_admins("Breast size at start: [size], [cached_size], [owner]") if(!isnum(cached_size)) diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 1af3a5417f..409d27aace 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -23,13 +23,18 @@ /obj/item/organ/genital/penis/Initialize() . = ..() + /* I hate genitals. var/mob/living/carbon/human/o = owner length = o.dna.features["cock_length"] //for whatever reason, this doesn't set up correctly. prev_size = length cached_length = length + */ /obj/item/organ/genital/penis/update_size() var/mob/living/carbon/human/o = owner + if(!cached_length) + prev_size = length + cached_length = length if(cached_length < 0)//I don't actually know what round() does to negative numbers, so to be safe!! var/obj/item/organ/genital/penis/P = o.getorganslot("penis") to_chat(o, "You feel your tallywacker shrinking away from your body as your groin flattens out!") @@ -42,23 +47,30 @@ //message_admins("Attempting to remove.") o.remove_status_effect(/datum/status_effect/chem/PElarger) statuscheck = FALSE - if(5 to 8) //If modest size + if(5 to 10) //If modest size length = cached_length size = 2 if(statuscheck == TRUE) //message_admins("Attempting to remove.") o.remove_status_effect(/datum/status_effect/chem/PElarger) statuscheck = FALSE - if(9 to INFINITY) //If massive + if(11 to 20) //If massive length = cached_length - size = 3 //no new sprites for anything larger yet + size = 3 if(statuscheck == FALSE) //message_admins("Attempting to apply.") o.remove_status_effect(/datum/status_effect/chem/PElarger) statuscheck = TRUE - if(15 to INFINITY) + if(21 to 29) length = cached_length - size = 3 //no new sprites for anything larger yet + size = 3 + if(statuscheck == FALSE) + //message_admins("Attempting to apply.") + o.apply_status_effect(/datum/status_effect/chem/PElarger) + statuscheck = TRUE + if(30 to INFINITY) + length = cached_length + size = 4 //no new sprites for anything larger yet if(statuscheck == FALSE) //message_admins("Attempting to apply.") o.apply_status_effect(/datum/status_effect/chem/PElarger) @@ -66,9 +78,9 @@ //message_admins("Pinas size: [length], [cached_length], [o]") //message_admins("2. size vs prev_size") if (round(length) > round(prev_size)) - to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "Chase Redtail", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(length)] inch penis.") + to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "Chase Redtail", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.") else if (round(length) < round(prev_size)) - to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "Chase Redtail", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(length)] inch penis.") + to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "Chase Redtail", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.") prev_size = length icon_state = sanitize_text("penis_[shape]_[size]") //update_body() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 35f266f80e..97660590b4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -17,6 +17,7 @@ var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising var/InverseChem = "fermiTox" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. var/DoNotSplit = FALSE // If impurity is handled within the main chem itself + var/OnMobMergeCheck = FALSE //var/addProc = FALSE //When this reagent is added to a new beaker, it does something. ///datum/reagent/fermi/on_mob_life(mob/living/carbon/M) @@ -130,6 +131,7 @@ var/mob/living/fermi_Tclone = null var/teleBool = FALSE mob/living/carbon/purgeBody + pH = 3.7 /* /datum/reagent/fermi/eigenstate/on_new() @@ -1084,26 +1086,29 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y color = "#2C051A" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. - DoNotSplit = TRUE + InverseChemVal = 0.5 + InverseChem = "enthrallInverse" //At really impure vols, it just becomes 100% inverse + //DoNotSplit = TRUE data = list("creatorID" = null, "creatorGender" = null, "creatorName" = null) var/creatorID //ckey var/creatorGender var/creatorName var/mob/living/creator pH = 10 + OnMobMergeCheck = TRUE //Procs on_mob_add when merging into a human /datum/reagent/fermi/enthrall/test name = "MKUltraTest" id = "enthrallTest" - description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." + description = "A forbidden deep red mixture that overwhelms a foreign body with waves of joy, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." color = "#2C051A" // rgb: , 0, 255 //ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth - //InverseChemVal = 0.25 + //InverseChemVal = 0.5 //InverseChem = "enthrall" //At really impure vols, it just becomes 100% inverse data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Isabelle Foster") creatorID = "honkatonkbramblesnatch"//ckey creatorGender = "Mistress" - creatorName = "Isabelle Foster" + creatorName = "Fermis Yakumo" purity = 1 /datum/reagent/fermi/enthrall/test/on_new() @@ -1128,12 +1133,15 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y creatorName = B.data.["real_name"] creatorID = B.data.["ckey"] */ - +//FERMICHEM2 split into different chems /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) . = ..() if(!creatorID) message_admins("Something went wrong in enthral creation THIS SHOULD NOT APPEAR") return + var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + if(E) + return message_admins("key: [M.ckey] vs [creatorID], ") if(purity < 0.5)//Impure chems don't function as you expect return @@ -1157,33 +1165,17 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) - if(purity < 0.5)//Placeholder for now. I'd like to get this done. - if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. - if(M.has_status_effect(STATUS_EFFECT_INLOVE)) - return - var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers - for(var/victim in seen) - if((victim == /mob/living/simple_animal/pet/) || (victim == M)) - seen = seen - victim - if(!seen) - return - M.reagents.remove_reagent(src.id, src.volume) - FallInLove(M, pick(seen)) - return - else // If someone else drinks it, the creator falls in love with them! - var/mob/living/carbon/C = get_mob_by_key(creatorID) - if(C.has_status_effect(STATUS_EFFECT_INLOVE)) - return - if(C in viewers(7, get_turf(M))) - M.reagents.remove_reagent(src.id, src.volume) - FallInLove(C, M) - return if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it does nothing. return + if(!M.client) + metabolization_rate = 0 //Stops powergamers from quitting to avoid affects. + return + if(metabolization_rate == 0) + metabolization_rate = 0.5 var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)//If purity is over 5, works as intended if(!E) - M.reagents.remove_reagent(src.id, 10) - M.apply_status_effect(/datum/status_effect/chem/enthrall) + M.reagents.remove_reagent(src.id, 1) + //M.apply_status_effect(/datum/status_effect/chem/enthrall) message_admins("No enthrall status found in [M]!") else E.enthrallTally += 1 @@ -1193,7 +1185,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I have no idea what happens if you OD yourself honestly. I made it so the creator is set to gain the status for someone random. . = ..() - if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 150u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.) + if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 100u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.) var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers for(var/mob/living/carbon/victim in seen) if(victim == M)//as much as I want you to fall for beepsky, he doesn't have a ckey @@ -1229,6 +1221,39 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y M.adjustBrainLoss(0.1)//should be 15 in total ..() +/datum/reagent/fermi/enthrall/Inverse + name = "MKUltra" + id = "enthrall" + description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." + color = "#2C051A" // rgb: , 0, 255 + taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" + DoNotSplit = TRUE + +/datum/reagent/fermi/enthrall/Inverse/on_mob_life(mob/living/carbon/M) + if(purity < 0.5)//Placeholder for now. I'd like to get this done. + if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. + if(M.has_status_effect(STATUS_EFFECT_INLOVE)) + return + var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers + for(var/victim in seen) + if((victim == /mob/living/simple_animal/pet/) || (victim == M)) + seen = seen - victim + if(!seen) + return + M.reagents.remove_reagent(src.id, src.volume) + FallInLove(M, pick(seen)) + return + else // If someone else drinks it, the creator falls in love with them! + var/mob/living/carbon/C = get_mob_by_key(creatorID) + if(C.has_status_effect(STATUS_EFFECT_INLOVE)) + return + if(C in viewers(7, get_turf(M))) + M.reagents.remove_reagent(src.id, src.volume) + FallInLove(C, M) + return + if(volume < 1)//You don't get to escape that easily + FallInLove(pick(GLOB.player_list), M) + //Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system. /datum/reagent/fermi/enthrallExplo//Created in a gas cloud when it explodes name = "MKUltra" @@ -1236,7 +1261,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." color = "#2C051A" // rgb: , 0, 255 metabolization_rate = 0.1 - taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" + taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses." + DoNotSplit = TRUE var/mob/living/carbon/love /datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system. @@ -1274,7 +1300,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") ..() -/datum/reagent/fermi/enthrall/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love) +/datum/reagent/fermi/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love) if(Lover.has_status_effect(STATUS_EFFECT_INLOVE)) to_chat(Lover, "You are already fully devoted to someone else!") return @@ -1462,11 +1488,12 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y name = "Acid vapour" id = "fermiAcid" description = "Someone didn't do like an otter, and add acid to water." + taste_description = "acid burns, ow!!" pH = 0 /datum/reagent/fermi/fermiAcid/on_mob_life(mob/living/carbon/C, method) var/target = C.get_bodypart(BODY_ZONE_CHEST) - var/acidstr = (5-C.reagents.pH) + var/acidstr = ((5-C.reagents.pH)*2) C.adjustFireLoss(acidstr, 0) if(method==VAPOR) if(prob(20)) @@ -1545,10 +1572,13 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y name = "Acidic buffer"//defined on setup id = "fermiABuffer" description = "This reagent will consume itself and move the pH of a beaker towards 3 when added to another." - addProc = TRUE + taste_description = "an acidy sort of taste, blech." + addProc = FALSE pH = 3 /datum/reagent/fermi/fermiABuffer/on_new() + if(addProc == FALSE)//This is so it doesn't react when made. + addProc = TRUE if(LAZYLEN(holder.reagent_list) == 1) return pH = ((holder.pH * holder.total_volume)+(3 * src.volume))/(holder.total_volume + src.volume) @@ -1559,10 +1589,13 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y name = "Basic buffer"//defined on setup id = "fermiBBuffer" description = "This reagent will consume itself and move the pH of a beaker towards 11 when added to another." - addProc = TRUE + taste_description = "an soapy sort of taste, blech." + addProc = FALSE pH = 11 /datum/reagent/fermi/fermiBBuffer/on_new() + if(addProc == FALSE)//This is so it doesn't react when made. + addProc = TRUE if(LAZYLEN(holder.reagent_list) == 1) return pH = ((holder.pH * holder.total_volume)+(11 * src.volume))/(holder.total_volume + src.volume) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index d3d8586531..bafe35c92c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -1,7 +1,7 @@ //TO TWEAK: /datum/chemical_reaction/fermi - mix_sound = 'modular_citadel/sound/voice/merowr.ogg' + mix_sound = 'sound/effects/bubbles.ogg' //Called for every reaction step /datum/chemical_reaction/fermi/proc/FermiCreate(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? @@ -22,6 +22,24 @@ var/ImpureTot = 0 var/pHmod = 1 var/turf/T = get_turf(my_atom) + + var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case. + var/datum/effect_system/smoke_spread/chem/s = new() + if(pH < 4) //if acidic, make acid spray + //s.set_up(/datum/reagent/fermi/fermiAcid, (volume/3), pH*10, T) + R.add_reagent("fermiAcid", ((volume/3)/pH)) + pHmod = 2 + + for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents + if (istype(reagent, /datum/reagent/fermi)) + continue //Don't allow fermichems into the mix (fermi explosions are handled elsewhere and it's a huge pain) + R.add_reagent(reagent, reagent.volume) + if (reagent.purity < 0.6) + ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 + if(R.reagent_list) + s.set_up(R, (volume/10)*pHmod, 10, T) + s.start() + if(temp>500)//if hot, start a fire switch(temp) if (500 to 750) @@ -37,32 +55,16 @@ new /obj/effect/hotspot(turf) //volume /= 5 - //var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new - var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case. - var/datum/effect_system/smoke_spread/chem/s = new() - if(pH < 4) - //s.set_up(/datum/reagent/fermi/fermiAcid, (volume/3), pH*10, T) - R.add_reagent("fermiAcid", ((volume/3)/pH)) - pHmod = 2 - if (pH > 10) + if(!ImpureTot == 0) //If impure, v.small emp + ImpureTot *= volume + empulse(T, volume/10, ImpureTot/10, 1) + + if (pH > 10) //if alkaline, small explosion. var/datum/effect_system/reagents_explosion/e = new() e.set_up(round((volume/30)*(pH-9)), T, 0, 0) e.start() pHmod = 1.5 - for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) - if (istype(reagent, /datum/reagent/fermi)) - //var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id] - //Ferm.FermiExplode(src, my_atom, volume, temp, pH, Exploding = TRUE) - continue //Don't allow fermichems into the mix (fermi explosions are handled elsewhere and it's a huge pain) - R.add_reagent(reagent, reagent.volume) - if (reagent.purity < 0.6) - ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 - if(R.reagent_list) - s.set_up(R, (volume/10)*pHmod, 10, T) - s.start() - if(!ImpureTot == 0) - ImpureTot *= volume - empulse(T, volume/10, ImpureTot/10, 1) + message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot], containing [my_atom.reagents.reagent_list]") my_atom.reagents.clear_reagents() return @@ -75,47 +77,46 @@ mix_message = "the reaction zaps suddenly!" //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions - OptimalTempMax = 500 // Upper end for above - ExplodeTemp = 550 //Temperature at which reaction explodes - OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) - OptimalpHMax = 9.5 // Higest value for above - ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) + OptimalTempMax = 600 // Upper end for above + ExplodeTemp = 750 //Temperature at which reaction explodes + OptimalpHMin = 6 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 8 // Higest value for above + ReactpHLim = 4 // How far out pH wil react, giving impurity place (Exponential phase) CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) + CurveSharpT = 0.6 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) - ThermicConstant = -2.5 //Temperature change per 1u produced - HIonRelease = 0.08 //pH change per 1u reaction - RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect + ThermicConstant = 5 //Temperature change per 1u produced + HIonRelease = -0.1 //pH change per 1u reaction + RateUpLim = 5.5 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way /datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. - var/location = get_turf(holder.my_atom) + var/location = get_turf(my_atom) var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list E.location_created = location //add on_new() handling of vars //serum -/datum/chemical_reaction/fermi/SDGF +/datum/chemical_reaction/fermi/SDGF //DONE name = "Synthetic-derived growth factor" id = "SDGF" results = list("SDGF" = 0.3) - //required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) required_reagents = list("stable_plasma" = 0.5, "slimejelly" = 0.5, "synthflesh" = 1, "blood" = 1) mix_message = "the reaction gives off a blorble!" //FermiChem vars: - OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions - OptimalTempMax = 500 // Upper end for above - ExplodeTemp = 550 // Temperature at which reaction explodes - OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) - OptimalpHMax = 9.5 // Higest value for above + OptimalTempMin = 600 // Lower area of bell curve for determining heat based rate reactions + OptimalTempMax = 630 // Upper end for above + ExplodeTemp = 635 // Temperature at which reaction explodes + OptimalpHMin = 3 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 3.5 // Higest value for above ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) - CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) - ThermicConstant = 20 // Temperature change per 1u produced - HIonRelease = 0.01 // pH change per 1u reaction + CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value) + ThermicConstant = -5 // Temperature change per 1u produced + HIonRelease = 0.05 // pH change per 1u reaction RateUpLim = 5 // Optimal/max rate possible if all conditions are perfect FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics FermiExplode = TRUE // If the chemical explodes in a special way @@ -129,8 +130,10 @@ S.real_name = "Living teratoma"//horrifying!! S.rabid = 1//Make them an angery boi, grr grr S.color = "#810010" - to_chat("The cells clump up into a horrifying tumour!") my_atom.reagents.clear_reagents() + var/list/seen = viewers(8, get_turf(my_atom)) + for(var/mob/M in seen) + to_chat(M, "The cells clump up into a horrifying tumour!") /datum/chemical_reaction/fermi/BElarger //done name = "Sucubus milk" @@ -156,21 +159,20 @@ PurityMin = 0.1 /datum/chemical_reaction/fermi/BElarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) - //var/obj/item/organ/genital/breasts/B = - new /obj/item/organ/genital/breasts(get_turf(my_atom)) + var/obj/item/organ/genital/breasts/B = new /obj/item/organ/genital/breasts(get_turf(my_atom)) var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a pair of breasts!")//OwO + var/datum/reagent/fermi/BElarger/BE = locate(/datum/reagent/fermi/BElarger) in my_atom.reagents.reagent_list + B.size = ((BE.volume * BE.purity) / 10) //half as effective. my_atom.reagents.clear_reagents() - ..() /datum/chemical_reaction/fermi/PElarger //done name = "Incubus draft" id = "PElarger" results = list("PElarger" = 0.3) - required_reagents = list("plasma" = 0.1, "stable_plasma" = 0.1, "sugar" = 0.1) + required_reagents = list("blood" = 0.5, "synthflesh" = 0.2, "carbon" = 0.2, "aphro" = 0.2, "salglu_solution" = 0.1,) mix_message = "" - //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: OptimalTempMin = 200 OptimalTempMax = 800 @@ -189,31 +191,32 @@ PurityMin = 0.1 /datum/chemical_reaction/fermi/PElarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) - //var/obj/item/organ/genital/penis/nP = - new /obj/item/organ/genital/penis(get_turf(my_atom)) + var/obj/item/organ/genital/penis/P = new /obj/item/organ/genital/penis(get_turf(my_atom)) var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a penis!")//OwO + var/datum/reagent/fermi/PElarger/PE = locate(/datum/reagent/fermi/PElarger) in my_atom.reagents.reagent_list + P.length = ((PE.volume * PE.purity) / 10)//half as effective. my_atom.reagents.clear_reagents() - ..() + //..() /datum/chemical_reaction/fermi/astral //done //BORKEN name = "Astrogen" id = "astral" - results = list("astral" = 0.3) - required_reagents = list("eigenstate" = 0.1, "plasma" = 0.1, "synaptizine" = 0.1, "aluminium" = 0.5) + results = list("astral" = 0.5) + required_reagents = list("eigenstate" = 0.1, "plasma" = 0.2, "synaptizine" = 0.1, "aluminium" = 0.5) //FermiChem vars: - OptimalTempMin = 200 + OptimalTempMin = 700 OptimalTempMax = 800 - ExplodeTemp = 900 - OptimalpHMin = 12 + ExplodeTemp = 1150 + OptimalpHMin = 10 OptimalpHMax = 13 ReactpHLim = 2 CatalystFact = 0 - CurveSharpT = 4 - CurveSharppH = 2 - ThermicConstant = 10 - HIonRelease = 0.5 + CurveSharpT = 1 + CurveSharppH = 1 + ThermicConstant = 20 + HIonRelease = -0.5 RateUpLim = 10 FermiChem = TRUE FermiExplode = TRUE @@ -238,12 +241,12 @@ //CatalystFact = 0 CurveSharpT = 0.5 CurveSharppH = 4 - ThermicConstant = 20 + ThermicConstant = 10 HIonRelease = -0.1 RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE - PurityMin = 0.15 + PurityMin = 0.2 @@ -255,7 +258,7 @@ var/list/seen = viewers(5, get_turf(my_atom)) for(var/mob/M in seen) to_chat(M, "The reaction splutters and fails to react.") - E.purity = 0 + //E.purity = 0 if (B.data.["gender"] == "female") E.data.["creatorGender"] = "Mistress" E.creatorGender = "Mistress" @@ -288,8 +291,8 @@ OptimalTempMin = 500 OptimalTempMax = 650 ExplodeTemp = 750 - OptimalpHMin = 10 - OptimalpHMax = 14 + OptimalpHMin = 2 + OptimalpHMax = 5 ReactpHLim = 1 //CatalystFact = 0 //To do 1 CurveSharpT = 4 @@ -298,8 +301,8 @@ HIonRelease = -0.05 RateUpLim = 5 FermiChem = TRUE - //FermiExplode = FALSE - //PurityMin = 0.15 + FermiExplode = TRUE + PurityMin = 0.5 /datum/chemical_reaction/fermi/hatmium/FermiExplode(src, var/atom/my_atom, volume, temp, pH) var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom)) @@ -308,7 +311,6 @@ for(var/mob/M in seen) to_chat(M, "The makes an off sounding pop, as a hat suddenly climbs out of the beaker!") my_atom.reagents.clear_reagents() - ..() /datum/chemical_reaction/fermi/furranium //low temp and medium pH - done name = "Furranium" @@ -326,33 +328,77 @@ //CatalystFact = 0 //To do 1 CurveSharpT = 2 CurveSharppH = 0.5 - ThermicConstant = -2 + ThermicConstant = -10 HIonRelease = -0.1 RateUpLim = 10 FermiChem = TRUE - //FermiExplode = FALSE - //PurityMin = 0.15 + PurityMin = 0.30 //Nano-b-gone -/datum/chemical_reaction/fermi/naninte_b_gone//done +/datum/chemical_reaction/fermi/naninte_b_gone//done test name = "Naninte bain" id = "naninte_b_gone" - results = list("naninte_b_gone" = 0.5) - required_reagents = list("synthflesh" = 0.5, "uranium" = 0.1, "iron" = 0.1, "salglu_solution" = 0.3) - mix_message = "the reaction gurgles, encapsulating the reagents in flesh." + results = list("naninte_b_gone" = 20) + required_reagents = list("synthflesh" = 5, "uranium" = 5, "iron" = 5, "salglu_solution" = 5) + mix_message = "the reaction gurgles, encapsulating the reagents in flesh before the emp can be set off." + required_temp = 499//To force fermireactions before EMP. //FermiChem vars: - OptimalTempMin = 450 + OptimalTempMin = 500 OptimalTempMax = 600 ExplodeTemp = 700 OptimalpHMin = 6 - OptimalpHMax = 8 - ReactpHLim = 1 + OptimalpHMax = 6.25 + ReactpHLim = 3 //CatalystFact = 0 //To do 1 - CurveSharpT = 4 - CurveSharppH = 2 - ThermicConstant = 1 + CurveSharpT = 0 + CurveSharppH = 1 + ThermicConstant = 5 HIonRelease = 0.01 RateUpLim = 100 FermiChem = TRUE - //FermiExplode = FALSE - //PurityMin = 0.15 + PurityMin = 0.15 + +/datum/chemical_reaction/fermi/fermiABuffer//done test + name = "Acetic acid buffer" + id = "fermiABuffer" + results = list("fermiABuffer" = 20) //acetic acid + required_reagents = list("salglu_solution" = 2, "ethanol" = 6, "oxygen" = 6, "water" = 6) + //FermiChem vars: + OptimalTempMin = 250 + OptimalTempMax = 500 + ExplodeTemp = 9999 //check to see overflow doesn't happen! + OptimalpHMin = 2.5 + OptimalpHMax = 3.5 + ReactpHLim = 0 + //CatalystFact = 0 //To do 1 + CurveSharpT = 1 + CurveSharppH = 0 + ThermicConstant = 0 + HIonRelease = -0.01 + RateUpLim = 20 + FermiChem = TRUE + +//datum/chemical_reaction/fermi/fermiABuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this + +/datum/chemical_reaction/fermi/fermiBBuffer//done test + name = "Ethyl Ethanoate buffer" + id = "fermiBBuffer" + results = list("fermiBBuffer" = 15) + required_reagents = list("fermiABuffer" = 5, "ethanol" = 5, "salglu_solution" = 1, "water" = 5) + required_catalysts = list("sacid" = 5) //vagely acetic + //FermiChem vars: + OptimalTempMin = 250 + OptimalTempMax = 500 + ExplodeTemp = 9999 //check to see overflow doesn't happen! + OptimalpHMin = 10.5 + OptimalpHMax = 11.5 + ReactpHLim = 0 + //CatalystFact = 0 //To do 1 + CurveSharpT = 1 + CurveSharppH = 0 + ThermicConstant = 0 + HIonRelease = 0.01 + RateUpLim = 20 + FermiChem = TRUE + +///datum/chemical_reaction/fermi/fermiBBuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this From 5e8a20b171b490896c45141b5e7a65a2b4a2c8bf Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 25 May 2019 03:00:31 +0100 Subject: [PATCH 152/608] More bugs, to be fixed. --- code/modules/surgery/organs/vocal_cords.dm | 4 ---- modular_citadel/code/datums/status_effects/chems.dm | 4 +++- .../reagents/chemistry/reagents/fermi_reagents.dm | 5 +++-- .../code/modules/reagents/chemistry/recipes/fermi.dm | 11 +++++------ 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 014b13cbb9..f333372283 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1126,7 +1126,6 @@ return else user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") - user.SetStun(1000)//Hands are handy, so you have to stay still H.SetStun(1000) if (E.mental_capacity >= 10) var/trigger = stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN) @@ -1146,7 +1145,6 @@ to_chat(user, "Your pet looks at you confused, it seems they don't understand that effect!") else to_chat(user, "Your pet looks at you with a vacant blase expression, you don't think you can program anything else into them") - user.SetStun(0) H.SetStun(0) //CUSTOM OBJECTIVE @@ -1160,7 +1158,6 @@ return else user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") - user.SetStun(1000)//So you can't run away! H.SetStun(1000) if (E.mental_capacity >= 250 || message == "objective") var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", MAX_MESSAGE_LEN) @@ -1180,7 +1177,6 @@ //else if (E.mental_capacity >= 150) else to_chat(user, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") - user.SetStun(0) H.SetStun(0) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 8a40f9ba66..19ee869c25 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -274,6 +274,8 @@ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall") owner.remove_status_effect(src) if(0)// sleeper agent + if (cooldown > 0) + cooldown -= 1 return if(1)//Initial enthrallment if (enthrallTally > 150) @@ -317,7 +319,7 @@ if(owner.lewd) to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (3)//fully entranced - if ((resistanceTally >= 200 && withdrawalTick >= 150) || (M.has_trait(TRAIT_MINDSHIELD) && resistanceTally >= 100)) + if ((resistanceTally >= 200 && withdrawalTick >= 150) || (M.has_trait(TRAIT_MINDSHIELD) && (resistanceTally >= 100))) enthrallTally = 0 phase -= 1 resistanceTally = 0 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 97660590b4..e1054c1763 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1095,7 +1095,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y var/creatorName var/mob/living/creator pH = 10 - OnMobMergeCheck = TRUE //Procs on_mob_add when merging into a human + DoNotSplit = TRUE + //OnMobMergeCheck = TRUE //Procs on_mob_add when merging into a human /datum/reagent/fermi/enthrall/test name = "MKUltraTest" @@ -1448,7 +1449,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y N.regen_rate = -0.25//This seems really high ..() -/datum/reagent/fermi/naninte_b_gone/overdose_start(mob/living/carbon/C) +/datum/reagent/fermi/naninte_b_gone/overdose_process(mob/living/carbon/C) //var/component/nanites/N = M.GetComponent(/datum/component/nanites) GET_COMPONENT_FROM(N, /datum/component/nanites, C) if(isnull(N)) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index bafe35c92c..89379617b3 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -14,7 +14,7 @@ //Called when temperature is above a certain threshold //....Is this too much? /datum/chemical_reaction/fermi/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? - //var/Svol = volume + message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot], containing [my_atom.reagents.reagent_list]") if (Exploding == TRUE) return if(!pH)//Dunno how things got here without a pH. @@ -55,17 +55,16 @@ new /obj/effect/hotspot(turf) //volume /= 5 - if(!ImpureTot == 0) //If impure, v.small emp - ImpureTot *= volume - empulse(T, volume/10, ImpureTot/10, 1) - if (pH > 10) //if alkaline, small explosion. var/datum/effect_system/reagents_explosion/e = new() e.set_up(round((volume/30)*(pH-9)), T, 0, 0) e.start() pHmod = 1.5 - message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot], containing [my_atom.reagents.reagent_list]") + if(!ImpureTot == 0) //If impure, v.small emp + ImpureTot *= volume + empulse(T, volume/10, ImpureTot/10, 1) + my_atom.reagents.clear_reagents() return From b4624c553704bd416447004f1dcb7dd1dde8c2e1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 25 May 2019 03:15:15 +0100 Subject: [PATCH 153/608] I really hate genitals. --- modular_citadel/code/modules/arousal/organs/breasts.dm | 4 ---- .../code/modules/arousal/organs/genitals.dm | 7 +++++++ .../reagents/chemistry/reagents/fermi_reagents.dm | 10 +++++++--- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 35f7a23568..b526312b1a 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -91,10 +91,6 @@ /obj/item/organ/genital/breasts/update_size()//wah //var/mob/living/carbon/human/o = owner //var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") - if (cached_size == null) - prev_size = size - cached_size = breast_values[size] - return //message_admins("Breast size at start: [size], [cached_size], [owner]") if(!isnum(cached_size)) cached_size = breast_values[cached_size] diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 823763d898..47fc332d91 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -271,6 +271,13 @@ //fermichem procs /mob/living/carbon/human/proc/Force_update_genitals(mob/living/carbon/human/H) //called in fermiChem + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + + if (cached_size == null) //MOVE THIS TO FORCE UPDATE I have to do this because Pooj's latest commit broke everthing. I give up and I hate genitals. + prev_size = size + cached_size = breast_values[size] + if(!isnum(cached_size)) + cached_size = breast_values[cached_size] dna.species.handle_genitals(src) //dna.species.handle_breasts(src) //H.update_body() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index e1054c1763..249190cfd7 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1459,7 +1459,9 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y to_chat(C, "The residual voltage from the nanites causes you to seize up!") C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) if(prob(10)) - empulse((get_turf(C)), 3, 2)//So the nanites randomize + //empulse((get_turf(C)), 3, 2)//So the nanites randomize + var/T = get_turf(C) + T.emp_act(EMP_HEAVY) to_chat(C, "The nanintes short circuit within your system!") ..() @@ -1472,11 +1474,13 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y //Increases shock events. /datum/reagent/fermi/naninte_b_goneTox/on_mob_life(mob/living/carbon/C)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good) - if(prob(20)) + if(prob(10)) to_chat(C, "The residual voltage in your system causes you to seize up!") C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) if(prob(10)) - empulse((get_turf(C)), 2, 1, 1)//So the nanites randomize + //empulse((get_turf(C)), 2, 1, 1)//So the nanites randomize + var/T = get_turf(C) + T.emp_act(EMP_HEAVY) to_chat(C, "You feel your hair stand on end as you glow brightly for a moment!") ..() From e2c1eb1d7c504fe3054f1ba86bd0ac4f03b8477e Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 25 May 2019 05:27:28 +0100 Subject: [PATCH 154/608] prebed fixes --- code/modules/mob/living/blood.dm | 19 ++++ code/modules/reagents/chemistry/holder.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 9 +- .../code/datums/status_effects/chems.dm | 18 ++-- .../code/modules/arousal/organs/breasts.dm | 12 +-- .../code/modules/arousal/organs/genitals.dm | 15 +-- .../code/modules/arousal/organs/penis.dm | 57 ++++------- .../chemistry/reagents/fermi_reagents.dm | 92 ++++++++---------- .../reagents/chemistry/recipes/fermi.dm | 11 ++- .../icons/obj/genitals/breasts.dmi | Bin 593 -> 944 bytes modular_citadel/icons/obj/genitals/penis.dmi | Bin 1580 -> 2800 bytes .../icons/obj/genitals/penis_onmob.dmi | Bin 1341 -> 3880 bytes modular_citadel/icons/obj/genitals/vagina.dmi | Bin 405 -> 510 bytes .../icons/obj/genitals/vagina_onmob.dmi | Bin 644 -> 939 bytes 14 files changed, 107 insertions(+), 128 deletions(-) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index dcdbeb13ad..8acaa4e00c 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -300,3 +300,22 @@ var/obj/effect/decal/cleanable/oil/B = locate() in T.contents if(!B) B = new(T) + +//I think I had a plan, but it went out the window. +/mob/living/proc/IncreaseBloodVol(var/value) + blood_ratio += value + return + +/mob/living/proc/DecreaseBloodVol(var/value) + blood_ratio -= value + +/mob/living/proc/ResetBloodVol() + if(ishuman(src)) + if src.has_quirk(/datum/quirk/BloodPressure) + blood_ratio = 1.2 + blood_ratio = 1 + +/mob/living/proc/AdjustBloodVol(var/value) + if(blood_ratio == value) + return + blood_ratio = value diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 30219cc2c2..e9ef720616 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -886,7 +886,7 @@ im for (var/datum/reagent/reagentgas in reagent_list) R.add_reagent(reagentgas, amount/5) remove_reagent(reagentgas, amount/5) - s.set_up(R, CLAMP(amount/10, 0, 1), T) + s.set_up(R, CLAMP(amount/10, 0, 2), T) s.start() return FALSE diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index f333372283..aca74359fc 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -884,13 +884,12 @@ descmessage += " And yet, it feels good..!" E.enthrallTally += power_multiplier E.resistanceTally -= power_multiplier - E.cooldown += 1 */ else addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've failed [E.master]..."), 5) + E.resistanceTally += power_multiplier + E.enthrallTally += power_multiplier E.cooldown += 1 - E.resistanceTally += power_multiplier - E.enthrallTally += power_multiplier SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold, descmessage) E.cooldown += 1 @@ -1126,6 +1125,7 @@ return else user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") + user.SetStun(1000)//Hands are handy, so you have to stay still H.SetStun(1000) if (E.mental_capacity >= 10) var/trigger = stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN) @@ -1145,6 +1145,7 @@ to_chat(user, "Your pet looks at you confused, it seems they don't understand that effect!") else to_chat(user, "Your pet looks at you with a vacant blase expression, you don't think you can program anything else into them") + user.SetStun(0) H.SetStun(0) //CUSTOM OBJECTIVE @@ -1158,6 +1159,7 @@ return else user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") + user.SetStun(1000)//So you can't run away! H.SetStun(1000) if (E.mental_capacity >= 250 || message == "objective") var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", MAX_MESSAGE_LEN) @@ -1177,6 +1179,7 @@ //else if (E.mental_capacity >= 150) else to_chat(user, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") + user.SetStun(0) H.SetStun(0) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 19ee869c25..1e7d6696de 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -140,9 +140,8 @@ bloodCalc = 1+((round(P.length) - 21)/10) //effects how much blood you need (I didn' bother adding an arousal check because I'm spending too much time on this organ already.) if(!P) o.remove_movespeed_modifier("hugedick") - o.blood_ratio /= bloodCalc //If someone else uses blood_ratio, turn this into a multiplier(I should make a handler huh) + o.ResetBloodVol() owner.remove_status_effect(src) - message_admins("PElarge tick!") var/items = o.get_contents() for(var/obj/item/W in items) if(W == o.w_uniform || W == o.wear_suit) @@ -151,20 +150,19 @@ to_chat(owner, "Your enormous package is way to large to fit anything over!") switch(round(P.cached_length)) if(21) - if (P.prev_size > P.size) - to_chat(o, "Your rascally willy has become a more managable size, liberating your movements.") - o.remove_movespeed_modifier("hugedick") - o.blood_ratio /= bloodCalc + to_chat(o, "Your rascally willy has become a more managable size, liberating your movements.") + o.remove_movespeed_modifier("hugedick") + o.AdjustBloodVol(bloodCalc) if(22 to INFINITY) - if (!(P.prev_size == P.size)) - to_chat(o, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!") + if(prob(2)) + to_chat(o, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!") o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) - o.blood_ratio *= bloodCalc + o.AdjustBloodVol(bloodCalc) ..() /datum/status_effect/chem/PElarger/on_remove(mob/living/carbon/human/o) owner.remove_movespeed_modifier("hugedick") - o.blood_ratio /= bloodCalc + o.ResetBloodVol() /*////////////////////////////////////////// diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index b526312b1a..17eb332485 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -92,31 +92,25 @@ //var/mob/living/carbon/human/o = owner //var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") //message_admins("Breast size at start: [size], [cached_size], [owner]") - if(!isnum(cached_size)) - cached_size = breast_values[cached_size] if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!(Why does this runtime??) to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") src.Remove(owner) switch(round(cached_size)) if(0) //If flatchested size = "flat" - if(statuscheck == TRUE) - message_admins("Attempting to remove.") + if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) owner.remove_status_effect(/datum/status_effect/chem/BElarger) statuscheck = FALSE if(1 to 8) //If modest size size = breast_sizes[round(cached_size)] - if(statuscheck == TRUE) - message_admins("Attempting to remove.") + if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) owner.remove_status_effect(/datum/status_effect/chem/BElarger) statuscheck = FALSE if(9 to 15) //If massive size = breast_sizes[round(cached_size)] - if(statuscheck == FALSE) - message_admins("Attempting to apply.") + if(!owner.has_status_effect(/datum/status_effect/chem/BElarger)) owner.apply_status_effect(/datum/status_effect/chem/BElarger) statuscheck = TRUE - if(16 to INFINITY) //if Rediculous size = cached_size //message_admins("1. [breast_values[size]] vs [breast_values[prev_size]] || [size] vs [prev_size]") diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 47fc332d91..4b54ea38f0 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -168,6 +168,8 @@ P.length = dna.features["cock_length"] P.girth_ratio = dna.features["cock_girth_ratio"] P.shape = dna.features["cock_shape"] + P.prev_size = P.length + P.cached_length = P.length P.update() /mob/living/carbon/human/proc/give_balls() @@ -205,6 +207,8 @@ else B.color = "#[dna.features["breasts_color"]]" B.size = dna.features["breasts_size"] + B.prev_size = B.size + B.cached_size = B.breast_values[B.size] B.shape = dna.features["breasts_shape"] B.fluid_id = dna.features["breasts_fluid"] B.update() @@ -271,17 +275,8 @@ //fermichem procs /mob/living/carbon/human/proc/Force_update_genitals(mob/living/carbon/human/H) //called in fermiChem - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - - if (cached_size == null) //MOVE THIS TO FORCE UPDATE I have to do this because Pooj's latest commit broke everthing. I give up and I hate genitals. - prev_size = size - cached_size = breast_values[size] - if(!isnum(cached_size)) - cached_size = breast_values[cached_size] - dna.species.handle_genitals(src) + dna.species.handle_genitals(src)//should work. //dna.species.handle_breasts(src) - //H.update_body() -//species_traits = list(NOTRANSSTING,NOGENITALS) /mob/living/carbon/human/proc/emergent_genital_call() var/organCheck = FALSE diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 409d27aace..fb5f7739f0 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -18,23 +18,14 @@ var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF var/list/dickflags = list() var/list/knotted_types = list("knotted", "barbed, knotted") - var/statuscheck = FALSE var/prev_size = 6 //really should be renamed to prev_length /obj/item/organ/genital/penis/Initialize() . = ..() - /* I hate genitals. - var/mob/living/carbon/human/o = owner - length = o.dna.features["cock_length"] //for whatever reason, this doesn't set up correctly. - prev_size = length - cached_length = length - */ + /* I hate genitals.*/ /obj/item/organ/genital/penis/update_size() var/mob/living/carbon/human/o = owner - if(!cached_length) - prev_size = length - cached_length = length if(cached_length < 0)//I don't actually know what round() does to negative numbers, so to be safe!! var/obj/item/organ/genital/penis/P = o.getorganslot("penis") to_chat(o, "You feel your tallywacker shrinking away from your body as your groin flattens out!") @@ -43,59 +34,41 @@ if(0 to 4) //If modest size length = cached_length size = 1 - if(statuscheck == TRUE) - //message_admins("Attempting to remove.") + if(owner.has_status_effect(/datum/status_effect/chem/PElarger)) o.remove_status_effect(/datum/status_effect/chem/PElarger) - statuscheck = FALSE if(5 to 10) //If modest size length = cached_length size = 2 - if(statuscheck == TRUE) - //message_admins("Attempting to remove.") + if(owner.has_status_effect(/datum/status_effect/chem/PElarger)) o.remove_status_effect(/datum/status_effect/chem/PElarger) - statuscheck = FALSE if(11 to 20) //If massive length = cached_length - size = 3 - if(statuscheck == FALSE) - //message_admins("Attempting to apply.") + size = 3 + if(owner.has_status_effect(/datum/status_effect/chem/PElarger)) o.remove_status_effect(/datum/status_effect/chem/PElarger) - statuscheck = TRUE - if(21 to 29) + if(21 to 29) //If massive and due for large effects length = cached_length size = 3 - if(statuscheck == FALSE) - //message_admins("Attempting to apply.") + if(!owner.has_status_effect(/datum/status_effect/chem/PElarger)) o.apply_status_effect(/datum/status_effect/chem/PElarger) - statuscheck = TRUE - if(30 to INFINITY) + if(30 to INFINITY) //If comical length = cached_length size = 4 //no new sprites for anything larger yet - if(statuscheck == FALSE) - //message_admins("Attempting to apply.") + if(!owner.has_status_effect(/datum/status_effect/chem/PElarger)) o.apply_status_effect(/datum/status_effect/chem/PElarger) - statuscheck = TRUE - //message_admins("Pinas size: [length], [cached_length], [o]") - //message_admins("2. size vs prev_size") + if (round(length) > round(prev_size)) to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "Chase Redtail", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.") else if (round(length) < round(prev_size)) to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "Chase Redtail", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.") prev_size = length icon_state = sanitize_text("penis_[shape]_[size]") - //update_body() - //P.update_icon() //Either of these don't work, why??? girth = (length * girth_ratio)//Is it just me or is this ludicous, why not make it exponentially decay? - //var/mob/living/carbon/human/H = owner - //H.update_genitals() - //owner.update_genitals() //I have no idea on how to update sprites and I hate it /obj/item/organ/genital/penis/update_appearance() - //var/mob/living/carbon/o = owner - var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" - icon_state = sanitize_text(string) + var/string var/lowershape = lowertext(shape) desc = "You see [aroused_state ? "an erect" : "a flaccid"] [lowershape] penis. You estimate it's about [round(length, 0.25)] inch[round(length, 0.25) != 1 ? "es" : ""] long and [round(girth, 0.25)] inch[round(girth, 0.25) != 1 ? "es" : ""] in girth." @@ -104,9 +77,15 @@ if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow... var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need. color = "#[skintone2hex(H.skin_tone)]" + string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]-s" else color = "#[owner.dna.features["cock_color"]]" - //owner.update_body() + string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.update_genitals() + + icon_state = sanitize_text(string) /obj/item/organ/genital/penis/update_link() if(owner) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 249190cfd7..759232327e 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -572,7 +572,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name ZI.desc = "[M]'s clone, gone horribly wrong." - ZI.zombiejob = null + ZI.zombiejob = FALSE //ZI.updateappearance(mutcolor_update=1) M.reagents.remove_reagent(src.id, 20) else//easier to deal with @@ -1086,17 +1086,14 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y color = "#2C051A" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. - InverseChemVal = 0.5 - InverseChem = "enthrallInverse" //At really impure vols, it just becomes 100% inverse - //DoNotSplit = TRUE + DoNotSplit = TRUE data = list("creatorID" = null, "creatorGender" = null, "creatorName" = null) var/creatorID //ckey var/creatorGender var/creatorName var/mob/living/creator pH = 10 - DoNotSplit = TRUE - //OnMobMergeCheck = TRUE //Procs on_mob_add when merging into a human + OnMobMergeCheck = TRUE //Procs on_mob_add when merging into a human /datum/reagent/fermi/enthrall/test name = "MKUltraTest" @@ -1111,6 +1108,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y creatorGender = "Mistress" creatorName = "Fermis Yakumo" purity = 1 + DoNotSplit = TRUE /datum/reagent/fermi/enthrall/test/on_new() id = "enthrall" @@ -1166,6 +1164,29 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) + if(purity < 0.5)//DO NOT SPLIT INTO DIFFERENT CHEM: This relies on DoNotSplit - has to be done this way. + if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. + if(M.has_status_effect(STATUS_EFFECT_INLOVE)) + return + var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers + for(var/victim in seen) + if((victim == /mob/living/simple_animal/pet/) || (victim == M)) + seen = seen - victim + if(!seen) + return + M.reagents.remove_reagent(src.id, src.volume) + FallInLove(M, pick(seen)) + return + else // If someone else drinks it, the creator falls in love with them! + var/mob/living/carbon/C = get_mob_by_key(creatorID) + if(C.has_status_effect(STATUS_EFFECT_INLOVE)) + return + if(C in viewers(7, get_turf(M))) + M.reagents.remove_reagent(src.id, src.volume) + FallInLove(C, M) + return + if(volume < 1)//You don't get to escape that easily + FallInLove(pick(GLOB.player_list), M) if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it does nothing. return if(!M.client) @@ -1180,7 +1201,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y message_admins("No enthrall status found in [M]!") else E.enthrallTally += 1 - if(prob(50)) + if(prob(25)) M.adjustBrainLoss(0.1)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it. ..() @@ -1204,8 +1225,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y M.add_trait(TRAIT_PACIFISM, "MKUltra") var/datum/status_effect/chem/enthrall/E if (!M.has_status_effect(/datum/status_effect/chem/enthrall)) - E = M.has_status_effect(/datum/status_effect/chem/enthrall) M.apply_status_effect(/datum/status_effect/chem/enthrall) + E = M.has_status_effect(/datum/status_effect/chem/enthrall) E.enthrallID = creatorID E.enthrallGender = creatorGender E.master = creator @@ -1222,39 +1243,6 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y M.adjustBrainLoss(0.1)//should be 15 in total ..() -/datum/reagent/fermi/enthrall/Inverse - name = "MKUltra" - id = "enthrall" - description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." - color = "#2C051A" // rgb: , 0, 255 - taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" - DoNotSplit = TRUE - -/datum/reagent/fermi/enthrall/Inverse/on_mob_life(mob/living/carbon/M) - if(purity < 0.5)//Placeholder for now. I'd like to get this done. - if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. - if(M.has_status_effect(STATUS_EFFECT_INLOVE)) - return - var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers - for(var/victim in seen) - if((victim == /mob/living/simple_animal/pet/) || (victim == M)) - seen = seen - victim - if(!seen) - return - M.reagents.remove_reagent(src.id, src.volume) - FallInLove(M, pick(seen)) - return - else // If someone else drinks it, the creator falls in love with them! - var/mob/living/carbon/C = get_mob_by_key(creatorID) - if(C.has_status_effect(STATUS_EFFECT_INLOVE)) - return - if(C in viewers(7, get_turf(M))) - M.reagents.remove_reagent(src.id, src.volume) - FallInLove(C, M) - return - if(volume < 1)//You don't get to escape that easily - FallInLove(pick(GLOB.player_list), M) - //Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system. /datum/reagent/fermi/enthrallExplo//Created in a gas cloud when it explodes name = "MKUltra" @@ -1291,7 +1279,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(prob(10)) M.Stun(10) M.emote("whimper")//does this exist? - to_chat(M, "You're overcome with a desire to see [love].") + to_chat(M, " You're overcome with a desire to see [love].") M.adjustBrainLoss(5) ..() @@ -1299,6 +1287,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y M.remove_status_effect(STATUS_EFFECT_INLOVE) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") + to_chat(M, "Your feelings for [love] suddenly vanish!") ..() /datum/reagent/fermi/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love) @@ -1445,24 +1434,24 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y //var/component/nanites/N = M.GetComponent(/datum/component/nanites) GET_COMPONENT_FROM(N, /datum/component/nanites, C) if(isnull(N)) - return + return ..() N.regen_rate = -0.25//This seems really high ..() /datum/reagent/fermi/naninte_b_gone/overdose_process(mob/living/carbon/C) //var/component/nanites/N = M.GetComponent(/datum/component/nanites) GET_COMPONENT_FROM(N, /datum/component/nanites, C) - if(isnull(N)) - return - N.regen_rate = -1//12.5 seems crazy high? if(prob(20)) to_chat(C, "The residual voltage from the nanites causes you to seize up!") C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) if(prob(10)) //empulse((get_turf(C)), 3, 2)//So the nanites randomize - var/T = get_turf(C) + var/atom/T = C T.emp_act(EMP_HEAVY) to_chat(C, "The nanintes short circuit within your system!") + if(isnull(N)) + return ..() + N.regen_rate = -1//12.5 seems crazy high? ..() //Unobtainable, used if SDGF is impure but not too impure @@ -1479,7 +1468,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) if(prob(10)) //empulse((get_turf(C)), 2, 1, 1)//So the nanites randomize - var/T = get_turf(C) + var/atom/T = C T.emp_act(EMP_HEAVY) to_chat(C, "You feel your hair stand on end as you glow brightly for a moment!") ..() @@ -1565,6 +1554,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y name = ""//defined on setup id = "fermiTox" description = "You should be really careful with this...! Also, how did you get this?" + data = "merge" /datum/reagent/fermi/fermiTox/on_mob_life(mob/living/carbon/C, method) if(C.dna && istype(C.dna.species, /datum/species/jelly)) @@ -1578,12 +1568,11 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y id = "fermiABuffer" description = "This reagent will consume itself and move the pH of a beaker towards 3 when added to another." taste_description = "an acidy sort of taste, blech." + color = "#fbc314" addProc = FALSE pH = 3 /datum/reagent/fermi/fermiABuffer/on_new() - if(addProc == FALSE)//This is so it doesn't react when made. - addProc = TRUE if(LAZYLEN(holder.reagent_list) == 1) return pH = ((holder.pH * holder.total_volume)+(3 * src.volume))/(holder.total_volume + src.volume) @@ -1595,12 +1584,11 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y id = "fermiBBuffer" description = "This reagent will consume itself and move the pH of a beaker towards 11 when added to another." taste_description = "an soapy sort of taste, blech." + color = "#3853a4" addProc = FALSE pH = 11 /datum/reagent/fermi/fermiBBuffer/on_new() - if(addProc == FALSE)//This is so it doesn't react when made. - addProc = TRUE if(LAZYLEN(holder.reagent_list) == 1) return pH = ((holder.pH * holder.total_volume)+(11 * src.volume))/(holder.total_volume + src.volume) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 89379617b3..b6d888ef88 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -14,7 +14,6 @@ //Called when temperature is above a certain threshold //....Is this too much? /datum/chemical_reaction/fermi/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? - message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot], containing [my_atom.reagents.reagent_list]") if (Exploding == TRUE) return if(!pH)//Dunno how things got here without a pH. @@ -22,7 +21,7 @@ var/ImpureTot = 0 var/pHmod = 1 var/turf/T = get_turf(my_atom) - + message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot], containing [my_atom.reagents.reagent_list]") var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case. var/datum/effect_system/smoke_spread/chem/s = new() if(pH < 4) //if acidic, make acid spray @@ -377,7 +376,9 @@ RateUpLim = 20 FermiChem = TRUE -//datum/chemical_reaction/fermi/fermiABuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this +/datum/chemical_reaction/fermi/fermiABuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this + var/datum/reagent/fermi/fermiABuffer/Fa = locate(/datum/reagent/fermi/fermiABuffer) in my_atom.reagents.reagent_list + Fa.data = "merge" /datum/chemical_reaction/fermi/fermiBBuffer//done test name = "Ethyl Ethanoate buffer" @@ -400,4 +401,6 @@ RateUpLim = 20 FermiChem = TRUE -///datum/chemical_reaction/fermi/fermiBBuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this +/datum/chemical_reaction/fermi/fermiBBuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this + var/datum/reagent/fermi/fermiBBuffer/Fb = locate(/datum/reagent/fermi/fermiBBuffer) in my_atom.reagents.reagent_list + Fb.data = "merge" diff --git a/modular_citadel/icons/obj/genitals/breasts.dmi b/modular_citadel/icons/obj/genitals/breasts.dmi index c02a230bdb42164dec3bd530e8d4be97c977500b..86eac3196a101aa4f626178d89e5bd54382b67e0 100644 GIT binary patch delta 835 zcmV-J1HAmv1h5BRiBL{Q4GJ0x0000DNk~Le0001h0001h1Oos705K4J_y7O^Ay7e<}?fd3H8OA7!100DGTPE!Ct=GbNc z005eiQ+t2JD%T}7P)OB~LaK&jQZ*!zsv!}#24w|TKNoNs1OUuy!lgbAFDU>30+&fd zK~!jg?N~8x<1i4Uqz{+^@&K;lz}E#L@&H$|3D3a`sHy2 zc5v)qLr62O&}0G#p=APcX#5TcS|;e?2n61PgZe)JLF0QQ&>gS@I-r;R%5+QE$z&S> z6Ug`k1Y!T}{}u4VdJF#j;|FfR@DBZ9+CsNBcxVW(jtHKSz<*d%8@9NIfmUFTf%dQ8 zkRE>r2p@ygaQHSGk-b^)nc$85t=*};F{(ZaLs2JrK}^wMgHAgd=_TVhh%C)6sgC!kFcwika0 zvU&p95K$L*Kyb01KsK%T1qisF!1+KIks$Hy?AtT1Cyeq5D;zgQ+`a;S+2H%1>IuW= zO!hkw40D7AswWIH4j5+IavgwsNc9BB2lTCeFrV@Kyr%(FPuPH*>xS63_L;zXkgfRu z4A6#|4+%WqvwFga1Na;!fArvb!nIp`U`!LjfaQ8Z1`T1xDVFOAIbuy&Dk>`eCER-_ zWf@5+vW%n3ummmhWOzZLIk5_zRwCkDRG^Fed;2 N002ovPDHLkV1k*Xh&ccN delta 482 zcmV<80UiFZ2hjvmiBL{Q4GJ0x0000DNk~Le0001B0001B1Oos701&on3jhEB6;Mo6 zMgM^RzrVl#|Nq+B+VJr3va+)OfdAnj!$<%C00DGTPE!Ct=GbNc004%OUwePJlq)N^ z`niAu834!GYk1y2Zsh;~0a!^yK~z|U?N`gOgD?!VT>0V_1XAq6C+0Q#@y*>KSZ zq{rm&X5M&j)=EMK&2AFHzzsy0?(qqWS)q7DELMT!lMILv6yMJHoLIo*(^9)78Nej&v*bU-{%Jg{u%CWd}7)g zd<#r2Y`P{Il1J{3Qr~=;F!-Its4+p$FJNyPg~V5cGF$AAw~=ZxtiX zFFQj5oZTE482Dp+?LZ#9zd#a7|NRFD{db`B|2G9fO}&YP{(DgR??LLnkMY}j;A{K< YNMJ$^4oFaK00000Nks-uM6N<$f}2m-lK=n! diff --git a/modular_citadel/icons/obj/genitals/penis.dmi b/modular_citadel/icons/obj/genitals/penis.dmi index cb9ce6535f5655efc30d2312572c129073da526b..e33d3ad24c00026a30122c2ab53aa92eaa84613a 100644 GIT binary patch delta 2799 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 delta 1553 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 literal 1341 zcmXw1c~sI_82vexG#X|$)g&TKX{FgNiROkLVXQ$d8?j?a zIVCzMWSI*d1!C06Q(1{(DT1jLkqZHeATUU0{&?qo=f3aVd%yc$X>gz~*x14t006Mx zG4D_SFc9h%YmK1}`TbOVg>JJ7J`sNO;K74ht(ME>PESvZM52a<28l$X1K$F`c>q|4 z9J{aUG{^`I3nu!%4LZKH%}dg@VS$A93L_WI;3HN_cK<&cmcO9CSd-)*pS}-hRuo^SA6bJ~O9%NrF#A_nP{-Uax>urtSF2dCyG5Q^O7p@VKVT^VW^C znQI1aj?;ElJdnM*w<(u;bJO>oCvA6|r`3d(*&v*@+a7l)EgP$hG>5kDVq@D0Bb>P6 zbl1v-Eszev%#JX^${}hv(aK5}K2S(q2&l%AulB1PdCV?+P!!u{bNP}RPtBr;^M$J& z05Ja0*+Z+MYNJs_ERmO;m620^>0zuiPgjlDtg{?j5J|i$B4Fg%AN#bNe19_+1+*4j zki(u+4w+o$&DZ{$#RKVy&Jb&P_4@`fTo70SEaswBiJ8nKch|(LxhjQMg+eW9_eM;> zYX)Cj^OAzN{Uhbg{$?GIBqCW+lu)Q6!{ds@1O|vJHeci8Jf18w)YBF=;s+Cb1@q8z z9&YqmD{|GxVG-{0M~@=b7%WWUaFM2A@nTePc7BLP7=L~l7X+{7r|M?$l(9JAHdRUK zV=$pSh{ELX2R4j*Zq_^9#gJr6UMf`G{S)w)ro2ThKbPr@q@zjO%?{nR!sM43_aI>y z{M66|Ced-g7fgU8Nkc#ssU)T~uS4JjOLkF0HMaJOI9*037fts3P!FPba|&s%^+50h^{4t?h#JDCoYXhP}C`mlPSOx_^lKF-EI*gpVu{ zbQEd3L!RsnQv7=1wcHWWChXr+psc=1z!5V^9vzb@Dp1B0m>HR^d8$V1g!lV}XLWDlK%Z=pWA?aQ@$7Cch@Kkz-w#mMYR~J|gtcm9Gb?fumO^JT41eWe_&BPVKF1oC4~r?ihJ!uHR|w!$5Y*9yr!FOv w-YdW62|gR>{R)p^v~%w4-vpU30O&w!firgGuHyL8>#L`JM+3cSM<1KK~C4FCWD diff --git a/modular_citadel/icons/obj/genitals/vagina.dmi b/modular_citadel/icons/obj/genitals/vagina.dmi index a57392868f02552195d305b7ba9a51dab09d6df4..00891888a44047465c86f73ba5b441a0f56e884a 100644 GIT binary patch delta 403 zcmV;E0c`%21O5Y$7g0b20{{R3SVwH_0000gP)t-s{{Vp3*Vpv)^yS9O`R?+wv$NW? zvVwww&vsw`0DzQ3Mf$Fs;DvDcn}{?j0$Kn700DGTPE!Ct=GbNc004H8Tw#BsDbp<` zsIWXgHwl*_Wd&D17qBYD?z- zi;=}r4A^gB|6m|D@C1U$gLj9Nvg!r=(~Ecm&0XBioh`=3LLtBI$A0-{GD6gOXCm1l zy)hV5AT^S7jl%$#8=}xlqzZp!QljXhCW=@Y@D*{68Br*iN?*|%>Jd=@D5E?@fjKUS z0-V5~Q8)$qYe%4FY5Un*m>0V5uL%-n9^e#NK>!6m;P)v`GC_eh>C=pSFXG_6iNB<~ zC24PH5hMzFD+KC%Q>Hr1US@DfO>*FZP5=YZXL^?&0O x+dsQz72DEH;r`MA{HYUn#Dv>{Jz|~D$pc|*Vpv) z^s}?Gf`Wq2c3(TKd6EDC00DGTPE!Ct=GbNc00454XkmZDm6hk`CgD<~tl;YB0=66g z84@JaUvBhs0001|Nkl zlBh<6hNfATrXq|G7696U8j_(v15gy82Q_PGYI%47+>yXQWJL2uXjo`DTmb`?h)NAj v3&j*gQ4oMvo{fM!(2@A%fhq_o814W7@c|x3X&02z00000NkvXXu0mjfn?rKP diff --git a/modular_citadel/icons/obj/genitals/vagina_onmob.dmi b/modular_citadel/icons/obj/genitals/vagina_onmob.dmi index 41bc818719b8e982409fbdcac322fc6990316193..c22c12ded338f74567d6521f524ebb9a64d1ae81 100644 GIT binary patch delta 917 zcmV;G18V$)1*-=oiBL{Q4GJ0x0000DNk~Le0004i0004C1Oos706?v?4gdfEEs-T9 zf91x@+O)Fj+1&Z=@@M%DXaE2J0d!JMQvg8b*k%9#0PlKKSad{Xb7OL8aCB*JZU6vy zoUN2k3xY5h#?S6k482yU{ke4sD>`Hl-Q}fC9q5W}8Giew9xNnbD|UI`!Sn3*?ius& zX1hPcI659sMTKNHj@NiG^O5spMCH1fe}~A)Da&%zHBy11x^yeZ7>6W(l)#f9@sr*8 z6klBA5GG{ff}B)9Nt-(ODhtMBE4@n#sC60olV!WY$&ev~JL8!-grZ!*wV*#KM<-bH z6Lk2?ffZ@26qqyg!cm0q17R2hFi{&HK9!cizX|^ly|%LqUn}k7x4yLWAp|8he@b}= zVov%wrRh`k@HURx&*24qM>)nSH#&^~00J>dL_t(|obBB|ZWB=u2jGPT3Bg9f;vzP_ z2o*IQ*P*1Oq@;I{wzm(#1-JvGik&4pNq#8Lt9)OYtn}u+dHcu3%*N?D0001B(Vi_l zzI)y{{{1?f000000DuMRTPKj(e}v`j=KX=RKHs{(5PQ)&0Ya`I00000JW0*_3u%46 zb$=nQ&!-z`-X8!O)8YXD005q-*59p?uAi3Y`+S0E3-S8hW*dd~t1|zS6mO1Ruh!)R zM+2tY?N@KB`0cF+SCiK#;3UCG2Ag-$`ggg9=M$)Jf%*74fg(PB2JSavf0Azf2o)Ph zwf+S7)h#q%pHJWaPdCuMyq!wx z`%5tU3;+NC000fV`uo#XTA%;=<-erya34Qp@!!8?@o%#5d;_n;^?kn(000000FN&& zucs5F@s~fs35LcA{7g3he*gdg0057#b$=jkaHRc#i^lQ(wdvxyf;8q91ONa4c!-O* zx|>#~Q@?+O6YR$6K9Bw^03*-GpwC;#aonJ-(000262;;)n&r5@02E!0dkk^WQP4^6+c_wA9jban^*J)>MMA%z&}nw7GK}N#rpLI rW^bW5fpq=mpMrNVUjM2c0-TLMx%@^czS6x%00000NkvXXu0mjf=FzFI delta 620 zcmV-y0+ao#2ZRMBiBL{Q4GJ0x0000DNk~Le0003X000311Oos70O0|)g#Z8mA(15| ze@(M1g#Z8m0d!JMQvg8b*k%9#0Lgk(Sad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1 zGke*nOnU_wwBT7>9N)nTEQYq4j*9RsDA3&UMieXd=$f%M;(%pd2h}Q{5C{DnP zh{VjIO2U>aE4cc(fYS*8^OK~M8GP|#0003zNkld%7{M(gkT-~<2w z005gxts9sdg7HZ-Ps&8|oM@i3xr^2f00000Otd~Q!)^;rYqJ+y2@cKxv}_zQ1*0ssJDZ}# Date: Sat, 25 May 2019 05:35:03 +0100 Subject: [PATCH 155/608] Compile safe. --- code/modules/mob/living/blood.dm | 5 ++--- modular_citadel/code/datums/status_effects/chems.dm | 8 ++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 8acaa4e00c..b9c822bfcb 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -310,9 +310,8 @@ blood_ratio -= value /mob/living/proc/ResetBloodVol() - if(ishuman(src)) - if src.has_quirk(/datum/quirk/BloodPressure) - blood_ratio = 1.2 + if(ishuman(src) && src.has_trait(TRAIT_HIGH_BLOOD)) + blood_ratio = 1.2 blood_ratio = 1 /mob/living/proc/AdjustBloodVol(var/value) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 1e7d6696de..a7d77be496 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -154,10 +154,10 @@ o.remove_movespeed_modifier("hugedick") o.AdjustBloodVol(bloodCalc) if(22 to INFINITY) - if(prob(2)) - to_chat(o, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!") - o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) - o.AdjustBloodVol(bloodCalc) + if(prob(2)) + to_chat(o, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!") + o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) + o.AdjustBloodVol(bloodCalc) ..() /datum/status_effect/chem/PElarger/on_remove(mob/living/carbon/human/o) From e3d3f30ea91d1ce705fde6f3144baa83721d89f2 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 25 May 2019 16:12:46 +0100 Subject: [PATCH 156/608] Could this be the final commit?! --- code/modules/mob/living/blood.dm | 51 +++++++++++------- code/modules/reagents/chemistry/holder.dm | 5 +- .../reagents/reagent_containers/glass.dm | 6 +-- .../code/datums/status_effects/chems.dm | 17 +++--- .../code/modules/arousal/organs/genitals.dm | 9 +++- .../chemistry/reagents/fermi_reagents.dm | 32 ++++++++++- .../reagents/chemistry/recipes/fermi.dm | 20 +++---- sound/FermiChem/SoundSources.txt | 9 ++++ sound/FermiChem/acidmelt.ogg | Bin 0 -> 107224 bytes sound/FermiChem/heatmelt.ogg | Bin 0 -> 73692 bytes 10 files changed, 103 insertions(+), 46 deletions(-) create mode 100644 sound/FermiChem/SoundSources.txt create mode 100644 sound/FermiChem/acidmelt.ogg create mode 100644 sound/FermiChem/heatmelt.ogg diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index b9c822bfcb..551e01c3ef 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -53,24 +53,24 @@ //Effects of bloodloss var/word = pick("dizzy","woozy","faint") - switch(blood_volume) - if((BLOOD_VOLUME_OKAY * blood_ratio) to (BLOOD_VOLUME_SAFE * blood_ratio)) - if(prob(5)) - to_chat(src, "You feel [word].") - adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.01, 1)) - if((BLOOD_VOLUME_BAD * blood_ratio) to (BLOOD_VOLUME_OKAY*blood_ratio)) - adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1)) - if(prob(5)) - blur_eyes(6) - to_chat(src, "You feel very [word].") - if((BLOOD_VOLUME_SURVIVE * blood_ratio) to (BLOOD_VOLUME_BAD * blood_ratio)) - adjustOxyLoss(5) - if(prob(15)) - Unconscious(rand(20,60)) - to_chat(src, "You feel extremely [word].") - if(-INFINITY to (BLOOD_VOLUME_SURVIVE * blood_ratio)) - if(!has_trait(TRAIT_NODEATH)) - death() + //switch(blood_volume) Used to be a switch statement; now it uses ifs (so blood ratio can work.) Check my logic please. + if(((BLOOD_VOLUME_OKAY * blood_ratio) < blood_volume) && (blood_volume <= (BLOOD_VOLUME_SAFE * blood_ratio))) + if(prob(5)) + to_chat(src, "You feel [word].") + adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.01, 1)) + else if(((BLOOD_VOLUME_BAD * blood_ratio) < blood_volume) && (blood_volume <=(BLOOD_VOLUME_OKAY*blood_ratio))) + adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1)) + if(prob(5)) + blur_eyes(6) + to_chat(src, "You feel very [word].") + else if( ((BLOOD_VOLUME_SURVIVE * blood_ratio) < blood_volume) && (blood_volume <= (BLOOD_VOLUME_BAD * blood_ratio))) + adjustOxyLoss(5) + if(prob(15)) + Unconscious(rand(20,60)) + to_chat(src, "You feel extremely [word].") + else if((-INFINITY < blood_volume) && (blood_volume <= (BLOOD_VOLUME_SURVIVE * blood_ratio))) + if(!has_trait(TRAIT_NODEATH)) + death() var/temp_bleed = 0 //Bleeding out @@ -309,12 +309,23 @@ /mob/living/proc/DecreaseBloodVol(var/value) blood_ratio -= value +//This is a terrible way of handling it. /mob/living/proc/ResetBloodVol() - if(ishuman(src) && src.has_trait(TRAIT_HIGH_BLOOD)) - blood_ratio = 1.2 + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if (src.has_trait(TRAIT_HIGH_BLOOD)) + blood_ratio = 1.2 + H.handle_blood() + return + blood_ratio = 1 + H.handle_blood() + return blood_ratio = 1 /mob/living/proc/AdjustBloodVol(var/value) if(blood_ratio == value) return blood_ratio = value + if(ishuman(src)) + var/mob/living/carbon/human/H = src + H.handle_blood() diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index e9ef720616..96e8c5fa1b 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -353,7 +353,8 @@ im var/iconhtml = icon2html(A, seen) for(var/mob/M in seen) to_chat(M, "[iconhtml] \The [my_atom]'s melts from the temperature!") - playsound(get_turf(A), 'sound/effects/bubbles.ogg', 80, 1) + playsound(get_turf(A), 'sound/FermiChem/heatmelt.ogg', 80, 1) + qdel(A) return else if(istype(A, /obj/item/reagent_containers/glass) && ((pH < 0.5) || (pH > 13.5)))//maybe make it higher? Though..Hmm! @@ -361,7 +362,7 @@ im var/iconhtml = icon2html(A, seen) for(var/mob/M in seen) to_chat(M, "[iconhtml] \The [my_atom]'s melts from the extreme pH!") - playsound(get_turf(A), 'sound/effects/bubbles.ogg', 80, 1) + playsound(get_turf(A), 'sound/FermiChem/acidmelt.ogg', 80, 1) qdel(A) return diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 1aba4c5a95..73b221866d 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -167,12 +167,12 @@ /obj/item/reagent_containers/glass/beaker/plastic name = "x-large beaker" - desc = "An extra-large beaker. Can hold up to 150 units." + desc = "An extra-large beaker. Can hold up to 150 units. Is able to resist acid and alkaline solutions, but melts at 444K" icon_state = "beakerwhite" materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000) volume = 150 amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,60,120,150) + possible_transfer_amounts = list(5,10,15,20,25,30,50,100,150) /obj/item/reagent_containers/glass/beaker/plastic/update_icon() icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states @@ -186,7 +186,7 @@ materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000, MAT_GOLD=1000, MAT_TITANIUM=1000) volume = 200 amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,60,120,150,200) + possible_transfer_amounts = list(5,10,15,20,25,30,50,100,200) /obj/item/reagent_containers/glass/beaker/noreact name = "cryostasis beaker" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index a7d77be496..8008c4a422 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -121,15 +121,15 @@ message_admins("PElarge started!") var/mob/living/carbon/human/o = owner var/items = o.get_contents() - for(var/obj/item/W in items) - if(W == o.w_uniform || W == o.wear_suit) - o.dropItemToGround(W, TRUE) - playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) if(o.w_uniform || o.wear_suit) to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!") owner.visible_message("[o]'s schlong suddenly bursts forth, ripping their clothes off!'") else to_chat(o, "Your emancipated trouser snake is so ripe with girth, you seriously doubt you'll be able to fit any clothes over it.") + for(var/obj/item/W in items) + if(W == o.w_uniform || W == o.wear_suit) + o.dropItemToGround(W, TRUE) + playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) return ..() @@ -286,11 +286,8 @@ else else if (resistanceTally > 150) - enthrallTally *= 0.5 phase = -1 - resistanceTally = 0 to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") - to_chat(owner, "You're now free of [master]'s influence, and fully independant oncemore.'") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) if(owner.lewd) @@ -311,6 +308,7 @@ enthrallTally *= 0.5 phase -= 1 resistanceTally = 0 + resistGrowth = 0 to_chat(owner, "You manage to shake some of the effects from your addled mind, however you can still feel yourself drawn towards [master].") //owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment, if(prob(10)) @@ -321,6 +319,7 @@ enthrallTally = 0 phase -= 1 resistanceTally = 0 + resistGrowth = 0 to_chat(owner, "The separation from [(owner.lewd?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") owner.remove_trait(TRAIT_PACIFISM, "MKUltra") if(prob(2)) @@ -334,6 +333,7 @@ to_chat(owner, "Your mind starts to heal, fixing the damage caused by the massive ammounts of chem injected into your system earlier, .") M.slurring = 0 M.confused = 0 + resistGrowth = 0 else return//If you break the mind of someone, you can't use status effects on them. @@ -521,6 +521,7 @@ redirect_component = null UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) owner.remove_trait(TRAIT_PACIFISM, "MKUltra") + to_chat(owner, "You're now free of [master]'s influence, and fully independant oncemore!'") //UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) //Should still make custom commands work after freedom, need to check. /* @@ -643,7 +644,7 @@ return else deltaResist = 2 + resistGrowth - resistGrowth += 0.1 + resistGrowth += 0.05 //distance modifer switch(DistApart) diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 4b54ea38f0..dddbda5d6f 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -284,8 +284,13 @@ if(istype(O, /obj/item/organ/genital)) organCheck = TRUE if (organCheck == FALSE) - dna.features["genitals_use_skintone"] = TRUE - dna.species.use_skintones = TRUE + if(ishuman(src)) + dna.features["genitals_use_skintone"] = TRUE + dna.species.use_skintones = TRUE + return + //So people who haven't set stuff up don't get rainbow surprises. + dna.features["cock_color"] = "#[dna.features["mcolor"]]" + dna.features["breasts_color"] = "#[dna.features["mcolor"]]" return /datum/species/proc/handle_genitals(mob/living/carbon/human/H) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 759232327e..0a1e32eda7 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -630,6 +630,20 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M) . = ..() + if(!ishuman(M)) //The monkey clause + if(volume >= 10) + var/turf/T = get_turf(M) + var/obj/item/organ/genital/breasts/B = new /obj/item/organ/genital/breasts(T) + var/list/seen = viewers(8, T) + for(var/mob/S in seen) + to_chat(S, "A pair of breasts suddenly fly out of the [M]!") + //var/turf/T2 = pick(turf in view(5, M)) + var/T2 = get_random_station_turf() + M.adjustBruteLoss(5) + M.Knockdown(50) + B.throw_at(T2, 8, 1) + M.reagents.remove_reagent(src.id, 1000) + return var/mob/living/carbon/human/H = M H.genital_override = TRUE var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") @@ -637,13 +651,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING H.emergent_genital_call() message_admins("No breasts found on init!") return - var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) B.prev_size = B.size B.cached_size = sizeConv[B.size] message_admins("init B size: [B.size], prev: [B.prev_size], cache = [B.cached_size], raw: [sizeConv[B.size]]") //if this runtimes it's cause someone's breasts are too big! /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size + if(!ishuman(M))//Just in case + return var/mob/living/carbon/human/H = M var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) //If they don't have breasts, give them breasts. @@ -742,6 +757,19 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/PElarger/on_mob_add(mob/living/carbon/M) . = ..() + if(!ishuman(M)) //Just monkeying around. + if(volume >= 10) + var/turf/T = get_turf(M) + var/obj/item/organ/genital/penis/P = new /obj/item/organ/genital/penis(T) + var/list/seen = viewers(8, T) + for(var/mob/S in seen) + to_chat(S, "A penis suddenly flies out of the [M]!") + var/T2 = get_random_station_turf() + M.adjustBruteLoss(5) + M.Knockdown(50) + P.throw_at(T2, 8, 1) + M.reagents.remove_reagent(src.id, 1000) + return var/mob/living/carbon/human/H = M H.genital_override = TRUE var/obj/item/organ/genital/penis/P = M.getorganslot("penis") @@ -754,6 +782,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING message_admins("init P len chem: [P.length], prev: [P.prev_size], cache = [P.cached_length]") /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch. + if(!ishuman(M)) + return var/mob/living/carbon/human/H = M var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index b6d888ef88..f9655777c7 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -85,7 +85,7 @@ CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = 5 //Temperature change per 1u produced HIonRelease = -0.1 //pH change per 1u reaction - RateUpLim = 5.5 //Optimal/max rate possible if all conditions are perfect + RateUpLim = 55 //Optimal/max rate possible if all conditions are perfect (NEEDS TO BE A MULTIPLE OF 10 IF RESULTS IS DOWN BY A FACTOR OF 10) FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way @@ -115,7 +115,7 @@ CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = -5 // Temperature change per 1u produced HIonRelease = 0.05 // pH change per 1u reaction - RateUpLim = 5 // Optimal/max rate possible if all conditions are perfect + RateUpLim = 20 // Optimal/max rate possible if all conditions are perfect FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics FermiExplode = TRUE // If the chemical explodes in a special way PurityMin = 0.25 @@ -151,7 +151,7 @@ CurveSharppH = 2 ThermicConstant = 1 HIonRelease = 0.5 - RateUpLim = 5 + RateUpLim = 50 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.1 @@ -183,7 +183,7 @@ CurveSharppH = 2 ThermicConstant = 1 HIonRelease = -0.5 - RateUpLim = 5 + RateUpLim = 50 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.1 @@ -215,7 +215,7 @@ CurveSharppH = 1 ThermicConstant = 20 HIonRelease = -0.5 - RateUpLim = 10 + RateUpLim = 20 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.25 // explode purity! @@ -297,7 +297,7 @@ CurveSharppH = 0.5 ThermicConstant = -2 HIonRelease = -0.05 - RateUpLim = 5 + RateUpLim = 50 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.5 @@ -328,7 +328,7 @@ CurveSharppH = 0.5 ThermicConstant = -10 HIonRelease = -0.1 - RateUpLim = 10 + RateUpLim = 20 FermiChem = TRUE PurityMin = 0.30 @@ -352,7 +352,7 @@ CurveSharppH = 1 ThermicConstant = 5 HIonRelease = 0.01 - RateUpLim = 100 + RateUpLim = 200 FermiChem = TRUE PurityMin = 0.15 @@ -373,7 +373,7 @@ CurveSharppH = 0 ThermicConstant = 0 HIonRelease = -0.01 - RateUpLim = 20 + RateUpLim = 200 FermiChem = TRUE /datum/chemical_reaction/fermi/fermiABuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this @@ -398,7 +398,7 @@ CurveSharppH = 0 ThermicConstant = 0 HIonRelease = 0.01 - RateUpLim = 20 + RateUpLim = 200 FermiChem = TRUE /datum/chemical_reaction/fermi/fermiBBuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this diff --git a/sound/FermiChem/SoundSources.txt b/sound/FermiChem/SoundSources.txt new file mode 100644 index 0000000000..15b25ccd05 --- /dev/null +++ b/sound/FermiChem/SoundSources.txt @@ -0,0 +1,9 @@ +heatmelt.ogg - from https://freesound.org/people/toiletrolltube/sounds/181483/ + from https://freesound.org/people/MrVasLuk/sounds/304619/ + from https://freesound.org/people/Benboncan/sounds/74899/ + from bubbles2.ogg +heatacid.ogg - from https://freesound.org/people/klankbeeld/sounds/233697/ + from bubbles2.ogg + from fuse.ogg + +Work is licensed under the Creative Commons and Attribution License. \ No newline at end of file diff --git a/sound/FermiChem/acidmelt.ogg b/sound/FermiChem/acidmelt.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bef257be557ef92ba9a9219ecc24dcb2aa7bf804 GIT binary patch literal 107224 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%0DiJhNJJn9m1#VvM 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 Date: Sun, 26 May 2019 01:49:58 +0100 Subject: [PATCH 157/608] Updating from Cit, pre PR. --- .../living/simple_animal/hostile/zombie.dm | 26 ++++++- code/modules/reagents/chemistry/holder.dm | 73 +++++++++---------- .../reagents/reagent_containers/glass.dm | 10 +-- .../code/datums/status_effects/chems.dm | 26 ++++--- .../code/datums/traits/positive.dm | 4 +- .../code/modules/arousal/organs/breasts.dm | 16 ++-- .../code/modules/arousal/organs/penis.dm | 2 + .../chemistry/reagents/fermi_reagents.dm | 50 ++++++------- .../reagents/chemistry/recipes/fermi.dm | 51 +++++++------ .../code/modules/reagents/objects/items.dm | 4 +- 10 files changed, 143 insertions(+), 119 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index 21c2d4804a..7d89941687 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -55,4 +55,28 @@ /mob/living/simple_animal/hostile/zombie/drop_loot() . = ..() corpse.forceMove(drop_location()) - corpse.create() \ No newline at end of file + corpse.create() + +/mob/living/simple_animal/hostile/unemployedclone + name = "Failed clone" + desc = "Somebody failed chemistry." + icon = 'icons/mob/human.dmi' + icon_state = "husk" + icon_living = "husk" + icon_dead = "husk" + mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID) + speak_chance = 0 + stat_attack = UNCONSCIOUS //braains + maxHealth = 100 + health = 100 + harm_intent_damage = 5 + melee_damage_lower = 21 + melee_damage_upper = 21 + attacktext = "bites" + attack_sound = 'sound/hallucinations/growl1.ogg' + a_intent = INTENT_HARM + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + spacewalk = FALSE + status_flags = CANPUSH + del_on_death = 0 diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 96e8c5fa1b..fc0b15804f 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -347,7 +347,7 @@ im /datum/reagents/proc/beaker_check(atom/A) if(istype(A, /obj/item/reagent_containers/glass/beaker/meta)) return - else if(istype(A, /obj/item/reagent_containers/glass/beaker/plastic)) + if((A.type == /obj/item/reagent_containers/glass/beaker/plastic)) if(chem_temp > 444)//assuming polypropylene var/list/seen = viewers(5, get_turf(A)) var/iconhtml = icon2html(A, seen) @@ -471,9 +471,6 @@ im var/special_react_result = selected_reaction.check_special_react(src) var/list/multiplier = INFINITY //Wat - for(var/B in cached_required_reagents) // - //multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - multiplier = min(multiplier, (get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. //FermiChem relies on two additional properties; pH and impurity //Temperature plays into a larger role too. @@ -483,28 +480,28 @@ im if (C.FermiChem == TRUE && !continue_reacting) message_admins("FermiChem Proc'd") - + for(var/B in cached_required_reagents) + multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01)) for(var/P in selected_reaction.results) targetVol = cached_results[P]*multiplier + //message_admins("FermiChem target volume: [targetVol]") - if ((chem_temp > C.OptimalTempMin) && (pH > (C.OptimalpHMin - C.ReactpHLim)) && (pH < (C.OptimalpHMax + C.ReactpHLim)))//To prevent pointless reactions - //if (reactedVol < targetVol) - if (fermiIsReacting == TRUE) - return 0 - else - //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) - //selected_reaction.on_reaction(src, my_atom, multiplier) - START_PROCESSING(SSprocessing, src) - //message_admins("FermiChem processing started") - selected_reaction.on_reaction(src, my_atom, multiplier) - fermiIsReacting = TRUE - fermiReactID = selected_reaction - reaction_occurred = 1 - //else - // fermiIsReacting = FALSE - // STOP_PROCESSING(SSfastprocess, src) - else if (chem_temp > C.ExplodeTemp) + if( (chem_temp <= C.ExplodeTemp) && (chem_temp >= C.OptimalTempMin)) + if( (pH >= (C.OptimalpHMin - C.ReactpHLim)) && (pH <= (C.OptimalpHMax + C.ReactpHLim)) )//To prevent pointless reactions + //if (reactedVol < targetVol) + if (fermiIsReacting == TRUE) + return 0 + else + //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) + //selected_reaction.on_reaction(src, my_atom, multiplier) + START_PROCESSING(SSprocessing, src) + //message_admins("FermiChem processing started") + selected_reaction.on_reaction(src, my_atom, multiplier) + fermiIsReacting = TRUE + fermiReactID = selected_reaction + reaction_occurred = 1 + if (chem_temp > C.ExplodeTemp) var/datum/chemical_reaction/fermi/Ferm = selected_reaction Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH) return 0 @@ -518,7 +515,7 @@ im else for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) for(var/B in cached_required_reagents) remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. @@ -566,8 +563,9 @@ im //message_admins("updating targetVol from [targetVol]") for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) - multiplier*=10 + multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01)) + message_admins("Multi:[multiplier],( reag ammount:[get_reagent_amount(B)] / req reag:[cached_required_reagents[B]]") + //multiplier*=10 if (multiplier == 0) STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE @@ -671,10 +669,6 @@ im //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) //message_admins("pH is lover limit, cur pH: [pH]") - if (purity < C.PurityMin)//If purity is below the min, blow it up. - C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) - return - //For now, purity is handled elsewhere //Calculate DeltapH (Deviation of pH from optimal) @@ -738,8 +732,6 @@ im */ //message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]") - - for(var/B in cached_required_reagents) //message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]") remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. @@ -749,20 +741,21 @@ im SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log add_reagent(P, cached_results[P]*(stepChemAmmount), null, cached_temp, purity)//add reagent function!! I THINK I can do this: //Above should reduce yeild based on holder purity. + //Purity Check + for(var/datum/reagent/R in my_atom.reagents.reagent_list) + if(P == R.id) + if (R.purity < C.PurityMin)//If purity is below the min, blow it up. + C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) + return + + C.FermiCreate(src)//proc that calls when step is done - C.FermiCreate(src) - //message_admins("purity: [purity], purity of beaker") - //message_admins("Temp before change: [chem_temp], pH after change: [pH]") //Apply pH changes and thermal output of reaction to beaker chem_temp = round(cached_temp + (C.ThermicConstant * stepChemAmmount)) //Why won't you update!!! - //adjust_thermal_energy((cached_temp*(C.ThermicConstant * stepChemAmmount *100)), 0, 1500) //(J, min_temp = 2.7, max_temp = 1000) pH += (C.HIonRelease * stepChemAmmount) - //message_admins("Temp after change: [chem_temp], pH after change: [pH]") - - + //keep track of the current reacted amount reactedVol = reactedVol + stepChemAmmount - - + //return said amount to compare for next step. return (reactedVol) /datum/reagents/proc/reactant_purity(var/datum/chemical_reaction/fermi/C, holder) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 73b221866d..14323c405f 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -108,7 +108,7 @@ /obj/item/reagent_containers/glass/beaker name = "beaker" - desc = "A beaker. It can hold up to 50 units." + desc = "A beaker. It can hold up to 50 units. Unable to withstand extreme pHes" icon = 'icons/obj/chemical.dmi' icon_state = "beaker" item_state = "beaker" @@ -152,13 +152,13 @@ /obj/item/reagent_containers/glass/beaker/jar name = "honey jar" - desc = "A jar for honey. It can hold up to 50 units of sweet delight." + desc = "A jar for honey. It can hold up to 50 units of sweet delight. Unable to withstand reagents of an extreme pH." icon = 'icons/obj/chemical.dmi' icon_state = "vapour" /obj/item/reagent_containers/glass/beaker/large name = "large beaker" - desc = "A large beaker. Can hold up to 100 units." + desc = "A large beaker. Can hold up to 100 units. Unable to withstand reagents of an extreme pH." icon_state = "beakerlarge" materials = list(MAT_GLASS=2500) volume = 100 @@ -181,7 +181,7 @@ /obj/item/reagent_containers/glass/beaker/meta name = "metamaterial beaker" - desc = "A large beaker. Can hold up to 200 units." + desc = "A large beaker. Can hold up to 200 units. Is able to withstand all chemical situations." icon_state = "beakergold" materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000, MAT_GOLD=1000, MAT_TITANIUM=1000) volume = 200 @@ -205,7 +205,7 @@ name = "bluespace beaker" desc = "A bluespace beaker, powered by experimental bluespace technology \ and Element Cuban combined with the Compound Pete. Can hold up to \ - 300 units." + 300 units. Unable to withstand reagents of an extreme pH." icon_state = "beakerbluespace" materials = list(MAT_GLASS=3000) volume = 300 diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 8008c4a422..999b345caa 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -45,6 +45,7 @@ id = "BElarger" alert_type = null var/moveCalc = 1 + var/cachedmoveCalc = 1 //var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0) //var/list/items = list() //var/items = o.get_contents() @@ -71,7 +72,7 @@ moveCalc = 1+((round(B.cached_size) - 9)/5) //Afffects how fast you move, and how often you can click. if(!B) o.remove_movespeed_modifier("megamilk") - o.next_move_modifier /= moveCalc + sizeMoveMod(1) owner.remove_status_effect(src) var/items = o.get_contents() for(var/obj/item/W in items) @@ -86,14 +87,14 @@ o.apply_damage(0.1, BRUTE, target) if(!B.cached_size == B.breast_values[B.prev_size]) o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) - o.next_move_modifier *= moveCalc + sizeMoveMod(moveCalc) return ..() else if (B.breast_values[B.size] > B.breast_values[B.prev_size]) o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) - o.next_move_modifier *= moveCalc + sizeMoveMod(moveCalc) else if (B.breast_values[B.size] < B.breast_values[B.prev_size]) o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) - o.next_move_modifier /= moveCalc + sizeMoveMod(moveCalc) if((B.cached_size) < 16) switch(round(B.cached_size)) if(9) @@ -108,7 +109,14 @@ /datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) owner.remove_movespeed_modifier("megamilk") - owner.next_move_modifier /= moveCalc + sizeMoveMod(1) + +/datum/status_effect/chem/BElarger/proc/sizeMoveMod(var/value) + if(cachedmoveCalc == value) + return + owner.next_move_modifier /= cachedmoveCalc + owner.next_move_modifier *= value + cachedmoveCalc = value /datum/status_effect/chem/PElarger @@ -152,17 +160,17 @@ if(21) to_chat(o, "Your rascally willy has become a more managable size, liberating your movements.") o.remove_movespeed_modifier("hugedick") - o.AdjustBloodVol(bloodCalc) + o.AdjustBloodVol(bloodCalc/2) if(22 to INFINITY) if(prob(2)) to_chat(o, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!") o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) - o.AdjustBloodVol(bloodCalc) + o.AdjustBloodVol(bloodCalc/2) ..() /datum/status_effect/chem/PElarger/on_remove(mob/living/carbon/human/o) owner.remove_movespeed_modifier("hugedick") - o.ResetBloodVol() + owner.ResetBloodVol() /*////////////////////////////////////////// @@ -485,8 +493,6 @@ //Truth serum? //adrenals? - //M.next_move_modifier *= 0.5 - //M.adjustStaminaLoss(-5*REM) //final tidying resistanceTally += deltaResist diff --git a/modular_citadel/code/datums/traits/positive.dm b/modular_citadel/code/datums/traits/positive.dm index a0a8f2b020..59bb98d09c 100644 --- a/modular_citadel/code/datums/traits/positive.dm +++ b/modular_citadel/code/datums/traits/positive.dm @@ -3,7 +3,7 @@ /datum/quirk/BloodPressure name = "Synthetic blood" desc = "You've got a new form of synthetic blood that increases the total blood volume inside of you!" - value = 1 + value = 0 //I honeslty dunno if this is a good trait? I just means you use more of medbays blood and make janitors madder. mob_trait = TRAIT_HIGH_BLOOD gain_text = "You feel full of blood!" lose_text = "You feel like your blood pressure went down." @@ -11,4 +11,4 @@ /datum/quirk/BloodPressure/add() var/mob/living/M = quirk_holder M.blood_ratio = 1.2 - M.blood_volume += 100 + M.blood_volume += 150 diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 17eb332485..138e8bcf73 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -84,15 +84,15 @@ //Allows breasts to grow and change size, with sprite changes too. //maximum wah //Comical sizes slow you down in movement and actions. -//Rediculous sizes remove hands. +//Rediculous sizes makes you more cumberson. //Should I turn someone with meter wide... assets into a blob? //this is far too lewd wah /obj/item/organ/genital/breasts/update_size()//wah - //var/mob/living/carbon/human/o = owner - //var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") - //message_admins("Breast size at start: [size], [cached_size], [owner]") - if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!(Why does this runtime??) + + if(!ishuman(owner) || !owner) + return + if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!(Why does this runtime??) - fixed to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") src.Remove(owner) switch(round(cached_size)) @@ -113,8 +113,7 @@ statuscheck = TRUE if(16 to INFINITY) //if Rediculous size = cached_size - //message_admins("1. [breast_values[size]] vs [breast_values[prev_size]] || [size] vs [prev_size]") - //message_admins("1. [prev_size] vs [breast_values[size]]") + if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this. if (prev_size == 0) prev_size = "flat" @@ -133,8 +132,9 @@ var/mob/living/carbon/human/H = owner H.Force_update_genitals() prev_size = size - + /* for future use: else if (cached_size >= 16) if(size != "huge") to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom.")// taking both of your hands to hold!.") size = "huge" + */ diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index fb5f7739f0..553b7983f0 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -26,6 +26,8 @@ /obj/item/organ/genital/penis/update_size() var/mob/living/carbon/human/o = owner + if(!ishuman(o) || !o) + return if(cached_length < 0)//I don't actually know what round() does to negative numbers, so to be safe!! var/obj/item/organ/genital/penis/P = o.getorganslot("penis") to_chat(o, "You feel your tallywacker shrinking away from your body as your groin flattens out!") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 0a1e32eda7..5273022c2a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -379,28 +379,20 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING playerClone = TRUE M.next_move_modifier = 1 M.nutrition -= 500 - //reaction_mob(SM, )I forget what this is for + //Damage the clone SM.blood_volume = (BLOOD_VOLUME_NORMAL*SM.blood_ratio)/2 SM.adjustCloneLoss(60, 0) SM.setBrainLoss(40) SM.nutrition = startHunger/2 - //var/datum/reagents/SMR = SM - ///datum/reagents - //var/mob/living/carbon/human has a holder, carbon does not - // You need to add to a holder. - // reagentS not reagent (?) - //SM.create_reagents() - //Really hacky way to deal with this stupid problem I have + //Really hacky way to deal with this stupid problem I have, and heal the clone. I think around 30u will make a healthy clone. SM.reagents.add_reagent("SDGFheal", volume) - //holder.add_reagent("SDGFheal", volume) M.reagents.remove_reagent(src.id, 999) - //SMR = locate(/datum/reagents in SM) - //holder.trans_to(SMR, volume) //Give the new clone an idea of their character //SHOULD print last 5 messages said by the original to the clones chatbox + //I don't think it works however. var/list/say_log = M.logging[LOG_SAY] var/recent_speech if(LAZYLEN(say_log) > 5) @@ -567,12 +559,11 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.visible_message("[M] suddenly shudders, and splits into a funky smelling copy of themselves!") M.emote("scream") M.adjustToxLoss(30, 0) - var/mob/living/simple_animal/hostile/zombie/ZI = new(get_turf(M.loc)) + var/mob/living/simple_animal/hostile/unemployedclone/ZI = new(get_turf(M.loc)) ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name ZI.desc = "[M]'s clone, gone horribly wrong." - ZI.zombiejob = FALSE //ZI.updateappearance(mutcolor_update=1) M.reagents.remove_reagent(src.id, 20) else//easier to deal with @@ -631,7 +622,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M) . = ..() if(!ishuman(M)) //The monkey clause - if(volume >= 10) + if(volume >= 15) //To prevent monkey breast farms var/turf/T = get_turf(M) var/obj/item/organ/genital/breasts/B = new /obj/item/organ/genital/breasts(T) var/list/seen = viewers(8, T) @@ -649,12 +640,12 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") if(!B) H.emergent_genital_call() - message_admins("No breasts found on init!") + //message_admins("No breasts found on init!") return var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) B.prev_size = B.size B.cached_size = sizeConv[B.size] - message_admins("init B size: [B.size], prev: [B.prev_size], cache = [B.cached_size], raw: [sizeConv[B.size]]") //if this runtimes it's cause someone's breasts are too big! + //message_admins("init B size: [B.size], prev: [B.prev_size], cache = [B.cached_size], raw: [sizeConv[B.size]]") //if this runtimes it's cause someone's breasts are too big! /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size if(!ishuman(M))//Just in case @@ -662,7 +653,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/mob/living/carbon/human/H = M var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) //If they don't have breasts, give them breasts. - message_admins("No breasts found!") + //message_admins("No breasts found!") var/obj/item/organ/genital/breasts/nB = new nB.Insert(M) if(nB) @@ -703,7 +694,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(P) P.cached_length = P.cached_length - 0.1 - message_admins("lewdsnek size: [P.size], [P.cached_length], [holder]") + //message_admins("lewdsnek size: [P.size], [P.cached_length], [holder]") P.update() if(T) T.Remove(M) @@ -758,7 +749,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/PElarger/on_mob_add(mob/living/carbon/M) . = ..() if(!ishuman(M)) //Just monkeying around. - if(volume >= 10) + if(volume >= 15) //to prevent monkey penis farms var/turf/T = get_turf(M) var/obj/item/organ/genital/penis/P = new /obj/item/organ/genital/penis(T) var/list/seen = viewers(8, T) @@ -1133,7 +1124,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y //ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth //InverseChemVal = 0.5 //InverseChem = "enthrall" //At really impure vols, it just becomes 100% inverse - data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Isabelle Foster") + data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Fermis Yakumo") creatorID = "honkatonkbramblesnatch"//ckey creatorGender = "Mistress" creatorName = "Fermis Yakumo" @@ -1284,7 +1275,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y DoNotSplit = TRUE var/mob/living/carbon/love -/datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system. +/datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system,Gives a positive moodlet if close, gives brain damagea and a negative moodlet if not close enough. if(!M.has_status_effect(STATUS_EFFECT_INLOVE)) var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers for(var/victim in seen) @@ -1310,7 +1301,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y M.Stun(10) M.emote("whimper")//does this exist? to_chat(M, " You're overcome with a desire to see [love].") - M.adjustBrainLoss(5) + M.adjustBrainLoss(1)//I found out why everyone was so damaged! ..() /datum/reagent/fermi/enthrallExplo/on_mob_delete(mob/living/carbon/M) @@ -1458,6 +1449,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y ImpureChem = "naninte_b_goneTox" //If you make an inpure chem, it stalls growth InverseChemVal = 0.25 InverseChem = "naninte_b_goneTox" //At really impure vols, it just becomes 100% inverse + taste_description = "what can only be described as licking a battery." pH = 9 /datum/reagent/fermi/naninte_b_gone/on_mob_life(mob/living/carbon/C) @@ -1465,13 +1457,13 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y GET_COMPONENT_FROM(N, /datum/component/nanites, C) if(isnull(N)) return ..() - N.regen_rate = -0.25//This seems really high + N.nanite_volume = -0.55//0.5 seems to be the default to me, so it'll neuter them. ..() /datum/reagent/fermi/naninte_b_gone/overdose_process(mob/living/carbon/C) //var/component/nanites/N = M.GetComponent(/datum/component/nanites) GET_COMPONENT_FROM(N, /datum/component/nanites, C) - if(prob(20)) + if(prob(5)) to_chat(C, "The residual voltage from the nanites causes you to seize up!") C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) if(prob(10)) @@ -1481,7 +1473,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y to_chat(C, "The nanintes short circuit within your system!") if(isnull(N)) return ..() - N.regen_rate = -1//12.5 seems crazy high? + N.nanite_volume = -2//12.5 seems crazy high? ..() //Unobtainable, used if SDGF is impure but not too impure @@ -1493,10 +1485,10 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y //Increases shock events. /datum/reagent/fermi/naninte_b_goneTox/on_mob_life(mob/living/carbon/C)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good) - if(prob(10)) + if(prob(5)) to_chat(C, "The residual voltage in your system causes you to seize up!") C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) - if(prob(10)) + if(prob(50)) //empulse((get_turf(C)), 2, 1, 1)//So the nanites randomize var/atom/T = C T.emp_act(EMP_HEAVY) @@ -1605,7 +1597,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/fermiABuffer/on_new() if(LAZYLEN(holder.reagent_list) == 1) return - pH = ((holder.pH * holder.total_volume)+(3 * src.volume))/(holder.total_volume + src.volume) + pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) holder.remove_reagent(src.id, 1000) ..() @@ -1621,7 +1613,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/fermiBBuffer/on_new() if(LAZYLEN(holder.reagent_list) == 1) return - pH = ((holder.pH * holder.total_volume)+(11 * src.volume))/(holder.total_volume + src.volume) + pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) holder.remove_reagent(src.id, 1000) ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index f9655777c7..654f7f6073 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -101,7 +101,7 @@ name = "Synthetic-derived growth factor" id = "SDGF" results = list("SDGF" = 0.3) - required_reagents = list("stable_plasma" = 0.5, "slimejelly" = 0.5, "synthflesh" = 1, "blood" = 1) + required_reagents = list("stable_plasma" = 0.5, "slimejelly" = 0.5, "synthflesh" = 0.1, "blood" = 0.1) mix_message = "the reaction gives off a blorble!" //FermiChem vars: OptimalTempMin = 600 // Lower area of bell curve for determining heat based rate reactions @@ -115,7 +115,7 @@ CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = -5 // Temperature change per 1u produced HIonRelease = 0.05 // pH change per 1u reaction - RateUpLim = 20 // Optimal/max rate possible if all conditions are perfect + RateUpLim = 2 // Optimal/max rate possible if all conditions are perfect FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics FermiExplode = TRUE // If the chemical explodes in a special way PurityMin = 0.25 @@ -151,7 +151,7 @@ CurveSharppH = 2 ThermicConstant = 1 HIonRelease = 0.5 - RateUpLim = 50 + RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.1 @@ -183,7 +183,7 @@ CurveSharppH = 2 ThermicConstant = 1 HIonRelease = -0.5 - RateUpLim = 50 + RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.1 @@ -201,8 +201,8 @@ /datum/chemical_reaction/fermi/astral //done //BORKEN name = "Astrogen" id = "astral" - results = list("astral" = 0.5) - required_reagents = list("eigenstate" = 0.1, "plasma" = 0.2, "synaptizine" = 0.1, "aluminium" = 0.5) + results = list("astral" = 5) + required_reagents = list("eigenstate" = 1, "plasma" = 1, "synaptizine" = 1, "aluminium" = 5) //FermiChem vars: OptimalTempMin = 700 OptimalTempMax = 800 @@ -213,9 +213,9 @@ CatalystFact = 0 CurveSharpT = 1 CurveSharppH = 1 - ThermicConstant = 20 + ThermicConstant = 25 HIonRelease = -0.5 - RateUpLim = 20 + RateUpLim = 10 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.25 // explode purity! @@ -225,7 +225,7 @@ name = "MKUltra" id = "enthrall" results = list("enthrall" = 0.3) - required_reagents = list("iron" = 0.1, "iodine" = 0.1) + required_reagents = list("iron" = 1, "iodine" = 1) //required_reagents = list("cocoa" = 0.1, "astral" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) required_catalysts = list("blood" = 0.1) mix_message = "the reaction gives off a burgundy plume of smoke!" @@ -241,7 +241,7 @@ CurveSharppH = 4 ThermicConstant = 10 HIonRelease = -0.1 - RateUpLim = 5 + RateUpLim = 2 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.2 @@ -291,13 +291,13 @@ ExplodeTemp = 750 OptimalpHMin = 2 OptimalpHMax = 5 - ReactpHLim = 1 + ReactpHLim = 3 //CatalystFact = 0 //To do 1 - CurveSharpT = 4 + CurveSharpT = 8 CurveSharppH = 0.5 ThermicConstant = -2 HIonRelease = -0.05 - RateUpLim = 50 + RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.5 @@ -314,7 +314,7 @@ name = "Furranium" id = "furranium" results = list("furranium" = 0.5) - required_reagents = list("aphro" = 0.1, "moonsugar" = 0.1, "silver" = 0.2, "salglu_solution" = 0.1) + required_reagents = list("aphro" = 1, "moonsugar" = 1, "silver" = 2, "salglu_solution" = 1) //mix_message = "" //FermiChem vars: OptimalTempMin = 350 @@ -328,10 +328,13 @@ CurveSharppH = 0.5 ThermicConstant = -10 HIonRelease = -0.1 - RateUpLim = 20 + RateUpLim = 2 FermiChem = TRUE PurityMin = 0.30 +//FOR INSTANT REACTIONS - DO NOT MULTIPLY LIMIT BY 10. +//There's a weird rounding error or something ugh. + //Nano-b-gone /datum/chemical_reaction/fermi/naninte_b_gone//done test name = "Naninte bain" @@ -352,7 +355,7 @@ CurveSharppH = 1 ThermicConstant = 5 HIonRelease = 0.01 - RateUpLim = 200 + RateUpLim = 20 FermiChem = TRUE PurityMin = 0.15 @@ -365,19 +368,21 @@ OptimalTempMin = 250 OptimalTempMax = 500 ExplodeTemp = 9999 //check to see overflow doesn't happen! - OptimalpHMin = 2.5 - OptimalpHMax = 3.5 + OptimalpHMin = 2 + OptimalpHMax = 6 ReactpHLim = 0 //CatalystFact = 0 //To do 1 CurveSharpT = 1 CurveSharppH = 0 ThermicConstant = 0 HIonRelease = -0.01 - RateUpLim = 200 + RateUpLim = 20 FermiChem = TRUE +//This reaction bugs and turns everything in it to FermiABuffer - but now it's a feature instead! /datum/chemical_reaction/fermi/fermiABuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this var/datum/reagent/fermi/fermiABuffer/Fa = locate(/datum/reagent/fermi/fermiABuffer) in my_atom.reagents.reagent_list + Fa.pH = my_atom.reagents.pH Fa.data = "merge" /datum/chemical_reaction/fermi/fermiBBuffer//done test @@ -390,17 +395,19 @@ OptimalTempMin = 250 OptimalTempMax = 500 ExplodeTemp = 9999 //check to see overflow doesn't happen! - OptimalpHMin = 10.5 - OptimalpHMax = 11.5 + OptimalpHMin = 8 + OptimalpHMax = 12 ReactpHLim = 0 //CatalystFact = 0 //To do 1 CurveSharpT = 1 CurveSharppH = 0 ThermicConstant = 0 HIonRelease = 0.01 - RateUpLim = 200 + RateUpLim = 15 FermiChem = TRUE +//This reaction bugs and turns everything in it to FermiBBuffer - but now it's a feature instead! /datum/chemical_reaction/fermi/fermiBBuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this var/datum/reagent/fermi/fermiBBuffer/Fb = locate(/datum/reagent/fermi/fermiBBuffer) in my_atom.reagents.reagent_list + Fb.pH = my_atom.reagents.pH Fb.data = "merge" diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index b9adf8f7c3..26636f049a 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -51,7 +51,7 @@ if(used == TRUE) to_chat(user, "[user] has already been used!") return - switch(cont.reagents.pH) + switch(round(cont.reagents.pH, 1)) if(14 to INFINITY) color = "#462c83" if(13 to 14) @@ -82,5 +82,5 @@ color = "#ef1d26" if(-INFINITY to 1) color = "#c6040c" - desc += " The paper looks to be around a pH of [round(cont.reagents.pH)]" + desc += " The paper looks to be around a pH of [round(cont.reagents.pH, 1)]" used = TRUE From 87deaf07c5acf9277503a5df53f0cb37cd18029d Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 26 May 2019 01:55:59 +0100 Subject: [PATCH 158/608] Update breasts.dm I do not like how git works sometimes. --- modular_citadel/code/modules/arousal/organs/breasts.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 138e8bcf73..57343d5997 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -132,7 +132,7 @@ var/mob/living/carbon/human/H = owner H.Force_update_genitals() prev_size = size - /* for future use: + /* for future use, DO NOT DELETE: else if (cached_size >= 16) if(size != "huge") to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom.")// taking both of your hands to hold!.") From bd85095590cb5ad7fc0b6b74b12ac7a14f8a3c7d Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 26 May 2019 05:34:28 +0100 Subject: [PATCH 159/608] Prebed tweaks --- code/modules/reagents/chemistry/holder.dm | 11 +++-- code/modules/surgery/organs/vocal_cords.dm | 30 ++++++------ .../code/datums/status_effects/chems.dm | 46 ++++++++++--------- .../code/modules/arousal/organs/breasts.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 16 ++++--- .../reagents/chemistry/recipes/fermi.dm | 31 ++++++++----- tgstation.dme | 12 ++--- 7 files changed, 86 insertions(+), 62 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index e4aa9fcdc2..a1359072a4 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -347,7 +347,7 @@ im /datum/reagents/proc/beaker_check(atom/A) if(istype(A, /obj/item/reagent_containers/glass/beaker/meta)) return - if((A.type == /obj/item/reagent_containers/glass/beaker/plastic)) + if(istype(A, /obj/item/reagent_containers/glass/beaker/plastic)) if(chem_temp > 444)//assuming polypropylene var/list/seen = viewers(5, get_turf(A)) var/iconhtml = icon2html(A, seen) @@ -361,6 +361,7 @@ im var/list/seen = viewers(5, get_turf(A)) var/iconhtml = icon2html(A, seen) for(var/mob/M in seen) + message_admins("pH at melting: [pH]") to_chat(M, "[iconhtml] \The [my_atom]'s melts from the extreme pH!") playsound(get_turf(A), 'sound/FermiChem/acidmelt.ogg', 80, 1) qdel(A) @@ -723,7 +724,7 @@ im //TODO: Check overall beaker purity with proc //Then adjust purity of result AND yeild ammount with said purity. - stepChemAmmount *= reactant_purity(C) + purity *= reactant_purity(C) // End. /* @@ -758,15 +759,17 @@ im //return said amount to compare for next step. return (reactedVol) +//Currently calculates it irrespective of required reagents at the start /datum/reagents/proc/reactant_purity(var/datum/chemical_reaction/fermi/C, holder) var/list/cached_reagents = reagent_list - var/i + var/i = 0 var/cachedPurity //var/fermiChem for(var/datum/reagent/R in my_atom.reagents.reagent_list) if (R in cached_reagents) cachedPurity += R.purity i++ + //message_admins("total reactant purity = [cachedPurity/i]") return cachedPurity/i /datum/reagents/proc/isolate_reagent(reagent) @@ -952,7 +955,7 @@ im R.data = data R.on_new(data) if(R.addProc == TRUE) - R.on_new(src) + R.on_new(pH) //Add more as desired. if(istype(D, /datum/reagent/fermi))//Is this a fermichem? var/datum/reagent/fermi/Ferm = D //It's Fermi time! Ferm.FermiNew(my_atom) //Seriously what is "data" ???? diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index aca74359fc..389dc2a335 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -837,7 +837,7 @@ if(length(message)) E.enthrallTally += (power_multiplier*(((length(message))/200) + 1)) //encourage players to say more than one word. else - E.enthrallTally += power_multiplier*1.25 + E.enthrallTally += power_multiplier*1.25 //thinking about it, I don't know how this can proc if(L.canbearoused) if(L.lewd) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] is so nice to listen to."), 5) @@ -851,10 +851,10 @@ power_multiplier *= distancelist[get_dist(user, V)+1] //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values if (L.lewd) - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] has praised me!!"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] has praised me!!"), 5) if(L.has_trait(TRAIT_NYMPHO)) L.adjustArousalLoss(2*power_multiplier) - /* TODO: ADD THIS IN WHEN MASO IS MERGED + /*enable when maso is added if(L.has_trait(TRAIT_MASO)) E.enthrallTally -= power_multiplier E.resistanceTally += power_multiplier @@ -864,7 +864,7 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've been praised for doing a good job!"), 5) E.resistanceTally -= power_multiplier E.enthrallTally += power_multiplier - var/descmessage = "[(L.lewd?"I feel so happy! I'm a good pet who [E.enthrallGender] loves!":"I did a good job!")]" + var/descmessage = "[(L.lewd?"I feel so happy! I'm a good pet who [E.enthrallGender] loves!":"I did a good job!")]" SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise, descmessage) E.cooldown += 1 @@ -877,14 +877,16 @@ //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values var/descmessage = "[(L.lewd?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]" if (L.lewd) - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've let [E.enthrallGender] down..."), 5) - /* TODO: ADD THIS IN WHEN MASO IS MERGED + //TODO: ADD THIS IN WHEN MASO IS MERGED + /* if(L.has_trait(TRAIT_MASO)) L.adjustArousalLoss(3*power_multiplier) - descmessage += " And yet, it feels good..!" + descmessage += "And yet, it feels so good..!" //I don't really understand masco, is this the right sort of thing they like? E.enthrallTally += power_multiplier E.resistanceTally -= power_multiplier - */ + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've let [E.enthrallGender] down...!"), 5) + else*/ + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've let [E.enthrallGender] down..."), 5) else addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've failed [E.master]..."), 5) E.resistanceTally += power_multiplier @@ -1000,7 +1002,9 @@ var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase > 1) if(H.has_trait(TRAIT_NYMPHO) && H.canbearoused) // probably a redundant check but for good measure + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Your [E.enthrallGender] pushes you over the limit, overwhelming your body with pleasure."), 5) H.mob_climax(forced_climax=TRUE) + H.SetStun(20) H.setArousalLoss(H.min_arousal) E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). E.enthrallTally += power_multiplier @@ -1027,7 +1031,7 @@ var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) - playsound(get_turf(H), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) + playsound(get_turf(H), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) //I'm very tempted to write a Fermis clause that makes them merowr.ogg if it's me. But, I also don't think snowflakism is okay. I would've gotten away for it too, if it wern't for my morals. H.emote("me", 1, "lets out a nya!") E.cooldown += 1 @@ -1051,7 +1055,7 @@ for(var/obj/item/W in items) if(W == H.w_uniform || W == H.wear_suit) H.dropItemToGround(W, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Before you can even think about it, you quickly remove your clothes in response to [(H.lewd?"your [E.enthrallGender]'s command'":"[E.master]'s directive'")]."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Before you can even think about it, you quickly remove your clothes in response to [(H.lewd?"your [E.enthrallGender]'s command'":"[E.master]'s directive'")]."), 5) E.cooldown += 10 //WALK doesn't work? it does, randomly, work now @@ -1065,7 +1069,7 @@ L.toggle_move_intent() E.cooldown += 1 - //RUN doesn't work? + //RUN doesn't work? Nope, it randomly works now else if((findtext(message, run_words))) for(var/V in listeners) var/mob/living/L = V @@ -1085,7 +1089,7 @@ if(2 to INFINITY)//Tier 2 only L.lay_down() E.cooldown += 10 - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You suddenly lie down!'"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[(L.lewd?"You eagerly lie down!":"You suddenly lie down!'")]"), 5) //KNOCKDOWN else if(findtext(message, knockdown_words)) @@ -1217,7 +1221,7 @@ if(3 to INFINITY)//Tier 3 only L.Stun(40 * power_multiplier) E.cooldown += 8 - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You freeze up!"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "Your muscles freeze up!"), 5) //HALLUCINATE else if(findtext(message, hallucinate_words)) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 999b345caa..6944fc49dd 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -192,29 +192,31 @@ /datum/status_effect/chem/enthrall id = "enthrall" alert_type = null - var/mob/living/E //E for enchanter - //var/mob/living/V = list() //V for victims var/enthrallTally = 1 //Keeps track of the enthralling process var/resistanceTally = 0 //Keeps track of the resistance var/deltaResist //The total resistance added per resist click - //var/deltaEnthrall //currently unused (i think) + var/phase = 1 //-1: resisted state, due to be removed.0: sleeper agent, no effects unless triggered 1: initial, 2: 2nd stage - more commands, 3rd: fully enthralled, 4th Mindbroken + var/status = null //status effects var/statusStrength = 0 //strength of status effect + var/mob/living/master //Enchanter's person var/enthrallID //Enchanter's ckey var/enthrallGender //Use master or mistress - //var/mob/living/master == null + var/mental_capacity //Higher it is, lower the cooldown on commands, capacity reduces with resistance. - //var/mental_cost //Current cost of custom triggers - //var/mindbroken = FALSE //Not sure I use this, replaced with phase 4 var/datum/weakref/redirect_component //resistance //var/datum/weakref/redirect_component2 //say //var/datum/weakref/redirect_component3 //hear + var/distancelist = list(2,1.5,1,0.8,0.6,0.5,0.4,0.3,0.2) //Distance multipliers + var/withdrawal = FALSE //withdrawl var/withdrawalTick = 0 //counts how long withdrawl is going on for + var/list/customTriggers = list() //the list of custom triggers (maybe have to split into two) + var/cooldown = 0 var/cooldownMsg = TRUE var/cTriggered = FALSE @@ -244,7 +246,7 @@ mental_capacity = 500 - B.get_brain_damage() var/message = "[(owner.lewd?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) - to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can still repeatedly resist their effects! (Mash resist to fight back!!)") + to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") return ..() /datum/status_effect/chem/enthrall/tick() @@ -267,8 +269,8 @@ mental_capacity += 10 //mindshield check - if(M.has_trait(TRAIT_MINDSHIELD))//If you manage to enrapture a head, wow, GJ. - resistanceTally += 5 + if(M.has_trait(TRAIT_MINDSHIELD))//If you manage to enrapture a head, wow, GJ. (resisting gives a bigger bonus with a mindshield) + resistanceTally += 2 if(prob(10)) to_chat(owner, "You feel lucidity returning to your mind as the mindshield buzzes, attempting to return your brain to normal function.") if(phase == 4) @@ -301,18 +303,18 @@ if(owner.lewd) to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") if (2) //partially enthralled - if (enthrallTally > 200) + if (enthrallTally > 250) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 resistanceTally /= 2 if(owner.lewd) - to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") - to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. + to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") + to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. else to_chat(owner, "You are unable to put up a resistance any longer, and now are under the control of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [master] in death. ") owner.add_trait(TRAIT_PACIFISM, "MKUltra") //IMPORTANT - else if (resistanceTally > 200) + else if (resistanceTally > 250) enthrallTally *= 0.5 phase -= 1 resistanceTally = 0 @@ -332,7 +334,7 @@ owner.remove_trait(TRAIT_PACIFISM, "MKUltra") if(prob(2)) if(owner.lewd) - to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") + to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken if (mental_capacity >= 499 && (owner.getBrainLoss() >=20 || M.has_trait(TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra")) phase = 2 @@ -362,14 +364,14 @@ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") - if(9 to INFINITY)//If + if(9 to INFINITY)//If they're not nearby, enable withdrawl effects. withdrawal = TRUE //Withdrawal subproc: if (withdrawal == TRUE)//Your minions are really REALLY needy. switch(withdrawalTick)//denial if(5)//To reduce spam - to_chat(owner, "You are unable to complete your [master]'s orders without their presence, and any commands given to you prior are not in effect until you are back with them.") + to_chat(owner, "You are unable to complete your [master]'s orders without their presence, and any commands and objectives given to you prior are not in effect until you are back with them.") if(10 to 35)//Gives wiggle room, so you're not SUPER needy if(prob(5)) to_chat(owner, "You're starting to miss [(owner.lewd?"your [enthrallGender]":"[master]")].") @@ -422,7 +424,7 @@ var/message = "[(owner.lewd?"I'm all alone, It's so hard to continute without [enthrallGender]...":"I really need to find [master]!!!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4, message) to_chat(owner, "You can hardly find the strength to continue without your [enthrallGender].") - if(120 to 140) //depression + if(120 to 140) //depression 2, revengeance if(prob(15)) owner.Stun(50) owner.emote("cry")//does this exist? @@ -447,7 +449,7 @@ owner.adjustBrainLoss(2) M.hallucination += 50 - withdrawalTick += 0.5 + withdrawalTick += 0.5//Usually enough to leave you with a major brain trauma, but not kill you. //Status subproc - statuses given to you from your Master //currently 3 statuses; antiresist -if you press resist, increases your enthrallment instead, HEAL - which slowly heals the pet, CHARGE - which breifly increases speed, PACIFY - makes pet a pacifist, ANTIRESIST - frustrates resist presses. @@ -498,19 +500,20 @@ resistanceTally += deltaResist deltaResist = 0 if (cooldown > 0) - cooldown -= (1 + (mental_capacity/1000)) + cooldown -= (0.8 + (mental_capacity/500)) cooldownMsg = FALSE else if (cooldownMsg == FALSE) if(master.lewd) - to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") + to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") else to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") cooldownMsg = TRUE cooldown = 0 if (tranceTime > 0) //custom trances only last 50 ticks. tranceTime -= 1 - else + else if (!tranceTime == null) //remove trance after. M.remove_status_effect(/datum/status_effect/trance) + tranceTime = null //..() //Remove all stuff @@ -579,6 +582,7 @@ if (C.has_trait(TRAIT_NYMPHO)) if (C.getArousalLoss() > 80) C.mob_climax(forced_climax=TRUE) + C.SetStun(20)//We got your stun effects in somewhere, Kev. else C.adjustArousalLoss(10) else diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 43c75bce48..f10f9916a9 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -60,7 +60,7 @@ desc += " They're very small and flatchested, however." else desc += " You estimate that they're [uppertext(size)]-cups." - string = "breasts_[lowertext(shape)]_[size]-s" + //string = "breasts_[lowertext(shape)]_[size]-s" if(producing && aroused_state) desc += " They're leaking [fluid_id]." diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 5273022c2a..2da168a388 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -122,7 +122,7 @@ addiction_stage2_end = 30 addiction_stage3_end = 41 addiction_stage4_end = 44 //Incase it's too long - var/location_created + var/turf/open/location_created var/turf/open/location_return = null var/addictCyc1 = 0 var/addictCyc2 = 0 @@ -1185,6 +1185,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) + . = ..() if(purity < 0.5)//DO NOT SPLIT INTO DIFFERENT CHEM: This relies on DoNotSplit - has to be done this way. if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. if(M.has_status_effect(STATUS_EFFECT_INLOVE)) @@ -1287,7 +1288,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(!love) return M.apply_status_effect(STATUS_EFFECT_INLOVE, love) - to_chat(M, "You develop deep feelings for [love], your heart beginning to race as you look upon them with new eyes.") + to_chat(M, "You develop overwhelmingly deep feelings for [love], your heart beginning to race as you look upon them with new eyes. You are determined to keep them safe above all other priorities.") else if(get_dist(M, love) < 8) if(M.has_trait(TRAIT_NYMPHO)) //Add this back when merged/updated. @@ -1504,7 +1505,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y name = "Acid vapour" id = "fermiAcid" description = "Someone didn't do like an otter, and add acid to water." - taste_description = "acid burns, ow!!" + taste_description = "acid burns, ow" + color = "#000000" pH = 0 /datum/reagent/fermi/fermiAcid/on_mob_life(mob/living/carbon/C, method) @@ -1577,6 +1579,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y id = "fermiTox" description = "You should be really careful with this...! Also, how did you get this?" data = "merge" + color = "#000000" /datum/reagent/fermi/fermiTox/on_mob_life(mob/living/carbon/C, method) if(C.dna && istype(C.dna.species, /datum/species/jelly)) @@ -1592,10 +1595,11 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y taste_description = "an acidy sort of taste, blech." color = "#fbc314" addProc = FALSE - pH = 3 + pH = 6 -/datum/reagent/fermi/fermiABuffer/on_new() +/datum/reagent/fermi/fermiABuffer/on_new(oldpH) if(LAZYLEN(holder.reagent_list) == 1) + return pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) holder.remove_reagent(src.id, 1000) @@ -1608,7 +1612,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y taste_description = "an soapy sort of taste, blech." color = "#3853a4" addProc = FALSE - pH = 11 + pH = 8 /datum/reagent/fermi/fermiBBuffer/on_new() if(LAZYLEN(holder.reagent_list) == 1) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 654f7f6073..f1c158d4cb 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -30,8 +30,9 @@ pHmod = 2 for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents - if (istype(reagent, /datum/reagent/fermi)) + /*if (istype(reagent, /datum/reagent/fermi)) continue //Don't allow fermichems into the mix (fermi explosions are handled elsewhere and it's a huge pain) + */ R.add_reagent(reagent, reagent.volume) if (reagent.purity < 0.6) ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 @@ -114,11 +115,11 @@ CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = -5 // Temperature change per 1u produced - HIonRelease = 0.05 // pH change per 1u reaction - RateUpLim = 2 // Optimal/max rate possible if all conditions are perfect + HIonRelease = 0.05 // pH change per 1u reaction (inverse for some reason) + RateUpLim = 3 // Optimal/max rate possible if all conditions are perfect FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics FermiExplode = TRUE // If the chemical explodes in a special way - PurityMin = 0.25 + PurityMin = 0.2 /datum/chemical_reaction/fermi/SDGF/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies var/turf/T = get_turf(my_atom) @@ -201,8 +202,8 @@ /datum/chemical_reaction/fermi/astral //done //BORKEN name = "Astrogen" id = "astral" - results = list("astral" = 5) - required_reagents = list("eigenstate" = 1, "plasma" = 1, "synaptizine" = 1, "aluminium" = 5) + results = list("astral" = 0.5) + required_reagents = list("eigenstate" = 0.1, "plasma" = 0.1, "synaptizine" = 0.1, "aluminium" = 0.5) //FermiChem vars: OptimalTempMin = 700 OptimalTempMax = 800 @@ -328,7 +329,7 @@ CurveSharppH = 0.5 ThermicConstant = -10 HIonRelease = -0.1 - RateUpLim = 2 + RateUpLim = 10 FermiChem = TRUE PurityMin = 0.30 @@ -379,11 +380,15 @@ RateUpLim = 20 FermiChem = TRUE -//This reaction bugs and turns everything in it to FermiABuffer - but now it's a feature instead! +//This reaction bugs and turns everything in it to FermiABuffer - but now it's a feature instead! And then I fixed it anyways /datum/chemical_reaction/fermi/fermiABuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this var/datum/reagent/fermi/fermiABuffer/Fa = locate(/datum/reagent/fermi/fermiABuffer) in my_atom.reagents.reagent_list + if (Fa.pH <= 3) + Fa.pH = 3 + Fa.data = 3 + return Fa.pH = my_atom.reagents.pH - Fa.data = "merge" + Fa.data = Fa.pH /datum/chemical_reaction/fermi/fermiBBuffer//done test name = "Ethyl Ethanoate buffer" @@ -406,8 +411,12 @@ RateUpLim = 15 FermiChem = TRUE -//This reaction bugs and turns everything in it to FermiBBuffer - but now it's a feature instead! +//This reaction bugs and turns everything in it to FermiBBuffer - but now it's a feature instead! And then I fixed it anyways /datum/chemical_reaction/fermi/fermiBBuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this var/datum/reagent/fermi/fermiBBuffer/Fb = locate(/datum/reagent/fermi/fermiBBuffer) in my_atom.reagents.reagent_list + if (Fb.pH >= 11) + Fb.pH = 11 + Fb.data = 11 + return Fb.pH = my_atom.reagents.pH - Fb.data = "merge" + Fb.data = Fb.pH diff --git a/tgstation.dme b/tgstation.dme index c653b521b2..1eb169aa9e 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2504,12 +2504,6 @@ #include "code\modules\research\server.dm" #include "code\modules\research\stock_parts.dm" #include "code\modules\research\designs\AI_module_designs.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm" #include "code\modules\research\designs\biogenerator_designs.dm" #include "code\modules\research\designs\bluespace_designs.dm" #include "code\modules\research\designs\comp_board_designs.dm" @@ -2529,6 +2523,12 @@ #include "code\modules\research\designs\stock_parts_designs.dm" #include "code\modules\research\designs\telecomms_designs.dm" #include "code\modules\research\designs\weapon_designs.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm" #include "code\modules\research\machinery\_production.dm" #include "code\modules\research\machinery\circuit_imprinter.dm" #include "code\modules\research\machinery\departmental_circuit_imprinter.dm" From 4cb697d2ec371c53d8c39e3e1a4fcf7baf7f7490 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 26 May 2019 17:37:20 +0100 Subject: [PATCH 160/608] Final changes before checks. --- code/datums/brain_damage/severe.dm | 1 + .../antagonists/valentines/valentine.dm | 25 ++++- code/modules/events/holiday/vday.dm | 7 +- code/modules/mob/living/blood.dm | 2 + .../mob/living/simple_animal/friendly/cat.dm | 106 ++++++++++++++++++ code/modules/reagents/chemistry/holder.dm | 12 +- code/modules/spells/spell_types/shapeshift.dm | 2 +- icons/mob/pets.dmi | Bin 64294 -> 63393 bytes .../code/datums/traits/negative.dm | 1 + modular_citadel/code/datums/traits/neutral.dm | 1 - .../code/datums/traits/positive.dm | 4 +- .../chemistry/reagents/fermi_reagents.dm | 29 +++-- .../reagents/chemistry/recipes/fermi.dm | 20 ++-- 13 files changed, 180 insertions(+), 30 deletions(-) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index ebc6091d31..832fd5b4f4 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -205,6 +205,7 @@ owner.remove_trait(TRAIT_PACIFISM, TRAUMA_TRAIT) ..() +//ported from TG /datum/brain_trauma/severe/hypnotic_stupor name = "Hypnotic Stupor" desc = "Patient is prone to episodes of extreme stupor that leaves them extremely suggestible." diff --git a/code/modules/antagonists/valentines/valentine.dm b/code/modules/antagonists/valentines/valentine.dm index 31e69b32c2..f53d61ab6d 100644 --- a/code/modules/antagonists/valentines/valentine.dm +++ b/code/modules/antagonists/valentines/valentine.dm @@ -27,6 +27,7 @@ var/mob/living/L = owner L.remove_status_effect(STATUS_EFFECT_INLOVE) + /datum/antagonist/valentine/greet() to_chat(owner, "You're on a date with [date.name]! Protect [date.p_them()] at all costs. This takes priority over all other loyalties.") @@ -42,4 +43,26 @@ if(objectives_complete) return "[owner.name] protected [owner.p_their()] date" else - return "[owner.name] date failed!" \ No newline at end of file + return "[owner.name] date failed!" + +//Just so it's distinct, basically. +/datum/antagonist/valentine/chem/greet() + to_chat(owner, "You're in love with [date.name]! Protect [date.p_them()] at all costs. This takes priority over all other loyalties.") + +/datum/antagonist/valentine/chem/check_completion() + if(date.M.stat != DEAD) + return TRUE + return FALSE + +/datum/antagonist/valentine/chem/roundend_report() + var/objectives_complete = TRUE + if(owner.objectives.len) + for(var/datum/objective/objective in owner.objectives) + if(!objective.check_completion()) + objectives_complete = FALSE + break + + if(objectives_complete) + return "[owner.name] protected [owner.p_their()] love: [date.name]! What a cutie!" + else + return "[owner.name] date failed!" diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index a4e8b276b5..368e30e7eb 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -41,9 +41,12 @@ else L.mind.add_antag_datum(/datum/antagonist/heartbreaker) -/proc/forge_valentines_objective(mob/living/lover,mob/living/date) +/proc/forge_valentines_objective(mob/living/lover,mob/living/date,var/chemLove = FALSE) lover.mind.special_role = "valentine" - var/datum/antagonist/valentine/V = new + if (chemLove == TRUE) + var/datum/antagonist/valentine/chem/V = new //Changes text and EOG check basically. + else + var/datum/antagonist/valentine/V = new V.date = date.mind lover.mind.add_antag_datum(V) //These really should be teams but i can't be assed to incorporate third wheels right now diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 551e01c3ef..a3c888ebfc 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -46,6 +46,8 @@ nutrition_ratio = 0.8 else nutrition_ratio = 1 + if(has_trait(TRAIT_HIGH_BLOOD)) + nutrition_ratio *= 1.2 if(satiety > 80) nutrition_ratio *= 1.25 nutrition = max(0, nutrition - nutrition_ratio * HUNGER_FACTOR) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 9a08276999..97f1b2dd36 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -296,3 +296,109 @@ if(L.a_intent == INTENT_HARM && L.reagents && !stat) L.reagents.add_reagent("nutriment", 0.4) L.reagents.add_reagent("vitamin", 0.4) + +//Cat made +/mob/living/simple_animal/pet/cat/custom_cat + name = "White cat" //Incase it somehow gets spawned without an ID + desc = "A cute white catto!" + icon_state = "custom_cat" + icon_living = "custom_cat" + icon_dead = "custom_cat_dead" + gender = FEMALE + gold_core_spawnable = NO_SPAWN + health = 50 //So people can't instakill it + maxHealth = 50 + +//secretcatchemcode, shh!! Of couse I hide it amongst cats. Also, yes, I expect you, Mr.Maintaner to read and review this, dispite it being hidden and not mentioned in the changelogs. +//ChemReactionVars: +/datum/chemical_reaction/fermi/secretcatchem //DONE + name = "secretcatchem" + id = "secretcatchem" + results = list("secretcatchem" = 2) + required_reagents = list("stable_plasma" = 0.5, "sugar" = 0.5, "cream" = 0.5, "blood" = 0.5) + required_catalysts = list("felinidmutationtoxin" = 5) + mix_message = "the reaction gives off a meow!" + //FermiChem vars: + OptimalTempMin = 700 // Lower area of bell curve for determining heat based rate reactions + OptimalTempMax = 800 // Upper end for above + ExplodeTemp = 900 // Temperature at which reaction explodes + OptimalpHMin = 6 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 8 // Higest value for above + ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) + CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + CurveSharpT = 0 // How sharp the temperature exponential curve is (to the power of value) + CurveSharppH = 0 // How sharp the pH exponential curve is (to the power of value) + ThermicConstant = 0 // Temperature change per 1u produced + HIonRelease = 0 // pH change per 1u reaction (inverse for some reason) + RateUpLim = 0.1 // Optimal/max rate possible if all conditions are perfect + FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics + FermiExplode = FALSE // If the chemical explodes in a special way + PurityMin = 0.2 + +/datum/chemical_reaction/fermi/secretcatchem/Initialize() + message_admins("randomizing reaction") + OptimalTempMin += rand(-100, 100) + OptimalTempMax += rand(-100, 100) + ExplodeTemp += rand(-100, 100) + OptimalpHMin += rand(-1, 1) + OptimalpHMax += rand(-1, 1) + ReactpHLim += rand(-2, 2) + CurveSharpT += rand(0.01, 5) + CurveSharppH += rand(0.01, 5) + ThermicConstant += rand(-50, 50) + HIonRelease += rand(-0.25, 0.25) + RateUpLim += rand(0, 100) + PurityMin += rand(-0.1, 0.1) + var/additions = list("aluminum", "silver", "gold", "plasma", "silicon", "bluespace") + var/chosenA = pick(additions) + required_reagents[chosenA] = rand(0.1, 1) + +/datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. + message_admins("Someone found the hidden reaction. Amazing!! Please tell Fermi!!") + +//ReagentVars +//Turns you into a cute catto while it's in your system. +//If you manage to gamble perfectly, makes you a catgirl after you transform back. But really, you shouldn't end up with that with how random it is. +/datum/reagent/fermi/secretcatchem //Should I hide this from code divers? A secret cit chem? + name = "secretcatchem" //an attempt at hiding it + id = "secretcatchem" + description = "An illegal and hidden chem that turns people into cats/catgirls. It's said that it's so rare and unstable that having it means you've been blessed." + taste_description = "hairballs and cream" + color = "#ffc224" + var/catshift = FALSE + var/mob/living/simple_animal/pet/cat/custom_cat/catto + //var/mob/living/carbon/human/origin maybe unneeded + +/datum/reagent/fermi/secretcatchem/New() + name = "Catgirli[pick("a","u","e","y")]m [pick("apex", "prime", "meow")]" + +/datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H) + . = ..() + //origin = H + var/current_species = H.dna.species.type + var/datum/species/mutation = /datum/species/human/felinid + if((mutation && mutation != current_species) && (purity > 0.9))//ONLY if purity is 1, and given the stuff is random. It's basically impossible to get this to 1. + H.set_species(mutation) + H.gender = FEMALE + catshift = TRUE + catto = new(get_turf(H.loc)) + H.mind.transfer_to(catto) + H.moveToNullspace() + catto.name = M.name + catto.desc = "A cute catto! They remind you of [M] somehow." + catto.color = "#[dna.features["mcolor"]]" + +/datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/human/H) + if(prob(5)) + playsound(get_turf(catto), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) + catto.emote("me","lets out a meowrowr!") + ..() + +/datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H) + var/words = "Your body shifts back to normal." + if(catshift == TRUE) + words += " ...But wait, are those ears and a tail?") + to_chat(H, "[words]") + H.doMove(catto) + catto.mind.transfer_to(M) + qdel(catto) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index a1359072a4..b7e4f6aa96 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -128,7 +128,7 @@ im update_total() handle_reactions() - //pH = REAGENT_NORMAL_PH Maybe unnessicary? + pH = REAGENT_NORMAL_PH //Maybe unnessicary? NO incredibly nessicary, blows the beaker up otherwise return amount /datum/reagents/proc/get_master_reagent_name() @@ -347,7 +347,7 @@ im /datum/reagents/proc/beaker_check(atom/A) if(istype(A, /obj/item/reagent_containers/glass/beaker/meta)) return - if(istype(A, /obj/item/reagent_containers/glass/beaker/plastic)) + if(istype(A, /obj/item/reagent_containers/glass/beaker/plastic))//reaclly weird how this runtimes but the previous doesn't if(chem_temp > 444)//assuming polypropylene var/list/seen = viewers(5, get_turf(A)) var/iconhtml = icon2html(A, seen) @@ -379,6 +379,10 @@ im if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. return //Yup, no reactions here. No siree. + //QPlasticCheck - this is done to reduce calculations + if (istype(my_atom, /obj/item/reagent_containers/glass/beaker/plastic)) + beaker_check() + var/reaction_occurred = 0 // checks if reaction, binary variable var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. @@ -692,7 +696,7 @@ im deltapH = 1 //This should never proc: else - //message_admins("Fermichem's pH broke!! Please let Fermis know!!") + message_admins("Fermichem's pH broke!! Please let Fermis know!!") WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") //TODO Add CatalystFact //message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") @@ -728,8 +732,6 @@ im // End. /* - for(var/B in cached_required_reagents) // - tempVol = min(reactedVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) */ //message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]") diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index a31b5394e0..e3b3ac6416 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -18,7 +18,7 @@ var/shapeshift_type //Incase I ever get lucky enough to be a wizard. Also why can you be a dog but not a cat!! I know this isn't fermichem related, but this is really important!!! var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\ - /mob/living/simple_animal/pet/cat,\ + /mob/living/simple_animal/pet/cat,\ //TODO: Remember to remove this before making final commit and make a new request for this. But until then, I'm gonna be a catto wizard! /mob/living/simple_animal/pet/dog/corgi,\ /mob/living/simple_animal/hostile/carp/ranged/chaos,\ /mob/living/simple_animal/bot/ed209,\ diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi index 45b0ab1f046a7fed25c576da8f4d4d9fe37ef3d9..e1ebe86922fa69d3893a5513ae4ed981fc4c9c1d 100644 GIT binary patch literal 63393 zcmce;2UHZ_w(>cl&6kpCI^%CA_^9M z6x}bb{CtJ`vPY;lrX$(;^AX%M0q5SA_8KYag!kp;nVIFNL3H!=Ld%c+UBUgIel|vW zmA~PvuTH)zeKY(SO#ABj#}8igu)yU|gP$4v5iO&sO@(5Vzx?znWi-j&KNJgI`naT_ zt#xYY)x9WDgq1>FZwR?)9{Rnq%3EG$ZfF*A<|OTiKYgkco&lGU zf3fLfjQZTo7ijBVp2W%e^pz@$^GGgHs8JpjCn2r%n-%}TBkm=)7q$}ff2elt3E@?7 ze{C6b;=(1_&B!-#{AE8=@11w%v^b^dQikFdB$fMVV~sOgYMAj2>)X_vFr_H|9x~9F z_nsu9>>w)Owf7;*JsE*?b(3x4z{Nl0xGi@jUQ5vynL~a|QqX-dmmHyQ^Dl^s(noVT1%J>~er_80lP4l8J|2nBVNYU> zZN(K;yYB7a_DSb?jY)a=9*NbQXK3~*EdR&kpL^pa-YpNZRhEQR^gr*su^JQbF*`o* zm-3)=72LL$mHU1NEfeM`#MWq8%r1On%Wn`jg#Sl(@~Qqc8H+e;4!ytUDSfqvYxeK>Q6f4%Z6KMzImypql_7BAKM z8^xNM=orcd9{d>G9vzt^qxaD@w}-XMn6j1mjYh+732pe6Krh{+X+P;z5a2$N?d85R z^9JYju*-w>E0hRwaA?ua$IkoX9vtPr&-Z2K%N8Gg*E(zy@#~iw1&#s*PNGTP zomog28$lS`Dmfu=^WpKM$H2{ZN>q=qLTC z1RR9y5c!)+o)G*mZ}FEyHoLkuIlF@5TM0H1aZma+rcp|F)+uaO>w*h;^D`p!6dYHQ z7Uj!~1negD@M6daKLOXQ+|3Y3?&aLZrr@sc6O%Oo% z_!owfoZv%-KCwA6DU1zR#b#%@c)MQkNrd)$z>}XMA~X15-tG|r=8o0XtcQ+Yll6Yd z?G)v05r}+y`xpQ+*aAzvrXZ6R-KrvQ7_zy_3sHL!|W9=O`|oD7_h^MCq= zEj3^~^RUEKSj}^JKmMD$HkF?_QW2HwuWYZ`jTQ3obZT2e5THWYJi)nUxwCuDcQL7COhDm4_37G8S_HL}JiKdTLIB0=vxq06}$U4e=jISfe;<#GK6qfeM z4Hj@og&p2@s9)}1Y?ypomndwR4~tuTUm+GL-(k)OTJ+Oj^opkGX9`FcE>WX}Sfz!v zv^Fif-}?LNf46vLosfpiHzwu%(~AVQB*Zofj|QFaxjhA&NY-Cht12kL9ndQ!)tWT$ z_UHi)$;8G$#1j}FE-Z`Z~a(VR(_a*fkA`&BrJWpr$2^_T}n>)cDJ3?EAC59Uu_B2z04~Xs_1O0!3 zWzr#8+~A0&{`helHI7IaiGxs}_8zrfxczE+tv$4sWr&tTN3ustpSWPR8A zv+9ACN(Y_UMiQ2;MI-bx3(%nGmbZIK9HRDBbEMMdCbFy?B5~E8QR5`~in$z}1$;mu zaxK6PzVaQJY|-eDNzx3oR;4*itXmnlb6-=d$PkS8Pb#5@U`KqaM>aM#IYBr6Prxzs z^xq@G|9))$e*Y&FP{LA}A2$pm12-boaDm_}Zf{ys4KYaAz zyon*+E^BsJ4#eG|n^U+?$DU&4=fA=@LgoWW1I6Qub|J1$@-amw?+$+0ngTb0K%KY* zv<_w?Z`J-Lxp6^b;)497O3-!VVN=maxt=b)A@jm2_3ze?yS>P6S^0UNZ*8$0hT(J{ z%HqN(gU!eN$<&5rZ*Io`h#TXL|6+?iy7P!_)JIh8$2@Ce-J8i9bV#u5O+d#>d{hMx zScNFwAZ*VDF2LCIL}(lZC1TK@>D!+kaS?DB{oh&1pFI!Eii?s#M= zuu6^JISrm2(_6C$;0EpLaWY!7yc7A;=g3kGe#39Qr+b9x?FpH99v$~XXN^iMsXZw6 zBBOtJq7t15L{pf}tj}Fzd}VN`oy`e*@PB=_*&}%o_^hhbAo^Z{ahaZ;fkAX<=c8|T zv8Yg2T(hlIc*dv_bb+b8qvX5NfH0>5@C z%jc|k-2;b^HtX|yQ7(~oPB&N;Yp~_V7~m8yK>a55e#ysB_D90 zxPv&7#Xfq-rBxG%3rI|yBynT4+5s0uj=Z<93((3Q;8fWgV7Rd zSTK)PZn%h=%oECm^1N98Xd-40nSk1m)FSZpb91^1Qu*jLsDVGeFU4i=#z1J6%Vu>1 z%q_?FRP(2blFRdG9cAdb&*PVbkW^8t?at<_6sulBJlGVt`~o_NCBs_kNLdfmg`)$M zlT~=#_fTwIKG0~QrzcAO@y^tKJUGt;TiPo5CVs_+EYnmIL{)S9Sb$!jg;ZQJ*7C>a z7Zc)1>_NgUvb0_v#aR&qpv`>lFv7&Bz7#P&^lle3o3~62DI)kox=e;%#jMfTk$w^` zb|SRk#ab?c<=R4tJTp|fUQG<**knyWr3N0*zjGhy z(yhW&9&MT@$Q0K+IsVw5PJUYT5qvsWCMX7TX9y-jDn8L+t)^eY^I8AEM z$~9^rHoBNkqf5K2Hb72ygL7EZ*w&M|W1k$1uD{SZUsnT44ao8Lnsw?Q8tVP|k;_m~ zF+3%v#(>{xzTVy5(J{QklngqxTaQ!S**tbNbWd0Z!cY4QoXGbOIgWNKo&>aA0T%rd zeYh1+5Q(Vxf}Q^qr4u=OUcO{;o7^+QEjILc5h)>axqAxv=u3XP_@dYqaIg@3pkH?v!0Jz%^kJbFA8dZJ%5+(`=+6fU~o+g7(JYu{G*D7sT9`<@%j# z97NO)-&+vxBvvS@=Q$9Y4=9S_99qAGO}yDLr@(uL`e=lCeFi}^o?k5@f9Iq7aHWLs zzM*j~Lnfe9fJplv^J~{@k|w?|_P*1deYMXV7yHPQbH(Bjz`@aRr6d@Vm7T5dt*ngH z_kDe?A>vWDqY*7RI+9$i3(p-LY?M6V$QWtTp0GP~`xZBg5?h7J>_APVDsX zcZkcc{nbcq)E~_TQx9avXNT_=wKlGfW*Db|MLiihbFXy)e|e|l0qiEZrKXbhsL0}$ zr=lJz!_dUg>ucf}+;)E^jmM(*oMzQQ$Lo?r>a0to+q+x@jz~&Mx(%Uk`O0bWj_Wh0 z#vruS1{2owL;W_$bgv{2;Pk+>(}VK+m-2P!HzS6JDKr#PyR!K7uUpV`Z9gjExp_WA z!3L&+(~L5ibrbhVT0AZk;cY&>CaqMSHu0B-x)P5})jg-mF=j2RsHdw_42&x5zfNKF!xZ&ifvCNepb-2uIlBpT8>oFL5E7d$yf1?rpl;>3<+ zxqt7v!RDRA1x;OTP|%Ld`wMn>h)|>sN;BYP6);b{^%9Ku6NnEI6?9L@RZ zFr7K{`aV$F*8yZ*6$f>y%2KAViq6ZqUY)itnZF6K95xZto_RY6h<=xn3Q5yOnyZW7 zzNAz5Nw*lQ1(#v-*}&%@M_)6&>Mj-R()qp@o7Mji?xl1p|E;7%aphf-aI?oKfdvNP0=ui0!@n+l%97@*9DVl+Y$+}(S$Qw9L!5C7 zayV>}&zH&VhUw%M1O&8aXCg!${1ivgKmE*ci=tI)vMPr3|aa%>1`B}#v>xanoG_H&`1_2Hj3pn>g3(yWXD2n}niZZjq&eyf}~lJMvG z_LHcu_r6JOEfD)rB+rpVAf-OVa0vSUmdt2elHB83G^OCRGyJqX!GYV1$jf(rnEdQ+ zDii~Tq?pt7^xqXmM3yOUL+mqPV^mY7?y@mcU1q>_u<#Jr$ zelQ@s*P`ivTn)<;%a|{7I68D4clna*;0Ibu7(Pbcn#ANC8hdHJ3~Umg?|XcI{%GQNJk)W$wVJwg-rck2F8lZoKp zbAP}J0X49d=X0nV3oX}8qIa&gsOvey zGD}uZ%U2u^U*+EcazgL}Sgs-NbK9PsKzE%Ge*$-O{uu5Lc29ACXZ&;J)~oOqg~FCM z;qlQmD2sBRdkUdDG((vr%_jErl~q+e5fT@RcwGWbD}mNTBy}*NE!Ksi;LNk&9HVoY z>CBpG@LiHqx$x66!&L~%GDEsgR%+qla$k@p8jZO2SYmzA3-sGk ze?wg}x|srmeKT=sYKINeva+krgNq)y7adTOE0I~c#@j6eM`b3ai{zC`Xo9G6XY-}N z@~*=m2Ja@*Z^gxrOih_@Yac|O#*4Ouw|#w6cxw7ixJhO=286}4I(F*I1nT>R&hg8Q zx#SkoxrMJS#u$-VFk1291(>~e^)n$jYHKZ7>LJeXBUqZO?d-LpJXtPfo|Xs z>#_Q7?4cEX>#KW7V+YNw8VIWX=bFICAG5<6X3)Mw3MQdZLho0uJIs_HU?cvvl7Ti? zjv1h9S`eJx_g*P+O$5a<9aU}h$V>$FnMen)jMo@D!oA+y z82PtW?|3%S)sKa<((wUi?_7P+Czy?nx>KdWGT6^T*VzaoySL_7!54R-?*ovWrd{sC z=eXJ6qHb?*PXXq*ob)az3fVSBN{sjg%`%PedZ^ZZvX3xg_f$KD-9|a&uN}~jTHy(J z;)&bPH!6quM$D#0a`+nvuApOPmNznrnMTBO-Nw-4Y488!LpBKFc^;e36@LsaQ&W>{ z81@*HrS&-4dTa{ui0`QP$Vp*#nOj^&5nD`_E>C5B0!7d4m5}Q&(3wIIzqm zgSR7-(;Iitx^`%POlX(q1V36z@tL6^&oud`AFiTK`e5N3H% zD14Ac|KN9NEh@4Tubil)Ajr&J!`1wDg+_T0NUUCv=2|W%LC3{UkmHhD+}D#-(UHL; z2zbsZj?rLA$OG-!r9`AP{Vr>K2}(;3uev(dyT3f)qj6~?DjM5PJ-_(Ex~3ySWANo6>+i_-WXG6EJul<-?7dT()A3rN%;dc4 zbAEGP!{7WN^K|(G{Hkj(VHMc(;@RQL-bc@#QHt8_=5GgIM0!XBA*!G1>UNhVTe^A1 zhF0eP?rFl)&G%KJ6}8!Xa`AOoPn~abW1U9*LRxyLH!W;yU>Qr^c;J=thNifF#RcUY zhZNUy^U7AkZ`_=e?=T7jF{i`k_?#KTnM!lo$y=<1Aq0uZg%NP7x{eF-m&oS9$G>7X z(?U1ZIe2(^KgiknC6L#eJFlyc{|Yy%Ksijuq4Gx;!L&Gn{;ROAiGAmP zQ+mJ8h8yBll4uAL@cJN7FThd2v27;=ZYZ;8kWBAqRdt1>#)*FLgEh#fqoW8aT*U7$ zi8scQe>zu(P{nGaw*7DD*Ois1QMw|yRlsjA2$bsaRT-7-$i2bbL!TYcpW2tV1-2#M zko?~1B5)PY&obXL%apR-8xN)yYj7Qn;kasei&mg&Ep@1EAkg_u6BC%2smKw+M$pOH zgTj3XU1ZLlb63RUugkh0_uTi6v|GFWSwBsJPmVTgi$}>~R|s{6t#3(y z+8JO`$EzZHEidTpFRWW2N3C7l4|&yG-z5gop)6o*XTI*i^zjYd2F>9PaSTof z(+$}L*amPeV?swWKivl@orEwmuw0MQjdMX**Pkm&ET!Ut*$ej4;sXUQX$AKO0kMGJ zuNKzC3!$ar<>=Qo(lma%qTP1egt_1;KBgSHY_^t}Pz zzp$kNkeA|LQKS3*p7xZ6zQT%GqU#g6)65voMv%jr^%%IJ-G(Qs;BKoO_2(jhHkKRj zjYnT|Hvky$!&2`<4;*1cx2t$swET#*?ox2E9rx?KUqS3H=NpPci~kP zyRR*)(GsBmBF%?5cTo)2wk=A6(9WJzqXFkgrof(RTo|2J;jyQB|d8vJ-# z1h}F6S3N1%kH|m&l&ExPYv(GJ(HE*RsK-OXuB&M~};3k_fr!@~Z&!Fa~3g~v?YHdC$XDAbx9*Y@1d{pw9v%~6# z@Sycf{7NGcj3X`MyKQQ0W zAqR%YMM-2fa!J}+(44TbQuW%0mnr-EU6Ai)!Phi{A!+z<3lygE-{~|-z~&<#6p?@l z*^>YSdEx|0aKvL$dfF$0!Whwt3%Ve8K#=bOf6;$R} z34dC%WBX)XR~M9coE|U&?PnMH3PB01`0eE-n&Pl;=&OG{LzPh^1W>6hw}81AQjg$Y zxdYSNe+m^5w{?MjV~iR7Ylz)PjGX-JFi3B0MDMkV$whGh{w*xZT>_9Ld@-{UHiLv` zBEJWp&Ck~Qg;gCOXhzbJq_a`;*sb(hii%A+Y6GkW_pIr#yOljFjm)vuJCb!qq$-qZ8@^Z+Qz?}?e z?YGPNhRPbRbjo*gcdD9c4$GV;U!=kV`sS@u5sK%-Upve&^Py?)_K@$yh5Y2q0Ey~v_+a=Ns_X4YNGAo{TE&S6XX1P{A*9utZ|a5Ib)IeUSgiNpFi?>zZQiH6Bj7YINm&pnwQO`wcQ+S7m)c=~X?D|g zB%75G(+v56c8}YWdH=_Nx{@0TX;0Z>uB;>l1*8SlFV|X5G7XGZYqp3KZaN&fKI4-G z4h|Ju8tzMVWK*s{4JPZcegCVXv+8I~>gunjg5;gAzh=9cM?HVm-R8N;#Pcp@$P#*d z5cX{$?}>$e96P?bwlA5pvz6oFZlhG36k6V7ziVbsc9Js``)SK$CXk1pFVJ23(XHPu ze;KElrS;e);tCHooXQ$vquZ*#%b+)#^zXF*`bM1HGyE|)0@rzntsaYVSjgvDI%CX% zyY^LGz~WgtdM^WE(sT-a7T3a#I->%DOW;4l8>)Eh-N=&w`tI*w-im-IMo~*h3nne)Q-V7!cU4Xl3zgkt?8=H^@zwqJF60 zFyd^~+^J=h3tk85%d?vHn^5zSOZ&cAvc74^7CX~lld=qME2-PQA zyNre-nIi{DiqR<*Vc1|Ot5WtSkN#!y$7S!q{#1f&qyd{T9POx}?Z3clxpc-&esSg_ z^N8o_zRTo>4kDHqxJFFq@|5b2y73Xh36|7haMKRyCDnR(4*-)@Sni9ns3^9M;623P__b$ zsUTgP`-SpH%EDGwVe-Nbu7<=>V4;rzcRAjTLK8$9lFX4NQ7^b=sKsfAAd& zGB@Eu5!aG*FKRFvvFehR<}6*}k5X4xw=Otio6$6%hjW|siaLaqMXZK@KyZ~|Thz@( z6c_W3PfTPVue(TKB>qTWHYFNi-gZt9R1Jt$^lrS)&NbD5*?P5=pmb#nuRsa7%NuTc zI0=ipU+-`LpW`q)7Obo8M03Thw+U81(_d4Et4^4KDbEJ;HIhN* zua9T?^i8yQ-P2O&Q;%y{8h$F+bkxIPuIsu2nNw-+xd>gKBayKFr+r zXluB&p0clKNMSeggGzKVcXhcfYG7bMCu5~-AG^m>Ke>&eew}YPN#!<3y>y6d1$C2ym8a+BU}jQ0(H4T$ ze#4bCSmSk&WSwFzuS*|PXK$5aY7ZZuLmb*b>e`L#o0{?bmebv{D?lumfLpizgD}=e z29jddvoJK-TY1ZWXDKsL#M|MlwOHf4CIE+t+ggvkSpc)|hdPX&dk*Iju=V6GGk1Orca_G~IUVU%?Z$OW{ zhc``)HdMLtM(@jS5sv3womA441KkGxB1z)9b!u!CzN)~-&dMSzhE7ko3b9Sye121GEo>sMP zu>(|((WGA~LLaruS_W&E<~~7Vd~smr$UtEZ)spR+bdUF)D;d~_8`!EwWP0QIXzGojeS);l}?G0>YW2f4fIaWUC zaA3e&!z?mX2gW~+rgkw_Kq=sQ1j4Ea%$aN=r#DBMWJ~u?pNjB9)JX zczLZhom#{eh8Nw)ZbYCXt;BOg zqi>27*rEvxTl~eFcE2}OIL%bn$A&1!(&AP#I6)O~!f^nRWdrZI(h%}S3nczm)Z@3k z<-4@%wXis$R0hwEPxPyuny(wadSUWp$6K`3)-AieJ~dE)Csu zl0K-%1~1A(>|qlER`ML=Pe<_@4Elu&{APxQ3wkD6sV;*UK73_8Zcu!E`UD5ZVl+pY zUsP0w=;9Ewjmd6lS#WJjzW6iN-I)CGD_08wfk;SBrmaFDdaEQ}uMC4iA6tlUi29XlSBTcJI%S+$Tc7Ay1qI!Y?PzHqNf!!p-&WQTRdWXU^m26 zYFtOA`kqN4Xl>?O5JM?gr-OG#M&7V)k=`pIHX_cGldLQqvOCE*lU*a4kmwRu5|mH! z^SA1xM0?}8itU2G^)x;=RM3%WHCP*;=&-bz@ZLv4twQRhKoq$|y4Gind(BlR_cZri zg4{)$(2YEQx3?kI8S#}hH8hXZh|;vUzPGs$)wb44I#5;wqx>xwoBhUIhw9QCqw7gd zM=U>AApG+3@+=S^rE|P+|76aGe)@Dv!vG~Ss2HUj*g6mQJKZGQohqk$#FX*rW<&Gs zMJU@X>ji&KJ|=0(inwD~)yl1%;`be`>)5|r|4x=Ytn7U9r{~=u(=a3RZy=x-$NGux+_97(PjZmBB>a^>_80-X7`R4;A3h5(DGo&^c#rsq`wUQ^A| zU$lg5fk+aDu*pe1nX?f^-<1fuk=Ze#l!3RHS+xJ)#Z;Mb-$DHv8I$B|oYx8zF`xyD zRQVAg1kWH?Yy>=ypFB}eS0@g}AeU6v|E%`JewlGnF*j$W-^Hd+_>dZwoUGS;@{2F# z*KBK$G#?L72P^sr|LGCAMmIyq3%(Rl^*{I8rizmW);{oRRHL3=BF2{nUO4Csc;wg& zwjEN2yL9nnbv=Q>$twQpj*zqtg@a+`Gyo&j1-CH8ACm-;AVnmq-Lz32EZ+ONNI z7Hf}Y6ux2PMFZ{9m&9Rg&Pzu}Dm9vFPB+L|BE()bftUdnRWl=FV_0~Rj0M`UJlO3; z<+9=L-; zGS$aM@N4a|NT+aQbTkw(D;hKWK~^4!;7Ml%{rKkeRXS zw+vCVT_z?4+mfRr@KeS1pnwXWL$l?KDG}SXx^~&}*g5z<<&yU6Yoin9-){5Q)tADV zO_UK|_qgX@_NDtQ{ybL3Vg7ShI`2zuWGUT*gt4wl8wIe zIZ8?h3e7y$uMXZm_YZU*pc{K&O=3QO5|P3^5_VTTg;+gVkj_(zIZoxr!1j;6;J5gg zeFge=Dt|qtwm%!}fgboCwYPK%%Q)5ni};7H8-#ZfUu4K{#OZ0e!-TPOz)Y?JIBhJXi{oCcU_pI z%_7u=7^2=%_xiV_SpMoZJw4D3gq4((9N*kQF(};%`SZSgSE}#>CZm{#obWJvWl|JgB z-28=3nxnU67?LFk>QBO$Gf0#S9*r{_si=SHEnjA6Ub@X`i#V=SP1mfbj^vZ$?sVdx zC-2A#lL@>Z3MCk2;AH(q&GYWvJ1pQq;H6u6maEw9n@L8u+D@kgvau;q=;oHo%(CrH z!Inlz`kGTZ6k)1;xYgC;>aGI^G}s}@wCzrU^0v0TK=hVNoAJ(K!ms$THs5!gzP{Tg zlb)>t%K>Cj*g!K*;`3yFQ$c>C>S$Bg!Y!bErH#3#3627wfoNF`#9}@W5)X$J*T+lU zzT^jTN26yqZ3%$L&%Z}@&;K4A^yVnX8kAmmy~10!`8+Z|jw7G;z7HYzMsgt2x~~L? zHl-12yRNj#Gz-46SvhDrw7tHTe?tvc#5=n2xZ*Rr@y z#*bG1)ze+Cv{R|t+E!fcmLsUW^Pzm#%sr>+dP$BYy)u&_e!m9#4@qyMf&;Oga5MZ` zTWdS7CZ737-e0E?2TnvX(;~N+e`g#M985yl@LCHB3M#O8z=*K1x#^F!uI}TX zLbq)Y6{!=#L)Sm3u%POS6|F(AzO_}gQocX})CU`LW(4e~Cv2T8!|Z3=#?!x_RwZR- z4i9c({q+<~GnT#2VeUJCUPEPezPxWa1{drZZOiP=Pl@XSp;ET9VN4Yu1lRK|7LO6Gcf<+t z=7*bot&RS9ze zXUAj7{>1ps!@u=xHG0xgf>~~3o))|BG)@fxnZHfO-DY#oX5nfJr^~KHV`Y^56sM<` z0hQLDa6k&uwQ7tf_4OJaar*NUUpm(?8+U`Mj6v6(WaROqEUo0ABY`e3{kd4#j{qtm zI%Gt#*UtGeez^Bzi9)XlB4}h3Py^)-20=lxWEf4R_19)MI;tynGlp3Rz)VIq^vb;Wnfd7;@xDKgBHT=_F_4pyS@0%6XjaPv#Q0J?oNLb zzQodK+Qv!kz8W8Z)x9wE4TH+^$)9U$S^)h9ltj)ZzlRMdh+>XvKk@x98*s>GC(!bg{M z+k4(23VV#NJ-xs;8hDmZ^c@_E&tPDhrg4wjvoU)16J_?FZHxO~n#0=W@f+COJiXM= zKHkz|r#wtQ_~TyI7(tXW(LPe?kF~Y?rty_1pBb&R-BTRToQ#?azP(>mydr_2VcG(> zVkMqTyuOO|_G>4l3EVi`j_bP9W<`ijBV~L@{JubQkU*q|rQent=1Wm0raZ;F^&otP zxLSxdfD%ckZ0<6MLwxyz4963Htg+ado1d3taWy#>J6I#jDHPd~oQ#O>RXO69x7~C* zj0=m;{IFmVrtEEEIw5lFeLDS-|9bfGx-~`jiAS^O?aIN&E7MG_$k)f5RUM*`RY~e_ zJH1;Yqmysr;z(rR^B%sQC~F|3w3Pp*(cj-MuWD>JZo?NL5(%F3tgg!~Dq^8SfLl`u zV0H%ENYa0Eb-Gp6+A0TTJ9!L$^5INm_)<-2^dAK9tmIA=Vw5YNiy*xSm)#Q3VQson}fF%?r4@=Q_{1 z=z5|%!ttN!=ulUZL+MY7K3$iO+IQdN)Pb6jpVy6KjPqI__>DXy7x;ML7`k??pW#_I zT#wyaUWaU+3UW&;*Q;S|X7`C;i=p}gxD5vKS0h5eH(0~2N;R;)k5g#?H-(s@JJi{@&P6#mSnf6>W4`1Sor&zTl(IL8 zxiRijrl&_IhvpqeIabsAg_e9wZww(2mI6;+fSTWOKPW1&*huXUGq^>gxIg zOR=oFI=b!c9QnUHJDv6JYY8bSQE6#R6RmK)k{93#zqcAIbW?q7DRw(CH8tkoz$NPt ztC2}dcrxle8C{%8?zlil6Za>MOy23)*_ezB7I2L?ySRwFMG-nFA)L3JSTNOLp`of4 z6C%_q5u+~Da!WOyrKdB3*s%TwB@GP?7As(1W5h`dIdP!`a|_O@_^g-ugoCzK`i7Lm z085Bp2t=mn(07dyXW~s^gY*s=_EyW%$N1tDcxa!1?4bmH-<1RX%3+kya|-AoJo#Sm zaX`g7-C@Uvl#)h*<H9T2GIq;wH?yk>*i6b~Kix2dga@-hiNMIdqurg{By%}X{)~3q zZtyd^zynd+L3$>+K&+4V-t`ql3Bt+81Ld=YRDn;I?E9EhGL#J~*wAKspK z9EfLyvgE4JtWC8A)AC3;BU6zGgoTE7U)Yt;%1Cw>Sk>KGk!^Tc2y0~Njf*?NB1NB1>nZcu`MKqKe_}Bn zOiN4az3}Vx$CDr^AYl$f?$?bJ7G&i%F}`|*cP7D1@f;_P-b)1SeaUwJ{{4};Ibze8 zEc+u?^Q#eu8Y>JMB@t-AWUi;9gZ=U6I?cM5RQggWR=QSHX=!QJ#?4cJC@MdBLI@7% zmZ>NmL|j~4`1U(9xl1A{b4m_^Fn#Z85Ju3`)zs9UiZpev)p2OQJZgYHuaJzd*A)FY zhtGzq&{{?VQSCr}UN;2FR5~86f2Vl5p8;WS3T|LkQ`uF0lvhQ1`2#mas4E+e!PcKY z6CF$oPT%2J-h`g7JRKF65XCT)VAd8SJO&2n(X+qnue5`vE0qNJviI9ggJzDt3^IY? zEn2j$nMCY?ikXF~=!owxA%kDa?KH+iY#@2d@EwKP{~YGYgoz>zn1pV-?<~<3@wE$R zbU(Z72rmfwiQg$Z#vKUz!C?wA0F9|OG-CJB0udi}hz=i@l}5!f`I`(%N)4PNL2Nj3 zbWkZlv|Hwu`avuHyRENBpqiDNl?9NJo`3f2d2u;P9{dK5K5QDjRq`2(g@HOc;RAwv z3h@IGV0uiIV&YHO`<^+fyzP5$1aV?KoIs_n3ZGo=lC2ozCVfyeC09IaM@f0>j?dEM zchdpe->DJ3y(*yP(bp~dmpI7vOZuO2f3II90<+4s7WiVw>mM}jsm23}T-JxUedrvc^bE7;ZvwAMW^J5`O+(6#AoBNkfo0~=3 zz8aVhb6XdIbraQerGxUwK%FzAoa)%n*vQ9ykB>ws0+W>`?h|um*CAzsEB4?wM94jG z_}(k#H(;8d_sf8Q>`9`h@yyK``QO3B{I=@xq9-2;&8kg5eAAHAjXAtDz_ zAGq8~{BdZzDeYBmy-b@$H(H=iDJ*9?emS{C2q- zd)!OynggOq4!y28>i(!*$!Q)KYW^KY!WwuPT-p=Wz3rJ(R>lmHQs3R*b#5~@DJ$V{ zX#2Nkxo+q{;>N~C-Krk?t{>KYZl}K=T2Fm9ovyS|Uv5}GfP{(K4Sg~iG7|CF)L@eJ z7yJ96-MH3?@}L#z^1!;6r1^A6I;IIsq}>B$%&!vg4FrL}M0~jX;Z^1G_t(H`i$9{a zr0e_CQ!_Kcd`ytY*WXrflZ0dK*U0(4VqSMm+^DY5&wT*Sj_Z4_x3#QszL%8cjuZLh z5q{quS-z-yd&5nWn@t9dF8Nz81Cs7wX|?)Eb6{kD9KEFf)4Z8tNB?JJW26@ILhDM7 z*?XCu2;w=9V)tZkP00R>ykZCWJGchAGpqp&ZytxiU?H&~^0CKfsA~#OsUPK&aDQ_c z$}8Jt_np%c6tbTwo?BBySp}8aOmcp57EeVO1_U|qN=Zu{mv9B&1=_oyn1+fS^o!D} zCgNy|GK9VF#f)79S7zXc1-CBJ{(*t6`38@O*;%9H%#?WM^27G3VY!l2?73QJ>fmN4 zp0AP~w*B&m0dw?ogC=i*CJ;AqQ=hih3lcC6E&6Sxhm^s{tVux9%lhI#r<$w-alVV| zhrxgZ_Vdq|9~QU%kZUB?;`Y7Q&j!`6DN_&eWS0fz z*BT0bev%*SHvLjU1I@GSG(jB?{1Fno@Rw~{CUn5C1ly834y7jcS$dR^>UL$rkM=3{ zBh4$gcV@gp!`#y|@OYV;BdN+WhV_`z(?`jJjLnuzYKM$(sQAb_@}-R$L&!mfmZo0R zr@HTjKCh`?u$(8LU=0F1w2R-99OASN!}Q%#j^RK);tNM`n~&yfYE&LG8~ z|GdjizRu8FT@ic4eRsTO7QEy}I5=8v+xSh6+bT5L!3v;Hp%|S@#IA#wxZl8RL4it| zt6bDpCd|x(bvQ#d7J={=YwXbhv#On)9k)7o9A-)izt3P6fL1wZbk~Bt3Y(Xx*9yT z+|bRJB#W4z=0`_egb)mPBe`!&tvsNb1x7uA&wd$orA;9SOe z=IWPRuH<_d>epeLzGrdrJ5~Js{RJ_y*_boIm!b*c&oP9h6p)c-9}cTOePk+R2ks+$ zPR_LEpBF#WN|x=8TS8ydeSpCi1B7<>y;geYV1*6C@N%Ob4F(3^lb>9&=Z7m%hN^a4 zXpb(uiT!d=3Y^*9O>q6On$mV{GjhV}w@x`}PnVLq*u0_q0=2x#xnva5#}dGAKZ8LZ zVuo%r?p4syr>Pvy5+oVVT~IR4wg&IlMsLHynH++H=8aM)digm;XcK zrJ$_JH!pQ}hlKsd|BHwJ?loXaace>J_kuQ*JO$3EIm4@0tVcKH#7ep^ebQb|Vi`YD z3JL1E4ta3cYSSBnc|?UXiUB*>sVLr7F`6}Oj%e>soyy{dANtKIhxNPFrv&=1k{z%U6JqO>9W@iCQC?okhR`xsDSYIxWu#-iZoD2RyxJ9z&^|gMFV8jDqi~yUF^eq?)IlWVa7VO!Mssq z)UN>lgwYXoHfGTcdl{P!cmO!+aq_v8wmit62D1(0-?p@slpo}We?o6(OKwSs2jAX z9VD(tCNu15>`;_1mkXukH4sQtyW=*kf8cXZyvqu$|4x!(^7`(ipkbUU?AjXG`G&F1 zJWx3nW_FN%&MD}+ANE{tE-}V4h>A`Z-@CL6i=qyPKg!kdPFRP-!WV?iMMP?(Q18XYS_v?(aVL&-=%H zm@~}Tv(GtmcC5YDyWX|Vv&y%|ZTZc*-amdq&r>MnOvG@gULT26VL=8avjZ&xYF&?0 z{OdBM3vFzIHLTiX%l)XK3eP_Cn1&WQP=oF?Re-nP)sucsO7lUsB%Yvq5PWKXPb;;3 zcdhO|n~THu*+C6y&G)Y`qA7XJV{m|debquHM@c1v1?8iIyD6 z!GeCedoK1zD92>i5EqOIt#^LR>kq%{+SCy)45S$=YsJKbc@O`i6=Yc}t*FOdq{o<@ zpvl2+?ueDx*OY1jHxxfJHRgo%}OE2nm z9`b$^7#3C1k6x2f9mAI%k8u!iGewqs9P_r^buWH$D#QtGn&TxW^zOb~#8yi77q^2F z*xs}10Uwv;E*xf4yw+%=|9+*KP?r^zOEiDt7b$$#QZ%F<+L#Df{ym zbT`b?s??2VSR0=~kkjo>Y4Mcz<~3P@&7TK*lvF1lu>MXxsEKDs8pN@n{xt9Vx7Kmj zAF6!yq|MD5Hptua`Dp%{@8Op}fu{cf{#O7qPg`3Xz^oBNL$We>(7%?lGCrk$sBuY}FAx`_ZBKsVaYJ`*40D{Y zwY9a~C*7`F$S1?uQa(Uq6r;JWvKprJ+?@>G$nqlu-%nQC=^5@}S=ph`uRx?J$keVU=p#J$sBz+Ru_I-GgklMOrIniY|aPmu2SA3-FJf2gt;OefP5weHqJjst*J&2G48gqo4$*` z=RY7QHiD1ta#MZO{|8I-fk@Fy!vxky~C)1mHh`xuX}r z^`8UwjEsz2`k~d&iGy|9i2K{F3b-&4yYY&nBiB0+vaqo5-31#Ta9~m6V*-;TDK)j~ zx5ygF=T^%>nnylIt4{`t&9hC)$85U+NVwv-kP1i}RelG}qN{?+Ur7L8;q{c_pXu=; zTR4_f0Q@?GYNZ)T9ZSJlUlE%X1^yLYzDczWfagyBtbK-ykhbc27%&Z|5Xe*SSY_rf zwA?t2?Dpe5kbSu0A$I!D)h6Q_1sYq}WF>L#<-v;>48reRm!+&?Y|50heEn_Ft--|CPcjQsh0dP6er=I*AV(qq$wg zEEtJ8IdP8(SQLlkY#y&3|080MdY7J_9yVECR1_s~0m6QX7pRRFYn^~Mz<#sB493L7 z3f#&zHWvUfe>e4#iO|8Y9f3F>c9z-0x0RVKlf$QP9?w#|I;;7dO1RTSN6tfGU#Ff zGPkRD^`>r`T`viWWp-ms+C|vR1$>l+G^IKy{+vIt6fS)FU0&{kAVcK<-t%t()jhTN zqdOa6{g?#e+!}7TH$fOTdFlf_rF_EX(?yewXaUsXt}Mr&5mr8GF$v0F1&y zc9fwJJ3z)@h6!g3LJ(rY`k^^67@3chiI0w&?OU&{p!geZ zhNaJ}91Ke#%`8Wb?_MPolsymRE+aey3Qu6)i($r0kQ&4e3Z!=-01$iN!!BRhQRh7;UlilBU)ATE@mhKvd;kgp#2T=YnaX zV#z2EXa{M7>+gR5nAyXrl677E6=os}+0Xw>Fp|B+-1Xg2=P{|&hG32BbA9et5Amsm zl%(DX3iLQHbzt~kuBD3ko$(wU9VMk};u9f0brx6vt*X=5B-#=(v40&+%a?)w;_EhB zb3DJ&LoO@q2wr2H>owW1>b3}9NN@gz-}*&+ELhp!tGs(1em7Vw&k>oeQk;8Ll#>-3 zd#TM=Pxnr%#m=@Ib@h>%KQqnmR9fo%0dN8~92CbH&@E?2cu<7l-l6V-H}O51z`!3; zru`GNV%eUUEBgd37n&7JkQ^>*BGTc3FQN|Brq;fLkOL33-zg1!Q9uJxlXN@5jyP~* zcINnF3E6QH)KeJ8AY(F6}RMfUweoplMt$Utrg3}L~| zDok4WThNRG&inoj&tn$~z#fuQ?vPnm^wvDH>T+jPRE{7qG9q*rL1Ivg>-nJv`vtLJ zFX>O-xl;cNu9^-c&Uvp<9E`0|^6IZ9Ujb9h_R{sg5Nn0^caole-S4^Ne#~HXwFf1# zsdp@OMpoWg+IQ1Bt#OP9{yNAUE;}(BmfPtHgk7v&ZBZ>MQ^DI_AvPjJCV$Pl5lzRs zfw1Qh^JTB?jz`bN>`%PP+6w8kE`CyePzW}FCU@+#ke7|t{d5KIZ*2-*3Im1dp~>&LwN9DKTRk2PNt_+jJVG%YZiMX<0iH%?C@$MVxdoT4gJ(UeEE7hJE{`_ydA_EP45{~rt_Ff#?dkB~t<@fMAVP^Mq z^z;Boa#nvDjzOxUOC~khhZ`Rg1&o|sWUCae* za}E^KrK+<*Ov9RdqRoTQHzt~^`#d3v1$-~nAugxe&}COn$Jx5VbE&GY-y-8aTe>QI z6K}KK!g6w{<{D&a`^XgU@5(4jT#4-6k$-fGdTdOp-Es-ln^|m2s}#3-xl)N6?5nD_ zjQlgXnfIIZvKLji?KX9!eS{s5&4U6-t@zWzY(|8N0!Oy1Dxxk@j21e-{t!9O*q#cu zmS%}2K-l$qbqn8SiE#G`Br~~Co0*{S=;^rbh)jGUgYo{|5JnN0#AwraJu;EHyT4CZ zZ)m*n`WH`fay5HTyL^B-(Bz=D)y0X-Q)wxw?`7rvpJ!~~Cr1&VKhx`QQQ+dSfSvUg z!2iW8dTC-`-h4*GXVPF@7S?Bt8H81S7E`q++cg(hH+J$6$9{~UuP;b(teQxus{HHo z46k@MaSd*qMY5WDdI6cjgZWZquFApd!lqNAKLv@p_C?@B0fzhE#t)%-e#*zmJ>qOh zC7)(10=_H0*hrXDId;C$a#~Ed@*2}$4O{qX(jYIlHN)7aNhHVfvKW4q z^wfKW+s4)t$&oy20+}fMpNxt0P%!;&nlU{}UJt=VV8(v@6!)Jo zs#o;qB3b;lp%uC1s3MOlhArxRuWO#RM{bLjwyhH0Rs6S%qRS#l~(Gp;=nA-6vnP(`(I%JQ-~^rv`f8!xcCyF0#r zjTjr<+0`}V`xnyWa3QGrmNfq)pw>OW2(VRq?*?gq&))8C#aXM#3Sg$z`CkfwIA8f< zUHBnI=inegLPCO=^CGNX$g&f&OG681K($;c9yEo4(TL!U3BIEti=28;Ya!W-*YO%R z?M{1)(6h&%)3{Y0ePrMthSkcMIor!0yj~Da9Uo@tUehj-C9JPAe1BBTr)==L31hpL zC1V=D*l%c(MsHHngRF&BzD)*6_nwa7{^hDn7(oC<_UU0~RMo=b_3G1mh0|}{)#Nuj zg}bVh6X{3VJguy^=bc83cG9@PEa*3_$TM-WzbSbs363QfmqLfWHt4kaZ0?W>`S4np z9A}`9irj)6fQlauiY|a@ zuJrhE`|vQ)vpiCINzYL`Yt;$SuB5(l5`L%C92o-x1As3P$1zBE?9Vm2YjD-jd+*tywP6cwQnz!Dd`n^ae2usE>7L(`AOF6Hu1Ska9kV_ zgS2nh9Y*c8F%%vhjYma1b>MrpTQo75Qs#tzHW)}RQCzTex;sS%2B!X6#dEyTb9%-w zbT6ic>OC7UG$AdD0UzDcywyO-WN!_l;=ExtlyUD3X>w zb12CrHYyL{XWK@u^--x`#eyNkCCxIPm^Joh6)xI)Ov=RzO{X8)jj_^=+(4A_C|7?v zxH-Z$XqyFU*!hl;eRWER`c0FA95?)ERek~UNiO*O3@?lg0woH$Kjo}Z<^KN{DLJ7M zv+zA22xvCb)FgH)SFyK#?N3M4?S6404X&#BUGXzIETB3^a}!%N)Dl#2xsi;xUeI2d z44_BGR@TwU#73G+_+Ms$x*X$=o$z34Y>{egwH($zL<89U4A3z!5{egsDkkf|yWHLJ zKWfLgX5JV)oKNIQ?BlHoHK*~v`tQ-*i#srp&;s#;dxW^S_wOfQYZoOMq$VVo{gwPE zf+k~-FaGwmFFtv{X#f%IxHYe(05s5hk0lS{97~8eN@=$DW4>t(&sk^6(~RT{_J%;4 zcL$s)!h6ZsC7%yQ>1hl3Ig{8dyWdlIlqm-6sI?bYK}{2WXacg%c5I~f)Jf|^JHnI) zr}GbStd;VcN#$cpO)wz%EX~l2xK-l&jSjyN7MOyK!prZkoB8rqiX0_2)BRZq z#SX_Cbggr$zo1Djt;{=jb2QV18%mwRUyfdRsG(~nqJxNW;fceYG;ClQcJBVbuYs%y zm;celSnZ-g#`CK6LX#P-tSGR#=T$HJQXGn<(`!UU)>*XdComZ2sO074y9AelEN60R zc^;IKUg^WWQ{SkZZpY+gkM;)%keThU+WbUpNvfohq#l{iiZ{ft@DQ@kqy{KlVb*kK zda)gr@bk;Be`-F(41%yh7sV+PbY0G@F-4ES*SZbGPHuAA*=`;lp!xdsyNRwkQI9D<9ymq=OIF*vBHeH4~xJWs{MhHRUgCv=)U>l_ep`lcsqUqQb$MkFXaKnu!38=L97 zRvF3H*_Xy6t}?_^7k2QbI(L3?I#p1UKT8yH-_#^!ysnx*cxbSoARFJFyMguc023^! zf3I8XHxE!@SD1XHQJRaTt@Xn*B}6P3RJ@eyWQsKvHMH9qj`)-5mCfs&E)pLEN@A{1 z%LSG0lf1uvjtYszUII(GqK-$gqW6{QrMG$&abq;RyMh}|R;zGUzXC&-+tAbUEJvhs zGS($gb>x)&magLxc1$M21zb4XF_lVM+r@w~yJ7!{a zttZOpp_~8}L47@=MfH^pwBAoVMOQd!oHkTBv^OTWO%bV$Gb?NRXAms+GuBt2A3xCz z&lxjN^}#{#bYxYfy>#MzT+D?o?K|A@XDAc}HWI`Mr-2qvQ+=7`bi(fz-K2-7^`>N~ zE%t)RkIPFE6K9+0(P!KXiTA;~?84lSi&Q92h=PkhFaK{^`Y}r{348 zoGGID+cv`z>x!px*3KrohWEln+$@=0rwzQp%}jG($&qE?$vDzl?U5w+G?3t9$nziM z>90@%-WV}C`J0y^qX5NTW<6BSw}=?`ox44ij(V<_z4q@aZt)(1Kbo=VJ3oBKv-6c3 zep?Eo=*NN|p1B8`di5SugnONHu&3UBS24;sVmQ&AeXSA@f?t*>vLyM{$9NdL`zFpk z8!SRo^#ZurO;^Y! zXbYVg-ycuAD*I>ft+!t|T`jxXOhZQ}am()G^`4IQDxA0ksl)!WenEp(9<6t=nt~RB zw%o7`Zm-Zrc_Bb#^u4}$K*X?Ni3)V=KW`jDK@cuPF;S1OI(sW|g;`*O`TW$AFMm5D zGFCdm9tCpSEwYnka(x-J0a`A&w(H9$^sA5{un0B{+81%aQ{?oFOxi^A%b#wxQo8Yy zS}u(e$jkpR*qOjbST!~Ok?!|;fW2AyL#zv3jPam|6+YEmHD_#jH+B_-4QLT_p~Yq72Y{#fRpyu z1jU^$#ITJ^G#eNe!p!aTPg-M#+L~WXdhhULZJ%MrUl&C1$|0A^zckI!atz*9$+rh> z{>gpgY!Ff6;iGefrYTy#FZQ*0@B4hI*7Ae(l#Mu|&JlVn)AnwYN;hM2<7>DF>Fp`< z6MYyh(DK|^wOdH;|5m%RjugHSn;!Zdm|ab0(-^htj7CMp-F|wQ+~V72Z=cPU(gpfW+73+Pq0Rt)#< zp%+Ef>Sg=Z;^5*gBj%@Ce$0=@Ts1Jb7f7X>qy4E!uYbZKBvGZnl?+~Ag4P9dmK#_} z*<3t&MZ1O%QLbVGDcouqmE66>FgZL80#-|zS$uGuZ6*iE0Q#fX)8#`k)(VHAAKv%!y$H&a7nkK*k1qG_2IuL7b|UXz0FPp-@oOD=W}+ ztG^RIyt;!wuy-(U#35KM`(W4Ba~#LD^;RHotb&>Vh5*z?Kzs~UUU$&z1ZrB z_NYm`?CHtWR@(Y@>U#-6Al9iHt&A@PfCTSbCj)-CddOuI5 zieXtS$ol(^6A0_Tmz*&1qLX{}?EO@AP)-&)>~owkW4>cARldxZ$P`G~oguQg=* zh&x_J0*~LxsoJ>PqXaXMQnnZCuECxIo;}MkTTs-x@zViH*R-pRp#iCz#y-G?C^( z`)F}M_S1#Syd(sBfh^29*^4{THG^!g-%59O{Lx=UhvK=CAlSsXW809A)}-fE+S3ur z%W*5LuumoBPgO_xDLj?~4b%f}AYx#tcVhZMo9BPM>dY1>^ib#9`{Ju(?5^HE>^a4< zW=BbXMS2tL+XF!!8NCD;IxlLgl6rn9R<+V<%spgqUj2aj^tKe`pNducKK~IlwDq-$ z_!7VHwuMb|+^V&#h4WFx+npJcbIGdV=%GaFlKyfCD(GaR97oVYa)pbG+RM{qGTrRX z>f-TJKri^H$Me|mpE?W6D`b?L&-F$^ZsI~mUs@?~oI$^#lwXV#mEgUWz&&S4=?t&i z-y!b*9AFK2i$g{9`l3%#3}`{saz>iDeC7%w6V%ZWfr7x6293)*(bgHy$&s3}d^IIY zz=pHlcBZni{^ri$4)fAJ)YK1VHrlPDd1V{!`!eLaA~q;Y003T-Uo(D!oV4Qd@4VB~ zGx`?+#ZED~MaS4B6hh~ALk!T9nIl#JoOGmvnJ7sHLFcQogKymuVZPwA{_`)wo{FL# zlB(8fwCvV z>CW`!Nb1E(hyG)b|3l5if&Np*OZ@*_#Go3+9J=f-tL{J+u3$s`^EsVH46iKT)rq`Z zQZMeKKMUTPnj4K}4x2(gD>Jaae4EsCC#LGNEz$ZuT*Jf(&n52`?Ne@fRS?a(>Re&vW2lEM6RxmcII zZYtjVDtu}J$vu9IF~l%m|4pAYviQqI+2_RT7aj5PE-BL_^z`bGDS)Kdto}6^krkzC z#NlsAUkE_%BF9be*OaDHhoG@LiQ_apQa&lGp}zZ5J0$d=U$l`<0z2MZ=}G3O*=bNZl;0e?n7Li~H*y`Mzpa_^ zI|WUyW9tRwmiWW_k@NNw-Vhry-8Mx z4V%lL%ARla;OrC-YYy7^2=+HpS1s>vou?(FV47HPJi|kQ4qN@J(sXnc@^sqUhcIK$ zYKU<^%VP(FymNdvKF+zjS}ENU;+JvpnVB)0o7O=6r!)z=4lRCQo&~BG*cy{0+_0k}Zd?NQ!Duk%<4sJ#sdm z$mfLq+5X&K+i?nFvgnO{?C$>XV`5@LBJx+4Vy-5`a~eC(c+*)e2&RzxN8j-wIYv*a z`WY-%dt6~oRP=cb4t}J;DZoW6Q8>by5g@tlM zvKz{n7}enlWpdTpgtW?YUvAG6n(Gq0@soex{yaR7G~}YTDH{67s+tC7u$%f?cesyo zZFx~;s{9AR`JlK zXpzap4*p7JE0iDvor5mqC^?|Bo0jo8dK2M^qM4;LX=*Y;8hMLF82biUt9(CaavUSX zMP+Ga1+BgAtET- zi%(9((raz&^xw=YD0sla(v_snh*~IBX*Z(HuA)+?^Gr-)vg7YOC7{w?*e#6bQRIF6 z_sqt}2MloE#INbovRrv3s2+fTSS@4vY@Dew>njG4 zy9>&prH6P;wz6EG9`mA5dZARHWD_6;QS4^^B|Rndvp=0O-S%A9&P>fi@5lA`}08aleUiBrrzB{nq1_De4ge5fq1^~`y;#n}6;7%&# z+qX<>9}i!q0MR6%5=+u-X<%g`^H>D;Fu`YIKuGUZ>E89s&N1lM_*nwm5!sslD2QBsWL2txKbHiXug$eO=)-UNaFMI^y9&l*@vf##_O z91uV4|5SJW#))@WuYaJ5+9jizl-jw`zPzuU3397Y7%&mZ8p_@bX7YQC+;9+D#z%9Fdlq_yM?=XdPs-CB67Q z30h!AefZGb-MXyF))(2_jF#joj;+-mVa9ZJ8WGnh`Ge7NWpS<1nOIzMv|x|P)l z#SE#+ho>uFiUK=N)#(yP7Qx(zf5MU$XnPNmVQA*}d50#^$ zqL}x{BFS8=!~XI?F4pMN?1b$3L#E4X;t)uR4bZBkuZ5U1BtN$OZp12R^Hs{*-?K83 z$k9vja>fxpyCH#<12o(@TYdf|4ff_vnt|-_@nm z#V8rOH2gScxI&A#zTRc+jjRrqQN2R2@zR476zn2#eh*Ue*S5=r@OH&zQjKiaT?!fV z*V-LU*&Aaq)3qL&8w6p6nrRu~(LvqJh)EX~w&LM~-KnZd-&5O<$;sVQ*w8}YH7}Y1 z@x6Q4l93VFRH}9Utzv|bZ;gl3Ppo@m=X4kW8$m;v;z~@!iy&Ug7B2Tx_2lyBl8ZFr z>W?U!Rd=tjiZ43)2Rf zfl@tjjBz+*Y|aaNQ&m`g=lkJG_uGRjCrm#ih#Dkko1ttUn9mj8;KOWiTDx)N?Cp6# z92Xv>&Tu0VYVkV_dvVd_MuH7B0V{3=^cK7WkDnN*#&^O|7IA?#GHlpePV*LZ+rp&A z{?pW3{r8UW3H+lT+Z%gT6h_bA+GM@>K9+yvD>b85*hx+8EJ9%~QN*0N8685Wb1Ul5 zADyA%2L*~vd+eK4vyUh1Jvp4K-8r216DFpjiUg?^my6Dr0qF+y?k4IUMACfMGBk_< z3G$jG0;Sf6KC3=*nvVe_y4~q&yt~C(P7eB}%?Uy+K4b@8;XuSeyJFyOqW{b*F0QVI zfr^uplR4)V2_{g52eCL73UN9UzdNyb?H=ew99Xex5WTU!kujl_m6eW;4%6B{PQHuY z?ryWw?J@Y_p?quLZG3WaIDi|~(jVds4Gnpp&w2Hgtn>nA0xobF6UgwdyIuwg_9Z3d z3JCAPlUce@+Gfg?UP)h!qGxeI|5OjL@?&<$-m9I$Dz>~m-`LO81RU+|n~>XW52p#D zHF_O57B)S;@}Gv+F$4wNqe)Bza!~=rgNly1qR1w^r1+()k#isjMBcXy#me_+-wH1c z$bOBDZ+M7J`^dg+zS&PO@Wz`Dj@I@mTn4%i>stCIIFI*7lSc!ZTwF-IXX`sb5Ms}J zJ0VC?x9~OcF)wtNYRTAp34;%AJAN}|A^Ik+nhb3&OjVe=itWc}mmsq=R(JRQya*{o zH~lm8t7e#MIPPQ8(-(!H$NuIZ&OsWdVn*b_$^+%MZ&?|nekr`R5uBYhvTaEfdDS^S zP6?hZV?B~j0J2xTZ$%<#xsq`m9Ubd@j@jP7f6qjWZE9r|86QvF)m>z8m!CeCG4KLq z4pXV^Zy(Ma7J&&KQ=9ziE@9i0=3e&WuM}QvjCWz`G4Oa*TqoeF}aD+ccgUV1hk93NtDj`rW80CTA z_zZ>~<5$rVr%Np@t;q^Av`6-nIn`3W!tJ?UrC!%2KFzY_Ytoc)sFrA@oVPRf0&lMS zX-Q+K_zZtp+wMFnr~MH*S5T>sO(RU5adtEE;Cz1`3%al$lW@F!*WT=WzHg-FhuBJ3 z2s#fPJ1HsAfgc|$?u?^|dF|8v&ReUft`7e2L89%@qeECo2)MX&CfHKnVCVbx;n8K8WG%tgl*bnL%!ZB{@Bckolj0-s@<-9X7+nFclCJ%-gCDBz>RFssJJI2P6@etq?9NgTY+C^asxxi1V=;`?gkWzq0 zItmQ)FD9*lleJEa&#m$TK`7|cH$v2wya<}%Gu&<*NaJiIj~w$3j`R;^4BogHSFAbu$0%CN;RZe~`lWYRx{1e6pM%mM<$3b~vF4{vtt z*yITuFns9ZT4hEpT<=$cls!-zpb{j2bVi5M7*;XBB>KUjNq@siiu2{m7Xh;lbnx3< z1CZK9z6RsUp0b07cqyc0WQrd@ejJ!Cu)Ov?9i&0GwvT^pZ~t8v^H*g$h*zp_cTiAN ztVd2QwmL5K&9l&6Foc(jLz>xHd|=Uq+CF2+*qbJ#q*#D(zdFx7 znwCsiER&(^(5MF;E}-*RSXi7z-0fD@)`CF-89;aXQuvKnLu05Z`L>_GRR9QX3}$p- zQp7P7T`z+$DJ`JEOx|8scnv$!iPJ>_V*ADQ^#h<@g6PXTIsk~2!VC%uaz7#w5D8w` zr6loe)sR8$Sy*7~j35XF6>99KLSQiH?kEskr9#+ic91pqZmyLG0|SGDUoRU8BBbSW zHDSad&3@<0Ak?kWS4hHZ-|#3K`CWNq$f#mJn#lP+Ck7F+9!3_p9sFXrY&QJ1GV*5w z$_2hm`jsmCiKqkUq_6LP}Ce9*hPc?crEZ0`|L@m@uXL zOZqq$EMj6H>c;4T!vDPEb~-NW?cm-{=Po6r7&`D>3vWzKEGD_!jwm}|;XD1E&QSnX zF^xevIV1IejW8m~hXzb)^j?+rQ$i)^K~SMK7YQY0#Omsst}c+2{pfgX5P5rj-rFMG z^k{8desMGGMS+I-+3wV5(+P)M zI?7XpQ$#OqZH2p84KEt|O8js;{##}QKte-46*IHkr!_GrxcT3rA7J=!LWQdhb$vllcGgL z$a4Pt`6JO=GQ-toK3Ilz-&y{Af3AAmV}F)QrpqU@23 zOT}*#5*>|ABqVIMu?RhX{(LuR5i9p0nxr>Af~VwVsd>Kt8CgPB8f0YOD6# zovlxV+HME%XPc5kwz()~XQk@`rhgL3)$TvH7z=s{00t&bP8=*EhAxnDggH@H4h%Ta zg+N+ltpjaOvovkld|=&CuQAYKVrE?z#U?OvsQp0@aBoQqfrW*$+^g8EV97Isbgq}aH8BK@>$+;Gu{xfA$$VRY({^g>XabMUjx2R zu#_b(EUUSl(t zwCD{x7q;t*++4+9m7wib2bHaWz(x`Ezv7!?jr+`o*Q^$N<2Iu}v>WXay!TV@jco6bD$Ybd8 z`k?i>r~;8mFR_6PSC>WT^rm<%1f+uYVfqmuZn=ks zN|CJG9}^qP1|sP??!wpiXT{%uAiI^G57sj^yi!u5qBo$q7t31_3P8QP(-J}As1BgH zpaw&LQP0828LVBT^fpgl^?rgJ05(#24In6S-XD(}Ax)3p*)}%^T*RNy!6OY5?yNPE z=)s>#dq7F)@NECY z{WZ0)kORu7d)vN*ZMy36Bo7uEN?^F6GCG9-K{QR)JC9k>cEf%(rsBIa3OG&~4$z?G zl=IUR?!~Q3a%^pfM?`!9@>-vfa&Xa!SJIsf-?J%L#*fBUWsnDb*5rsp^t0g6qRT$r z!^c2+B11+tZx9TbQdtmKBJN@~Nv^9Ej>bwZ&U3Zjk*~KVPSZ(AOCQ=Jvo3bUt?Z}k zaPCu4-87wA`P1!(X_P9#k4{$AqlrVP&~OCx_uOkJlZ~UHUX!NA(T`!HcJ9sdVSG%kzM>qv2=ont!>0+tKceKRg)oxSvJpcUc6|Zu<*_wMFar9(jJm}xBe^XmdR0W9V35V&S zC@-|NX;?Y7M*e_$v+t zn;G;%o!6lkFiHkDFTwgo-#OIzT<`ti_YvM%ch4T6C;rV-rJ8N>d0{l(><2$O>e&1F z5JHDS_(8fcoUH;Bz3Ez~IIQ!7uiB3*JOjzsOQ&HYy|MS%_h<;Sn%>oY zBgdy+@q4v!EM*j0`#)R&XrII1dra2FR5GGTs{M~J_4YvYw=4A$C)|b=SCDd3^Oeq< zQ$DeTCt+)!Mk=snJD<8 z0OT3CWo5LnIp#9O1l+vy{XE6{e*;+xls?9N2~nu4uQ!;B0Mm_`ojua-%gM=!61Zsw znN`_~tIOIBpf3mpA^Zoty&BpVk^y4PLW*NKloiU~auIUAus~(vFAsLn0EptQfsFAg zNCdKe1+2pGW6@H|3Xtn}9oYTm{;OWZ)YMTyw>u`lo@oaY;LvNCni%r&@u~CMAO!60 z%}K#~fF-M>@sg61l=RME-nBo~X)Won`YYqlbx+4^UWIWbK4t9e4D{w1q z%s^S!d(o5uLoDp<7PkaWYP(A@gq}p-U2pU9@|HS@07kNiGtu5N0TO6A()PXEsmOQ< z1F1%cK@e8c4w~H4r<6Z_jAjEJ6%zvCGijh&Qc|I8`pg7YVtl-5jbOv^Y^n6Y+~`sE z8%dh$Db$`cp-YkF?e$oY;>EcJkb+5)pG7gAo~RxV0y`_JO7mSZx1Os$uwGgI9l3rN z))uZw0!Z4&j6?#HO2!mk1Ivn=yXIcqD2^0$n7w&W?pe_nS)MJM!e?Y#u{$h_%v{}A z>lkj;ZRQvH*NesIFP9Z~W#jGZYd*YhR8i#xi;li>RQZp;A?ewvV#4ods$&7I&sdX^ zadpIMyT24h0YISrt4bVvuXe$Ff41J)#ijjdtzQr*$oq|1(x>Mr1}}m}5Z+*7FkQal z8FR|N%5Q6#)0+4`$|xm%?7 zrU5I8H8|Hh#RuNv%>F6eSi61WhL%XD7)JRQI~k~_$V4!6|Ibk}SC*{=6*8|P<+a*O za^ItZ!vHqH5}@gyC=1fF($Q!&YPy$nZ|#I$wXSXcpLgWpzuK#Nu!uKGgRDCvScjW$ z+^4pIbLngUAjWnO_tp!fDCa0LU;fsKH6ZI|*bcSrZ4kr+4-tFVv200FQ=~{ogM!@z z6$)pq!@n{SRv+lU#9#R8)vS9O-ZCq`MC>hcsSdl!27j$2Cq>ANB=$b!OD7a(Z}vpD z%vU^Y>E-I9;kQ}0%;HUnHV(%;$^!cw5Kx$`c|~a&)b0Hr)gNM?wkGEwoU{v(>Y-N) z&)};;^F5ID+aMYa^D9Wx%IQ4}s%vOi29U1OvC(hX^yOy>4+R?=PIQsAifdbk3AL*b z@|lKFvAIYCNB;-u!;hce-u*31DnDdI(uO!8MX9pLk;eHLcHc?!8- z2fEYeO+5!NB*xq>(f>@u=IcT|@`sHrOf{F0w=>=yA{%;(y4PBL>AR@8hysKYCxXbk zz9v~Q8!6ISo6<4|JKV;gN6rx3bMgpK#P>9Lj5`0Jx&etc|DoITTvy$5Pu2#pk%wn` zRb(bcUR79IHB4o>Ww7BvqsUPtZ#Oa&*(oP-=5)cC{A;j8 zdLhvKd0`KNpi#0M1dr}T1ZjEY2`!|5#55bmgC+?+;fxg>lr9G~G7DEfEDijy1!uW3 z0aS2c+p|5-8i4ZEyW^iUSe#foL2bESW4*j$Vi52MsJk|?(agBWqPMrBY}3-g{$@P= zkl)2JGufgrXz_zQN-1QkAj0gx{(qz69yOl;R?b5DRPoKp9c(~}fxr*A{Z1$Hz$rm2 zlV>;+Q#CI2%0zY)d1dny!FX6CYJQFe^d;*NeM74Zl5EnF%j~L!`8I2(52q;%PHJlS zC~dc%YDEsiCF1;TzBe@il)DiFVMa?t9BzJidEG=1SPI@+UM@^&DMM{z%>;(eYEVVm zgStjfq0ttB?wXPAV{xP%Ln^CO6hd?oH9kIGZvF@I-vvQIgfL!kFgF7Vly$9)ovZmy z(FwQyK)v}wq_4l9%Gxj#L8dG}2w-}+U%-6ZmltUw)-d_a71M&^ zwP!_Z{gJN^>8;aGytbrhMkwuzfml_=nLIX{o>Ye$Z5S~^D9h-rXW}m~9P2~l`{IT4{_VMe^TCtDSX@oyfh7H%^}a7tlI%2;5!$T5nn)g~&oVV)EQf=K(H)9qb4q1?Gvc z1vz91TIXgBH#9 z{uOF%x4O8vSf(3BTMGX!Oh?tTHTpH3-mqEKC`}~#wgyKCJjLwpM*~3UXNrmwo1t)_ z$Sa@E+4keaqsX3I#Dq%!q3jI0!!P86{IXsri%-*Q_Xu=}5@T!Sy4^h#Cj{vr6Xew7_p#{R$f`pT#{q9x41-3b~T zf(5tW76=wxf@^@_?l1%o?h-7xyF0-pxVyW%GuyoP_Uymq3}$0NH#d(6IS3?`cW4dR{v~z#;^||F#^q!d^*pkfzA}_2>@_zc8yXNm1B}x=+Fv18KwV7Of{&Dpj97(U+rP!& z)RDhA5PT-Lv214FI?Fls6Bylr%Y;;-V~ESiB2?uwA@;GeNjZe6tm(+;D}?wM`pstv zBLDO$nGsWw|EA@faoHvOqy76_1~{``w2w!~K%XfA48!Vty!{BW;PVd%e{S8{Q97~( zp>>Qsa9afUvk)5E^4_S6{y7tX)b~97dM@13mUq0=pm4;as;-`IEsi!a0SN+z)S%2n z0G;k)fFk9Y-JF-rote&6Y(IYMOnvXWxONr9^2PqBnmcL-VCg)GPr`>apGx!~#CUfl zE0xb5)|XSXkNFP~+&n$E8Zv3gWwA_^&dsF9J{sdOxkbSu#fDr9xr=&@AqDLJYJI4R3Xl%|6VExpC5LC*>(aC&-=@Z zV#ydhcs9}FcvgVh(OvnaA_4T4m}IK!_H#HpPnjNQ^Bj|&K9c_L4OdWpU#Z~F9`~o& z@K+{Ss$pBj+p#X8_hNuUj6hQey-o9twZ8qlpw98cV{%uD!qPdpE4;FZ@TdI&1s3|# zCsj*9R6jImFXaNl(hM_E?MW-i7u)3gTW~tDo#1OjE_~quq_(z}Z;y?MschkCEqMj) z1`^05q;(W8LxYSwOzv>ur(Co>t3SVKymFL@20i3O4z9SZZa?`7=vD$X0*+d3b4t^j zS0WF>7AMbbz#EtUtA!*aY0b*+B(sLTCVWsi0BVN^V52zXxX4&S7hvb>g~blGmLxOz zoY%R(o3v27E3)cl)6gue)m{T8?1+J4Zy#uNY|neg4yKo3w{gn-V|K*paK%2v{rIuB zB5PA9*9NTJA519dUjWf4!T`s>XuVD(+_it(nxm``yb;-E+EfMTOgfOc!TqC)jyx_A zl^?%eg>?loMcbRB=BhaH-~zw9ov%a1rD`B1h5m-Jeekqzb`vtLJL-_kY~NE@%yYuS@vR&eH1YqCw{Yr2>LFOx!dIjW;_vT&l-9q#zHWL3c|5M4 z4&r+)^#T-Lt+|e($3(q1CRcdI=b*MyQIpxwz~i$dG)(!`@!t9g$l>#x(>yC~)~{Ge z{1<8fkgaVkoUdTYvGg$3kdN;xdI?TW^a92s+L>h^E{P zSln=ocqzWPDKd}uaSgYHNt7CUW|nl=HhbQ^diKuY?5?qWABeFSl^yA;2oIkCK<`#$$k|Lmjh@3_yt z%{hf=>74+m8EX?@lsp|n!xn1HxbNiTh4dO>V`73H0*>fjM^RAlp0gWtWRJNMfaeQ% zdr4euEXnbqC_ywdbz_b27B-zAp^t-I(?u%oB<@3|RWvl3bo5FU#$y$`9JS634X}Wg z0?ce7d{q^qtpx*HJ4OXai?9hTC&#OfB9~MdEiEFz@9%G<;rWTLsS^t%Q-{Eh*D?mT z{8K?#%|ehS7GwUX>5~CRfj;w0`AyYh=Ow%@1So1>Zf~9gB7RsvMcmxmfc`dgPOrnh=9?9atZCFx^lcMtxeR%@6@D|2&te zT7vS|L>Bs8FBf3VrJJnkZ#RO;E{#z5@#8%OiXxesj~;%*l$U__MoHug#Dmdw9)K<5 z1+R0=QIBi2-oCWMkTozw@Z$WulVc3E_m5~DhLH!b&NOUNxvd+oGLzlV!4Pk3;F^;G zBuf7=m=a+CduFkJOY8}&rTNI%$S5T5k&TTl7YMZ{-ygDm)Nexaz3nzfeZkA9mZhTp zqd~HC?<*+uff317?XSnMsdxF0qinb{!@KqlyQf?0uvn3iD>sM_9@`AWdI_HOw-1Mg z29D+9+W)FOk#`1rHZ}j3n@Xzx|EmG*Ss(U&s~#2mQFQ#RHJxr78Sy=w;=nuettGr} zh+x{pO3({;x92-< z%D_7FRc`!*izk`_Q(s@S#@Mj7#v5e8?{yw6)3*q5xe3Hu1jEX%8tncvB)k9@B1{HR zZe4qm=$l1u6s?pQVfr?%q&N5CwpKXJ6Q{<@W2Gs`>%HI6yh0yaRmmOBidK2nO%#d> zp2GJ?>b``&%qJL1Vk{TZ#mJLjuxRG0_eKAZaGk{qIGsO8n1xhg?+>$1CE3&9r`_X~ z&jQiQUwqAu^7*4Z{vi1V{x8S&;E@Rppbk#5TNN_k*-(G@&{ygmJ|Q$7Sc~CAp|Frg z_%Ui`x%LN+A;gw!UyNC=RqCTR60#z(;@6dov-PFv$G*3V)bV4q91F~3#`Hc)9bzUm z&rw#(ay|1QxSIUrPux~_cw)MNAX^Fe2h2n)Z2p%0H*vRjA+O~*_b9b1ZX0~7R0|k) zH;Y~HtAKE%rlHw5s_3Y{M>F|&oTI3_vh*i`PW_DgIIaV9vt_IKvct%;aeJ~v$G}iM zANdusDistUXsI0Mv78h<5M60zf0(M$`cPVQbJVQ`rKlg>aXtk%ndaB=0SBQKKJ|)w zWS4YWarNmeTp4H+Nv+!y@QmPoZo7p6vU}I$uw<3q5%~6h-yEW(TRb4o0sDgr(Y5=Pv-XvC}JzFqy-2u6(UbvJH5aU01ZrX5AY~H z_movS?8vm$o5Q~Xp3_soZE0y~G#Thgj^X6VO$57`X9T-bBgM7uZkV8J;>-6=2tQ#W zAy>4AC|&mYq?B1FeBHYHHdX45(>z=u+Wer!v<3=b7N(Q+5xQ69(Q514H#l~6u3rXY zu%Qe6x5nkixWmekWtEDG&&hdkQer(ppd}0Kcp2HMgEiv8*#~W@a}|nnY>%wsW@ODk zjETR(1U9#)c0U=V)ZSScB4lM^Ru5f%5W;>r&j3~OSkc|PGZKPClzj8ip&v1WCG9d3 z3oD{%S0Ft(I3R=7R`*=sS!R#r15*Pc6Tk}=0pZHh*RyeT=68iTSFXOgx~USSky%B? z$9M{99)bXz4q0koQsVjB5J|Jh*OxB2v<}a5QI8~UUCN@R$wr^sSsUv^G$SvB&iR?A z!EyOIm|>a7cuWmX*R)n2=y%nj9(Oafyw2K0O|=KHY8C19VFm03D)JluB0dKQ%plQx zkr^0%k<2PAM3f!VFfzY4EjiRSZtVeP9+DFW5?U21tgqUTZxSZr0OCdDPIkbs zl%kI1JCZ$F%og$<(P$&uoP{W(F1qoYMXr*+zuTdR)rbi@!lNL}Mv}y9^@wK|AC(*OVyZI3jY$&)M0hTyB>fRHq3nQp zS6_S40C_U!4joE#yvkx?8HWKJJlOVpJF4jiroVdt#@75Rv#&cAfdJqTAAlQ*1Pr!# zUqAD^+LVd97keOdc!GkJ;GGO%xtX57wkV;i&g|rl=YMZyMF~OsX?vw(wYXap;GlIK^XZ2bmSuEX-nl`ETou9bO}ATWvUx?V-l)&uKRWCMh_BCVOLxZY zgSqedPY>WJuLI>i_$$(>W?D)>g^c5Gx)`e0WqJQWK~n5}it`Da)iW!tB z86_q1T+otdTydJki%4=955ZhMGj)ow35f|bHKX#q5)*$3O zR1#=^3P$GO+(w&Cv+#RJUtH2-WalqN@W%X%aKs06uPjxyO_x{eM*c?QZw-5_uK$9i zbhvRq(K{x(*6n>pZ^FpQdI@MTe^TCFP=8_WZ;?-QYQ)osymEf6Vrb{+EWX!S-WcOU z;?IXJ8O%+xVLG*ZSIP5e`9gG>>&7Y!p491dr zFF(|;2V-!bkZ~OHV{iTxSk0Y=%Sv>&JT@bXs<2y;VpR|cKq?~6?^x>+je#V7x?p#j z#qmc8jJ}%rcdXmN0{1xwd=Vh`;ctq&^VRNISA_w$hkf0-dfD_ACr~1LXLEYv4H2=~ z90Lr9)@UIW2`}maZe-8-N7Tn>&p2px>-C~D@^Urnb_l{Gc~KmgsJv3KxEau|wvU`OK-ji;+cS#7 z4+7PPle~{dFH~0p653%&ZAjgk#R;%0>iyqDVrF!$B6A< zx(EkIT&E~3lBj;-{sMTBMc&-gWHwC~5#|{{DGY5dPXhGf@-smu zrU>ndRqiFq7p$pUfYlZH3;#iXwZiWF0DZF`CQcQdQuWpFfTz3|^+|B!$b224{ zl$jP_`J&1Xh%^#3c2|mPUHS@%VuhtaWnzJ5w(qj6Ovsi8nxyL(9xMFQVL+X$qolzsq+%|b+^agbA6U3nmN0CLr#WJz+7rTiS_;C2CL$_8 z$()vyQZ1`)L$jo>EU!o)Dc*U6jMogv*s6Q*7tQbB=PUWIrm=D!QW%0xxvt_WxVUh` z*^MZNhuKGu+De#}2CkaU)*;QIbbjANFhw;&RsSkdQ@|qryw)>|l{RJHd3_}?WiQJ8 z*_?WI^)JqSxOK1fuB~a!ag6t_6*V5sD8$G-rvxU=Zq%jUCAD*1$bZ4dK)dA3a|crP z(e3(HA_1>N0!5LAA#cQzJ1li~W!kERs2EM>9T#kZ*stKOI0Xp(#@@+T`4EX5A#1|x z3Oo?*!tcookEtIDUepQy*#;k1#q@PQ|0s7R3QT7j+19k+Qi72u_A6;9Y&@D(^7j46 z;)-QRSo&x8@4Pa3u{A|zP@g;w5rO(#x@O+OYgHHQf~i<(fuw=%64F!FDB0(}Jm}7E zIVP9k4+O}}(V7-}*9UQ^C&Z$kGcR!Q@T$*h@{AyZ*okfTdSNE6tx$?!Q;&<5DK#5b z0wApTyLS^4KnDMaxaV)k%6OJIRKMJ^cMH=#-U(9%_&~6ef*;5zf*S^xyQ;68 z^liJIECN=U?3iS^`!Uf$FqkhiO^5%OkD;9_ghBfq!suxZT}Q|tX3=NQUd-aQ1XQ=b zpOawl5l5JEo*xH4>o(x%*7Yz}sKwoRl$(cPjVF86X?;zo3Y}T=_LV6UlZwn0K@#yD zu@Em;BtLd}Zi5-O;I#VIF8XZvK(@$r?_u$N%DH7_^e@UtTnEkxO{ep)@VltBcGNtb z!O=MW`9wgnNzjve3;d#vjUH!yj&*;IZRU^g{n>^v+mw`OaP@m+v#CWNQ@tc`>!6>$ z;-i`ECh4>BGYh@r%B4bYbh2UEh#Upm3v4X4lDbl;a+VP!<;8qDBWXIX>@wZX!rDjQfZm@T}w~giYw5ejj?4anPhq*>YPg7n}iI2)N+(eFMMfX_{@r2E{2;FCgDI~n zd#X~&3;?9a*UwTbh)^tXiPZk?D8uy#JC_YbVp$*YZ1j7=8t&^-1_a3N&|R}_+z8^< z?>`6~8yU$XKY?X(hOhud=I^E~E4<7gA3xO`#Tpt$;Q!xTfXfPiOppwogd0LFHbUy~ zckr7cA?`8$zVdX`1U%6tPkmLw2MG1KaD4LP516OKqoZ>!q4ZI5KjN^)2-qh!6m?p zcG;0Fk{a@FF#PkW{cx}OD54#a;wn4Y=o$Z)y8+VVucp&_7Ln91It4EsKBtyYn9PAx zjEROtRSsj8cT$-`uSGAjNDaSiGa<9+*cc=Csg+a)nV7RkiFh}|_Ytza8{5htIXoc! zmxhTkvlNYND#w!gR{=(hrsCJrrf#X&aO*X%!Fh@*6Vp6<$~?prRLP!4N2e)vHmg~b zh@p7E$uYGlX^qU%b{#waih&3J_R=xaGUr}{jHWcGeu8dkp0bvekW%O9Vm zKK2M71xOimkca^7dH?qC3hFhY==d}3Tq+wP3?w{8P4gzHHC(i_p!nIseWyYKCyLQM z$1+;K2bxTR@9J*V)PO=NwTr3A#V%6ig#)~bXSaiGI-n(I>eo)oU(fevNpl&B?FEB0 zKW{FUhm5y(cd^SxjgOB5zaE}X#Lh6M$XCxK9i%`eS0Xk4QJo?C{$Z{=VI?=h{M(G_ z#nrAeAgG|O^dal7;WhHf$RXM5$)mOGINk%G*h`3V%N4?T6!@l2CZHc|RO%DuNRI)4yyWp&@%emKCNz_u`3apmXeI#Z9bUlCXRU$dBo> z-(Yl*WyYh_HR5q#dp2s>VpvU+StF#bqxM@A4_>R%gkWp1MipI`&X2zCQ$uaHe&cEs z-aVR3!queK$SF|eH@LsAL;{?z+qj81Jf?{HUNtzNz-9Xs%_&-(?X&*B_r?Jasw$?n zF|kUKgV0k!2<+FpeQ3V$q@X=znmvP=Sk$e+-d>%KPnd40Cz-GBdIJ!Y;@iaoPi;_l zA{QJ)MJ2+BMx`;eq8Omow}^i=_;BgGf3C=U;syaG8q?&6bkNON2@_qrTV^UZ;Jl`0 zr_BA!JI8_-!8~Qb^40}br_KRO+)lu#U>)YiN zBAW6?efOUAGDCQdwf6W{6A0?tYQMrB5xv@S2G0)7Jsc<&kz9a{6JnOrbmlHb7~AoF z3W?St>^i8FfF1WPn_}ZY#?U$MVZVKo_4RMMw!m_QF&t4L`}K+iGp-T;Q(|*?g;+~M zM85V~57(i|YWTHckZH6|GeNznsq5d=oj}g<@3oQHSc2#Lcf`FTDyCN_?Y0CHX4HE% z%1C#=%0a*vWWG)1>1{+m6AY z#wtfvwx|rIdweT)*h;f8(u?h{!MZigyO zY>+W-t8E}}-HF=5o1o`)cs*#X#w>~evQCrn<=+2zp|xN|cIS026P!-;I?K@B!~z<3 z*m@!Y^|gNMnZwuM;tWPHc9pUpKO_Q`dmr5rMm-L6hK$fpEq0Z(E!h!_kExmNm@parF?MjC%%(2nOJ>Ht+f6Yc3OmpLah zPo;TTOMSP_pA8J?$bdp~XFW?*bKHwH7PFq(ol>p3P@of7thR02jKuRO&{;yGKdTJR zWN{PjULX7#5lH@zhs0rr%FEH-&t>cBCsX8}_^=>`{6jlb-DSipMxz+{lJLt>FQ$}1 ziI^Z$%v$V1-jm$Q$~)m7^SG0-OP%OCSGGNGir znxD3~n;=kDYG`vAO=Rp31pUdi|^^1d?yqlu5Zs8HH08w!NgP~3M$|! zFfQ5!+A%NXFP8Y>!24BeYP=daurOEyd(ljmCxn+}_N$-OaR!k{?B~2f)uyv%2-zJ^ z>QBf6F>yfMKwsfJ8^~O+*3ClTf%nF&uP>5{Q5eNB;vsehWr?9fXfZBKNmuQwl`2`S z0~5c(sllnX>*ay|9NXOqKkrqarbQ`UAKLHnY_lf!5mUDOvu~@~&l!!tDOyHvVp}aR z#TKT|HhGxeF$8|Dh-tv)*ktA|bx)P?4__zxk~j9W3pDzxTVk8B+L!^iqQ(L}y##-* zpf`-Ab>&+N$9f1ws7Omc+pl`Z7kG(B)V+i6)YWa@dkB9Ju|CGMh)W>~<{1^mvxrLs zO0yRK+5Qf0AzpEB+fyfXG6*3#@X28UNK6ZJ@anD&$DTcs~h16pM~#ntn=tv)(g43a;>;W;QSr1-_t>RybCSM>`YwNmA9>Z zSLU=Ms&nv+Z@!<8@C6+tQZc>?>xK{=e|jETo8YC*s9((&?pxc65`H9{(Y=SERLWve z^L$ur@rnZx#8^JZtYFrsIMor-c(gizXZz7Z4T6U81C*SC+FIOn$-N=yq~UE5ex&iQ z2r0Tj6-g`;qHOO496<^Zv|1QUI|)1ChivevE28^+5s^lYY%wuP1K%A&WkZuWjbeup zzcoCoRN2i^3e7(X%_QbKD|!|k;7=(mdOr8V_rf2>ooQpV(zHU?nL~4;Vh~B+ZLIKm z-*S3;+)+&O{2r*Jn?2PN=jpJCPrar)zLZ^cwA?=P_O1v){>5-J^YDgnSG*m#oqM;(X^3Xr zIo)NgpwE)>0tbcw)AXtZE?ywhM^?GriYwY&1#yTMU;!G(LER~-G@%4Ij# zVmVjtYfQq4P*7iti83AA$kE;bM7VaJ4Y?cswPWQ?8vaWuCNX*1Nz$Kv&@Fjq3k$?j zfzry_Vv^;Epu|n^!vl|OyJE|=GRb(h)#Ge--lgMe=FCR5wqF^G7gZlxa_8VNY&LYZ z&Jz_3<-`v!C5HHT)p*RMI+j2hro!YY^apJ0SZb^dGEqp#Pr4n3p<)@{RM#L%Z!C)6 zvpZys-A&ayirg`h#mw&Y>>pw+Ma66>m`jMuo?`=apw_ zAlvZ3+O804=Yv!Kq2Dx0(Eu*HMLgI1XY0R(>A(0VG!k)+JrDLKh#u}%@6A9Em7)TI z8Cz6VAO+y;Yec|ITE7I@kZ_33T|5*K)jS*WWm1L^Nn@9(BPFs z%w?v1v01cl7mSaZ`A}HS?Xc!(E6wt;P2Xzmn$5uz&h;OJpB6yQ0r4xSUhYrXN{!2* zcWUT+!>u#WZMK)Y&0NOR(Kc&P!$>ZlqXT8yR*-#ehkyP{ocH|p6ggrZMuRVuI^Nla z6!DTKEZ<&hWEEW7qDc5>%Wvjy?63Y=f^@bq);A7Dm}+dD+@SCfs&kELgUc;!O7seK zu@kReKhE8qKUwJGv=}U?&plZ80;ir?mtbcm@!1;dXkXR$zEKNX?CS6DR|+xjx0Z8X z85o88kY9Rfum|};LaVdOhtg61yt{seBT~r>TTQYgD)bkZ5E-hlYIgnP;H&%(^uNu~ z!$v?w9jrk;Ul)o+-l7@^QG`Onj-4q6kl|3PuO!Myb~jsOp0u^D8=c;`LZM%-*-7l6w?E0?VzRkA50j6r zQYhcv7{sV~+Lo7Z^Coi4`&DybrtL*ic%xJ5b!z{XIolrXb~Bc zTw>y8?ls|o5FM?hRq!WDnPTH8&t$7zfSNwa0L-MGx_-sPPghaP>M2Htw1<{9W@Xd zL&eG(jm6Wd!njt3Tg?A^@<~~3{C79d*q1sDcH44cW6`$iTVbgkZsA4ws?75&0v$86 z&1FK_Nl@PS4cBw~*MKo_1NuV?nJr41^|n<5P_maq+$K+UA0Y(Uy|y`hz{kav0&1CE zrs+S`gr!3YB)t1$v@V@9TnSAfWib%TH(%GkSh-Nt!0Y`MSBkx{tRIf^v*KDpTl zzqFu{^HL$Ti7IqG;MBp=9b%JyZrmgouy`rD;i%}WHPfZ(j|%{y@nAd;e@+xsTLtm z6d)s4vM=T}$wbK3M|}5xx-oF&n&$qwn8DsBo}XMYSSdN`(Z*<_!G?HG3KjL6T ze^xcGz4Z^c%j+8e_Z;KrX*R5lTo_-(Z|B*~k)8dWlO1ef5ni8cnLPe;w16X)^63+1 z$%y@aafZ;pjP-#f2Da(*RVg!dlp!1U*ZkPdliubEj|C zQgx+`c(<1s8$0=j1gIPGxf<)>ZDYB4MnOi-_49*1=$a>)jGv2`_QD*ApQ~8*Yz13C zjATtKie^R>1w#a5RPggOXqsTx% zi;wjlQ_RJNdna!P7^9v48Ay%{<9qsYxk_~wIx=SSW5&c}HSUV~uBYx{Y?X;*%ptcU zii|UBv`L<-^A}9P9c9e`9RqWhsiH&_xi_-I|B6xKZ#V zQ#QY(W5UJY%y8&$SyMTIb6)tipPeDE^VWDajo*a?J#WljQZZ0`=T;v@JWL)uC)ZP0 zqKRjDrEIW=#KfpDWrn=0l`Q1B=yn@3nkG6uo^T@PB@r6bKoPTq^$an`X zFfeWK)5zfogqfw>K3YW2(57V-&W`>8xyg@Ma->J`Md1Ypr4U%;my1G+G!9RhG|&g+?*!*7z4^yQ8QjxSdE`8w_%i)Ts zC;g|e>$i0lHVpA9U`b(yN^{$8+$Wv%Z$lE+!@I0tA?viMV_e?BICWPG9-J$zCAhpP zbhe;wN<-GBpGmYpzCuR4i|RD0Qv9YQGWdXvFZ$l&sM3yBgb=yhtTrItK?-jTY`?Y+*u8kr}Z z;|;NJ#beLV5cw+mQ@LhW7kAyXwN*yd%4UMkHNzle+E?)6b^%atv5{C5hN9w20FW%M z)|KgMcWo@CTVLl9`co`YMVk$LmzH?lLf68S^k)gz-tKKT`gsnP4&5&We5Ahor;Xwc zWaI$r1?n6fVhVBKC2%7)*)d*62JPmG=-Yt5B^{*k;o%aOTXVU59nUZ6Tlt+&x>fr( zM{_89zn6#o!Y&=1SU}M^o>`I4^<6Iy{7WMTGOlZP+CHx%2P?aK;1qTUnCJ3{Lh;?_ z%)(|{@@u925LAn7eJ9p*g08kkCCiQHvdRUiQQ7R~Vj_h+S{b#I){{5=!Ry7F zzLZX6Z;SkaKWQw%l<7B9!Za=xAwi%{exb_y!n$P0@yg`Gv#P*M24c&KMEl;A${?MT zt=;SH8Mnjr{+K+5h`RPpy@Zdc4}9;V(QU>*lKO$XQPtfjCh9WD#;t*HNJ(Is;jhLfhJ&nSL++ZaQZlMj5Tf2c(*G>*l@ z0axJ;CcFBa7PkG9lb06v*RqKxF@^6?D?h3&OM-3d@y+i56i}ndkvKCY+{%;_^ZNrkR-cXQ z1+56nISAVVgXnO05e*&`=tvH}`Hg||94*Uwp6|W8lNO}(P}0;r@SwS}j@x6koGhbz z7dfN&C9;phwJ$T-aZBg!>F&qyOM}GgMSKo*0j<3d?K|JnNjZ5_8dk_}PXaQ5pB0d{ zA~lasD6c@L*Zf;o+|&Cd;>l@4Q4@UiIIlzM7S|Jlf%vDQ!ouif=~WVo6wTxliyxP* z4WBaasY*1!o!b;Y=dJwuLe_ps>ciIp-MZdzzim3cV~@_oG`A?E{+4jo$VJ3D{bn;0 z!)8#(6v43beyg=kBWKQKbbQ6x8!+j-UT188%E!6KX!%^y2i#TbkE2@b{&!YRm~0dFE6Ja4eEM(S7)D9 z%u97_Wo7SQSGV~Q?jP0GmXXSQTp*EiE+M5|a?_+1{lwb>(`9dIg^^c8rg13)>vZ`- z>~+1(oOxjFjST4uq;W+xWwpKgXS1_JzROqbk87yvEeVRkUj}Nji=j(KLNgo4KoqaK zpvGu$#?sQm?|pq7z>@%=$Q;<;DEAYK2e+bC;-v3?rsbRXCI8$$ZjSip|9y4MnF9Uq zC#Ov?W;(pce|B@q#)0_nbAsLu0Y0bSlYK6L8vpO-{T>K8ADZufwgZR0B24@Mz3uZh z%!P1>Jj~nhJ!j}Z9Z+`D3B=_g{oXkyIhpSF(reqm*?-4;E(a=vX~o2;k~z%E?bh0r zsas73ah$h#cUUwpdu;m<_Xq0l1&Mjy#>lx*kdwm&V#UmpWgXs46ETE9d2G;?+Kqz z)5dj>Z?}}i*gqa-X8A^9jnldISUT?XoO!3n02C&SFQ3dHNho~jk^!&(^ByFi9AE7h7 zl7oZ&S7>B*SrgW1Yf#}n9Xkj6&s$<#Yl)5-^onkEz%24z$2(xPzWxNztAJ``1GWow zyiDHF6M)@Ev;yV@I;{NEDl4y1C{u43MBGP(a>|~$--x5xj1(3gb-ZX{Q`5*%rbkp` z2w7`X<-9vR07$28U~r@dnDXxTDO%20WPegyGLnL;YDAbMCA%gi;cGjZHq5VCuc(58 zf-5ufr@0I9#A`2U^W#z)sjqmgAS8Sc6A+rtk09+&JK&JWnAo^22MdorC3AbcH&a%A zZ|IAT4kee$9RVOXkk%|5FRs@9Q0Yhh0dHE<6p6Jyom2N8;->7e)nNdIbIG8)5cj-h zf;&xXrg92|ky#W*)0wIJJ6MFh@9O9_e*NEEfJoL;1%rjKGiM^`^nJU4Aj#;Yq><~1 ztxt~ozQzR;oxsNdey8(V(Q;&hkv8~uY6REi zj>J?Wc4Zi#RUy9S-p?F@9~Niw0sG#Bry1rC&mcXE+=K4^3hw`MI8ZHa zH(;thBV;8GhJ;^I?Z{C$lp&1%=uU=O2~im9b9^>vf3eE~syIy?$}`t4?jYB%&d@2S zWMm4|algIz+tW{QU6b3b@!)yv%i@iX0LC0_9-Iap^tA%0+CX^F%F zr~}l(91HO&Lzgp!M|&?Kwke(Dxke(t>3YgDldLNVY#2nJDY0E^CqRXtbFr~u9vmDb zVaTB`oH>*n?C|;ahsIn5z4L9QNXlnyQ9@$k_Qqq_)~QkxL(3<04`yq4R^Y!%>NC;u z74r*wReyWGP+P0S3w{{ZFCQSEi%$b~MBW1+5fi7Z$4#1Vj=#?BmviPh%2r*UT}gB) ztThXrwO$5%d%Sx{62!yrurHcV`UdSg2%V=zf>>C{8t2dq`bo~86P^~%ZpF=i@nb=i zi0QK{%C40u4gJEqeNOgB8?D)_W+Cr&j;yPjY=tvLRCpXVL2>tu0ga?KNL%v@NtM+d zZO7ni1Ms#vb8_~qansR2XC;t&t`0$NdMS@FJ) zyLK7~c=?T|x+tnAcTIei4b=Hy|1mGEW?|;}YGg+FPt@`&K+g-F*_dEknwlF^9N+P1u}g-#-)Xkeg!82^G!E_mC}B5{VO5OjOlYlJD)z^h%^N`2vTYWt57U zITAx%fbLYc_A(SRiqi-LGE{2c{(f-5tr7b)BlOQ9*sV80MUmpCZ%u*={O70GSf$a7 z0OfqNvqsU2x`40Q3Kf{lX^a#dtoRhAY4Sq_lGw+UqTIX;|$Z zoGMC|lTMT6^_M9kXDkSDXoKpovG;oH>!!@7og zuIVwoc51S$_7m0PRU%+Ta`RN}c(rYAf|N&2l-$1Z2sEwNTPUA)iYb_}+#)})&Hf?s zaBvW&$lQwCD^>+jm7(x>Ey<4v2LYoXZa*Sb^kTuICoHb7?JUs2Uj*t1LU=HZV~9v0z@+PV;FEN}t7|lC=&D zVnp};Ff_ug7oO_5fc6s*ImonCG#@?U6BzY2{)T~Z@B~9ySXo)Z-h|Ouz4d{ecbY^9 zpeyJCNM_N}>>hWKC*$909QzKbbyBFQ82CcPZE|M`2+!sY0djLBtCJLwRRXwrETq?R zB4lDmDAlDttOXzXxBMq7)Pl{ZP=L=TIxn@y$gi9rVK6=Kbe zjIxt?Y)RM2*DEV4;rITf@AghYp)r z^=jzothSf}`9|Ht&10g#41@bbAP5q3rNgnoK%L^3{Btfk^N~Z>2>#DRV01dRg8WZX zDYN~~c5}h_0JtZ+L!A#_utztuVr!0z_S{d%6fWlAQ08wAwu~;9lTxS6<_e<1I+z=i zz%N&X8SbYNdTzH!k<@A5x7Dhyj|c;2#ic)oupFfDs>&z@1n-CJbG?z+ciw_ugl=fN z41!|$rZ>Tmd{zCw+W>sk`E|CUEzLl|!>-;_MR35Xc`q}pA(VwjA3D4Rf_}P`*<3xE zxf2B{(Ky1s_&5E(Jo>il{_ikC0W!58y~GptYKWHhOVWcB>XKA>O@20NaW_^gDf$#A zy%F@X%(cfy`6v&hh-jR+sZu*X7cf; z<5?i!$>*0YxZ*umVZdQP4Ull6DG2^7YV*MxRV^SP$&sC%0FB)PHF7&Mm?tE*nnAC< z+?iv#?@@o_9Lk9VGaQ-sLuu~!cqQHMe@z)pkM~dQ%2D%_r8R$G;RL&OSiPKWA2`w_ z$jG_yH-o_Fqo6|))NfhHsFBL**J-aB|`qYqTi703r6KBE=9lg2bi%8$8c{^Gk*J=GT{k4~~ zjE7U|4gP{PxI4r0sj{VsVKcgs8qf1{CHVLhugoXX-NtcIw+)K{banc9+9a4 zz&6zVwWvGc=YY&xD_S~_PYXa^sqnwBv$>CWYZaQy*^R?h@eX}*&1eDXGV49))KE`3UztQ9}fAA6PnEemuUwz$p9tmQ`PsB!XaS_Bgy5!uk)1*@dG1x4(-eRK;n_{&f>|l_lDT9 zItsTXnu5>`tSz`TA!SZMtSDNg$%WtBtL~c#GDDlUHp60|bqW5jg1ZWwii~;c?6!CJ zC;UT$xjMx|#f19mvnG(KW5Lf#_PhvDdj>0yRDYp{C@%qtda0R}x;YSY9PKno3 zMbE+%4sX-ozQXhx-M!}fe4$gdt3|3|UQ6dOHoGq`&oI6~&P3zDn&9n8X>Nnf63=9w z7)buom8InfTDPW9kXpv>WXf*a8EJ9v4ivs|onJ*JC zwYjvhs@t~Dgr01|pI7eq%{HtPoarBu#4NXYlCiC{+oa3|O$u?br4QgaiEJ&3ixDsH zD7bFk|DV>rGOCRyZg=rQad$8N2MWa{v=l8xTco(V6n7}@E`_4S9ZGR`C`DR4xD|Jo zBzHOY+^_e%AKsi~bIxRUGBZ0f`_t#~!@wRg6WlDgSby_LR9+GH2o~oL3v+^93DsH- z32o&*5Tt$@E38~CA`oqei_rG@0gO|#@YhgB4=5&d@w|C9UYuntwW>|1Qi4=_(EZZJKV~OwkLcO? z)W*@l#4oK}Qao(EP6cD{+KofaZHIvPgz+*kt$m zu5bJBe{BDJH8DvKjH47|iBoAl>vM_-Ja??ZFb%(AVB<^M3Nb~!vu!yVfADf%U*2fZ z(wa*|{L;9IhK#ik1gby~=q-A^CPceLamHj=8|Zt&u14{rXcd1#jiMmYk`meWFK|(M zRP9+ORfg97%n=gN;3S18G7!*s^Q_vf_N=FqMs#smODf@mvzuJdOOi^`>)T^F4cpA8 zjlgWdFS#Xz3PJz>s2Xh>Nr_;I3<7biSZD2M)5&r8j^nf`v@TaKR!BfV-~;g#niz>-;?e#n?}=&NnZAA;T7z5lUzSZ?UNZmn>NKlq8>h8RI_vTfX~;AGDip89;E) zG?3Mdzob_oUhHuu4q`KkYol@FqUY~3U0gyygW!HXNh!Y71w4yD{wEqO z9O~|CX$-xAuq6qk@eD-1G)A-krLe!X>1<0qprTRx+=qtHedy<(O?i3oJw^oV6U`0f z74wUx&XDR0A>9U1*ENn(e*4R2S<`)ymW;9S?rgNkOr~{>GdVOVP}@w>P=AKe$xHc6 zfP9#LpXM#ZDUfp_zXkey+!Rb<{yB|u))j%SGCJ{Yyr+=w`b8RjGV@>zMX)kcL}VO; zXfc&F*?4|JPeA9g6iDTvAB2+OeRRbpAyCM2xONR$dhNhI{NhW=(i>}I?gzqAHV&bw zff{Qvv-n+nv!v|2VQmu(+!D3}Y#DReQKUoh$*6#eoQg7o(0IL@W|;=D7;Bx1|JCqJEOdFUx!zcWws}F*l#x=pzTm}VIhMY z9eu7vR?S)jjAZk@yAvhl_K#}0fz!1n953CK_1&jBHMqMP~|Z zApR+O$1vcUJD3%gL8O}&`Sj7s@oH8$m|j4X<7JgjAy_DEn?;xplVCL^O?a*RJ7PZ( zBk?R}CH1y-+Lf2PL`w0JJ;P>%>o5I1%cos2pZ9Q0*Cm;%!=9 zp8rmpK8Hg9JZ;!4=^bnIz^~l#Y8n4mWzr9;U-s!qXY7h@F^D+rbSJgGi6nlFEGren zEHB9=9E%JQyy;qfZX(SzGBRd1IUww7Ax01 z^Bh&U56=;HfYWX4#Kxo9ILg1T&wy5v-{1gaRR^mak0)|B_Go#yIRD|bSF}?U$B4LB za6ev@-8A=H=zg&!6bfQ9zsq$cz>)2Le#au)zb~9^y)~=D{|xIyx;L@I%rdK}urP3v zyXUdig=|haqj%8ph8~lu&0oBG3zJFMq}F9?n83Ha7;EszJ;Oo~5b7+gMmpil^5p1!t;xXXi3W%-^NO zM}}+Ogysy>3w*Q?8xV(fx6gQRvP zKG7dEyj1G%eP_kNGcYlAap=YofCpnUZDNgNAFbW>8<%km5krsX#Pj8NdgxxtvR&u0{QIkO$JbXEd z`E?h3of?uDDW$4!KcG>-3>ubRq^_QR-@(T6n9iFK)=Q+BLBtK@8jW0Oc)4t7N**Hs z6&An#F0(l&;S$P;!&lW5v&oO`?d~^SX`n|=gO#BQerUL}IYm#@&g3-HjZ`ggH5X4i z6ncpbPV1K$@4-pz%plR%01 z;}tDC1GjRF(EftT#pr3)(UD%bp<#TnIO*||kt)R2uatMUB_XG0ubrzno>mT;|E71} zixiq%E=K|FeMU3 zA>dD$5vjZP*M-_r`S8VYTrp7|kOqf2{ArS7&QT;PVEIkIKB*bxhNTE52}x*#sdF3G zLF=BsjvW}+7m8ckDHM0;+Egigd_)6a#S;Dtq61|ohNM7;?8@NI0mQ-#p*rhN6tBoG z&7#0Y!p9}pQ>zVm?ARjSufnGELkYj}d)F`!yfw{b@TjGKbC9WPff=kG`rmB&OW5PQ zS39vv19Aqc04deIBEKJ>t!dLvZ$~ZX_T@_`8}=2mgA+ag$zkg;YgE;-e=)2zmU7^T zw03*8`Ph8&3``?BX}T#A5o#}^e|@;%5onCkNx72V3`GH7`Cfr`H4>mLfc;Q4$jLR{~|P z8uc!lmJrvnIBPm*68Cifg(!!Z|Dez|a}L9c9n>~o*E2!?@;wZL1#$P|s>{P2rc3;e z!y7k7wnEK$OB-FWEtc$XHR*`PxgOx`Y(RRc@hwbwpu^!Ffrw4lR&{#lM zAWa(c=r~}^c>FTsjmPK6+!Z6I7sz3%ZF+WHn&A&3G%bYP5*Yc8H3rq@ZpD=K(b(D5 zwodqlw%cu8-4>JGNQH(e>$n=R8KBLalG^3igLLHOx8F-f(?rNh4oqsIbL);BRuNx$ zNH;`W{@^>yDJi)YJY)}Lg?gUH+|Q;mR?ES`k*uGP?AYkf1>IQR3kviXiC9I&T`lSt z)?aFr-JT6WdEG#+*{7E1`@;ykV^dKb${xYknm;Xcp$&sdk39%{g2MGJG!%CRHX$rp zFYltCzJGED`dFDVTlj~jqy@ZOE>f>;zG)7*EZC?$ zMzaT84_juZPN(uV^lFgR=54q@Cj-Ah%65)S^@la0>1;g7`xM=h_|3IHQ(tYBLhhkd zA9NqqHwWJ2H+$j<_IwFp%&8*t356mxPq-z{+c~`&km_$?#0nC}WG|OxKus#W%G5FA zurW7WfA7D7gTTH2WZ>~cLwIjk!_xR6f!-l4#r z2oz`Kc`p7nLVgc82&kD>Z>;qM6Px93$8~k6?Fc=^)J!`Mn!!x*+s4=QL!)|uUW5rF^ zTwHEH>)wa92SXPpA)vc%39maH+OQGnaD2mQ3^e;tX3bnfO#!JYf;Hw(I}Q2n#YbF@ z2c4^jnlJFEM_f9r#qPxFIJuRxirn2~OjB>O2IXAtS(tO|(jE^s_nUvtcE{tI?`X0m?rU&+tE|Ku-|t$xOo)o-liFzvMXZ>R#ev=U>7 zkfqRtQdZWkuaopNMJ>4L)dPBw>PIraOCbh7UjM}lV9eSn7 z+Y{Uy*pUD*O}j5zh}Cegls)3F?DzXhaVw6Ey`QYPAUNW$PBcW4zWEE6$K93fnRHd1 ziC~7VIUsfPfRn|^<6pG^dBtqxM2;j|Kv1MU(i4nvK;5>4-d!}wfR}@FL85%PWGf3n#}e)5bvY?qvT)lUnkzq+HS-!bQJFMJYq0zfKrfBNm=Ex zn=$)Otk-{hw72ea+3Z57?uy&}SKS6WJL0zWE%~rZC447ssA<34h7hCU(Y$XuUcTEt zjlZOEB9U2OFKxws%}wMQdAPg=z0)jFksGo46TrTztwwpktOUNK@jZy z8MFe$d}R5}f>QS*NQg@!p3Y6B(pPhej z8m(L?%!R%O?`L(_ct(JcGv-Anl(|D>2d{TXJ@|E*vwjnodi1O`nC+4jso}U*Khb42 zxI4+BU-z__M<`Nn!!EZnZA+4W-k_MsEf0dRPd|tKsK9+-SJH{G_fs%Sp4eG99(^+B zDX$3nk7A3pY*Iv>N_B{5WHQP;O4H9kVdK z-2GEMj{w2W_3LipSP;cqqub6P4|_yhoV$IKrhhhmAo%2b{AnuDX@GUF+#HU#3M2C> zvd9V8hRI^AucI*5YOnY2+3oZEhYWf;{20Zh25|Ttd&GF7mRIfj4L{DZVSXUZB9*z* zDNP|Pi95ENd9LJtYgRY>y9PDymz@XB;GK-QE9N=M+Tb^fO`;`|lofTaL6u%1@0f%8 zYWsJgyu`(4WB+1->Qyle{a7eLbkzRFj1BA_=i8fD8T{!Ngf$8Ol6!y^uQMJ-)so^L z(80=Y4zim>N~!q?ml|ygF1-Xkh^~^=^w}l8cWfa>$AdL5fFfS3ilWSbE;#XaDk+Ge z)9escU^SujjrvBQvdOR><@70r-P-G;E6&Us)!$?ap{4%ylNDny&Ze}q)au;BCgTpV zD0Va7T>cmrFf^DgHyEjdJ=dV%Vj48^t~$hnBxRXp6B&yXW{Q;WI#Wq}L>gUO3H?4( zUTO92;|FMYCC6K)t!2%`G<7xN`G8$EW;R*#$oA!hC^f2~l~=9SwFeBv!sGKfIw!Z+ z@n8!U}YA(cX#?S5~#!s>;;ETEeaX#qbXV2{hsA>>Qz?u;HNi9wX z$`ZU8wjh1+5SxZl%;OKxuhUPIrMGa82T9V)mg!u2tjPi|G zv8Dg=G-zGtIGcz<+{?=P)u{^n$YQ(b@;>%T4P$qxRM~VXXlKuPVdW11#7hcqUw^>D zZ#ZW?zia1EAOvl{A)%pYmseND78dA!etyFi^R z9}yZlJ!G9u7-><_^7acsJc!wo_3E}`o7*r__=(2VCFBvU6FyD1K7_bOv3u9Bo}Sv! zI({>_lmh+pnM&PbiKrkw&39w~x`*mzKFxsAU8ArUJGry}o`fd5PVp=gnzK?3D}qT0 z5I;iD*6(v{gl9)}XZn3~;fGx_Gc$%Jx+)#4Z09@y2#ozVb)wmooch_db8^3bX_ucwu|Di-Vx9hchat1(>-S9{IGd#IXI#uJHrYm zxQDSKtCD`V%(+b!=7yaJ#KgxB@nyucK4>-Bnyxr>=rifWhK%!P#E4?8&CQj-?#xjq zf3(vXA`Px_Js42`I=vU~^@r6`Br%ui>+3^)H#F&S;&qUyOfkZLNf#Zsl%}ZS$d@?742C@r}K+ zv@Ee9L8=uyCUyvjpI1C{DtS$p?9mb)T{2PE`0; zMIKt}7*9=26(DynEoJdsO>8^wgI+SHBdEad@o}36A0MA5Djp>zB_k^7(e3HD zI9&OpCvLQvnUA|o!6_#xzLGW7)zur_Ur?%ZFeP>(BQafFT~S**JrZu0;pAZp;;4j3 z!#fxI-QB>YfyuPFSAI!}T+#T?L|bnkpFfL>(XurS8_{1lJGSUuSN(Qwp|)n_ zaxWa~1|j;8q@saILns|73JMCeM2FWVz#%8v6Q>ChX3cG;qe&Er3Lg6eQGahON1-dM zi2w$oW2GJ3Oj)y$qV`=3HSX^2q#)Mwlw^H;d1$Y5n@--&%rJiUB*;zp+j8NV z+EZ=l#4?eoAX)7_O~;QLjk^cqY2l6)EtJ4^9w1_9lboD9kXfOcSft~|)5r)o^P~nC zFM9v|`)2~y3$FgSlbw#6l?sZ2o8)XU50lkSKOis|0}mMhyATeRpfjqdFeXm=6EV`p z%Q>KaZGZ?xWrc}0!(J-6{K2O6n1VWj$EY;ZjIy1=IJrxVbk9;w8)5 zG|jxdMW-w6uu3fIb(oVCfbL(vuv%MNLB}mfRITdL`IR|ciKXtx4`dMk5-aB*dtzs% z?WB_mIKADBw|xLPN$r7d)?8o0-TD!5ip9~0Da9Lhcnc)O+>I^4n!?#$Dn<;43`*_jWil(Io^}T z*sbG)006f^_fDX;x!KD5KbiuUt87PNgW|+ZG^9Lh=<53K>B3~c*8~l|ETZyv zC?AVd=zw{!k)@BfRo!NW?Vc|i+uQY;440bP+Yfc_+Cozxz$9;wK5-8jiWKC!{DiGc z8Z9s*BSZA$`4h8-orT5VDP`U))pJ{}v=qecZL>YA;?N#O-jSzx9QZcl+Y_bh#r7UI z=445dyCIDqQY-twNQFLMc{HJPM@69dAeNPp*{@pFD*z=URvT^Fbh5DFi||JM=pgN; zy_YNA{?}0#qhzNg-)}4A>Wl|M5uy#uJPTab4gjYhBbwS2%ti>%rbKE&V-Ti|pL5Hb zZlQGR?7x3W0^Hx<+x*I_wc`hGr20;(S~E%M6+P@SPNR&NSf*^Dge}Tgn}hB0CRwp4 zlLap@CQz{`2xQI%j-k2Qvixs_F5k|;0eYdNE5+$H&;MQEKyeYrt2|p34ksk93g^%DRX(5-{PS{F(_3<8e6?-;ZPnKHd zFWilHvTA<|x)u2^pf{s6T_KB|=MAkcb~pelZSWru71w3wbW$2mWZzRJ*1x12f3Fi z18=T(1ld13Iq}L~o&AOPKd_~b;!wy%eV0lz2Ya;&&E+{<3H_5lN={Wa&Pz^%R{Qh$ zu>N(4uUO1?9Ai0pE^?|0Ng}M^wyU59-uvAYO^Xi^ITH7d$h(!tLR4v<`>t0)6kQWd zqI%#mU{P+-)z$6$E4JE~Hk2cytLyg4$IDBkmRTyV+-i)m>XpExSn&Q>a;qRDU(h!1s39(Xej#e zBfQB&6LGzYn$xc1cYV3n)pB+-@~v|=d2lT~J-x26F|4ss@ckWl_pR4&Ylqfi2~l8y zgU16Qk`?i^ly7SJWeT(^_rYxy1pAoRVK604^RD9-h5ig$XiW31R!N5MoZ< zle+~eznQw9nc~)KHqx!8(a@Mln78=mFQfQ==^EKu{cq#8i|!~sCtXK( zvI$a0U2_!Ai0`j7MeSWlc|UXjsewzl^MpC^@RI(`MAmS}UIpFTnZoN_@{7-)Lr8)-5TZ>lhVz$0YNeh}6Ucs_7d8y~D6wJBp zcl0j!Sw@#J!FseBH6g!=8`1-wbuH#5-W(FQ&Q4r=T|Nw4>JHvLGqo&p@Bhzf4G4C`F{KQi?`r_zc0~Wculd;*ViW; z0BwZG zXOv#W1}W7UF|vzv5_Aw}pg*Kn(;?v1GOpCey&6uDqZ8FyOq+XE9~z|Lrd0Mf29CxH z$s1((&bVavtT-e!1P51F2RhT_jDeqNVyT{`=2* z5fmLj%DYd)$<n3P!L6cn!ozf~nl|G2WvpPG;SBOz?=>nolH%0F5LUPTUv zGY1lA3feWp*!SjA22i@SRWVE}wm=KEkQumv|D8FQg!oGTVX@lq~+EzK3X)*45%rxi)|7z$Uo8W&e9KY#TZ%G>;!4(Gb zD^7I^y?a0@r|GgljoAFlz=oi_LnjE7+Om|(V>ighz4SAU@zZC($a_T6XIx2Det$+a zhnC5Jtarvt1QZYQ>X0E>ArI$~#s=o)qe`gXn)K$ZM&qk3xYr|PUEm#0@_^3rDQi4~HjtE;(>VjW!#U2BMG4FhBYkpS1mr<%0PF~mK(@}tb8z{)l!&xyI9<0Dh%efe;eWxlp9JcL`T6<9wrxqw?~x}{I{d|~F5ew`>pM58 zc^OQ!ksJ`*LXmMMvC#olv1y~96OLZ)+hP(b{eJ-?K}d!Y%Ra}G+DouD@eA!q{q0*) zuSM#9D*Epk74TFt74*MRAj}8!r(-w2PBWjerHFC4)!_&0cGso^3grpuI@dpyP1<5j z?Y-hG#!oQUdGC80b}g~7|J024QAJ3qBRQb3Z}X#oMrso)G$o);`)!@}rRw`Z%*zMn z|EK@Nv?_w9DOEOf}v>u zU;3u-Q6y%yeK&xN*8NHAujG9NfO>%xNOF^}8Syz@Qt?T^ra}U*h+zmr@7|s>{M$JJ z;Xi40l2J1mFiA{ReLLwWbThjut4H)?Em#06c#;4wgEZCtH9@Ck_!?t&z0MaI=AH}< z*6t4c&@wi~n3PIgLgyR< zTT&JArSb*E1dch!i}CBvL3OkLwk+(xNHa}`LUtlE6#{n0H0($*P&40LEK}i5s8u+Q zE=ogJo;@)T9Jf8WfSs~R*&J5R0I&^%QK~Cw_}h$9g~A1&s9Cd>P1nDyq65sG_u*fL zt%~KJgO$11;zLIRzn{v=3^ap7mI(4g=u*q2RMC-QD&m5__X!X1Vyfc3Ktr#xs!SEEGnGTAi{hH zff3m(*@VmY!$WLr&du&f!W45Ie&j4%1@M8m*cH&lqE#6T&xz68Aj$}^pw0EWrU2Id zmXRe4Q+s^CV46R$1gmP_mql-JgFHiL6@eni|!(iYzZ z$f!|Pql}nuPk;^g9Jrwdc#NH+NIf&WjKa7^p{t+@VrE-9{~u~$?)fe;&%&MikK3x~ zryH)JM*%3Oex16w#DZAyc+A!9*tuX)emq274)=rcmHB+?o=j&3*O?c{_PlyU*rzEQ2zMK;`eDWoUb7iD52}j=L{)@q zOIenz(J8gMyWV~x%1K19l$vyQT9*son3UF!Z@y>8D6vdgk%0aE`o0^1LP0(4zc*E) Q2!JmI8RfUtZ;XQe5AU|`)Bpeg literal 64294 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%0AYvezy9B!xc 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%0D{oLvH$5-#?%zReLmA#R5!Tw!*Zzwg>U; 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 diff --git a/modular_citadel/code/datums/traits/negative.dm b/modular_citadel/code/datums/traits/negative.dm index 796c4529e2..9ecdc59a81 100644 --- a/modular_citadel/code/datums/traits/negative.dm +++ b/modular_citadel/code/datums/traits/negative.dm @@ -1,5 +1,6 @@ // Citadel-specific Negative Traits +//For reviewers: If you think it's a bad idea, feel free to remove it. I won't be upset :blobcat: /datum/quirk/Hypno name = "Hypnotherapy user" desc = "You had hypnotherapy right before your shift, you're not sure it had any effects, though." diff --git a/modular_citadel/code/datums/traits/neutral.dm b/modular_citadel/code/datums/traits/neutral.dm index fd713660c3..264dbfef0a 100644 --- a/modular_citadel/code/datums/traits/neutral.dm +++ b/modular_citadel/code/datums/traits/neutral.dm @@ -1,6 +1,5 @@ // Citadel-specific Neutral Traits -//For reviewers: If you think it's a bad idea, feel free to remove it. I won't be upset :blobcat: /datum/quirk/libido name = "Nymphomania" desc = "You're always feeling a bit in heat. Also, you get aroused faster than usual." diff --git a/modular_citadel/code/datums/traits/positive.dm b/modular_citadel/code/datums/traits/positive.dm index 59bb98d09c..34d4d95600 100644 --- a/modular_citadel/code/datums/traits/positive.dm +++ b/modular_citadel/code/datums/traits/positive.dm @@ -2,8 +2,8 @@ /datum/quirk/BloodPressure name = "Synthetic blood" - desc = "You've got a new form of synthetic blood that increases the total blood volume inside of you!" - value = 0 //I honeslty dunno if this is a good trait? I just means you use more of medbays blood and make janitors madder. + desc = "You've got a new form of synthetic blood that increases the total blood volume inside of you as well as the rate of replenishment!" + value = 1 //I honeslty dunno if this is a good trait? I just means you use more of medbays blood and make janitors madder, but you also regen blood a lil faster. mob_trait = TRAIT_HIGH_BLOOD gain_text = "You feel full of blood!" lose_text = "You feel like your blood pressure went down." diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 2da168a388..3ede358c88 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1159,13 +1159,17 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(!creatorID) message_admins("Something went wrong in enthral creation THIS SHOULD NOT APPEAR") return - var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + if(!ishuman(M))//Just to make sure screwy stuff doesn't happen. + return + var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) //Somehow a beaker got here? (what) if(E) return message_admins("key: [M.ckey] vs [creatorID], ") if(purity < 0.5)//Impure chems don't function as you expect return if((M.ckey == creatorID) && (creatorName == M.real_name)) //same name AND same player - same instance of the player. (should work for clones?) + //if(M.has_status_effect(STATUS_EFFECT_INLOVE) Not sure if I need/want this. + // to_chat(M, "You are too busy being in love for this to work!") var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet if(Vc) @@ -1254,7 +1258,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y E.master = creator else E = M.has_status_effect(/datum/status_effect/chem/enthrall) - to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName].") + to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName].") M.slurring = 100 M.confused = 100 E.phase = 4 @@ -1288,7 +1292,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(!love) return M.apply_status_effect(STATUS_EFFECT_INLOVE, love) - to_chat(M, "You develop overwhelmingly deep feelings for [love], your heart beginning to race as you look upon them with new eyes. You are determined to keep them safe above all other priorities.") + to_chat(M, "You develop overwhelmingly deep feelings for [love], your heart beginning to race as you look upon them with new eyes. You are determined to keep them safe above all other priorities.") else if(get_dist(M, love) < 8) if(M.has_trait(TRAIT_NYMPHO)) //Add this back when merged/updated. @@ -1301,7 +1305,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(prob(10)) M.Stun(10) M.emote("whimper")//does this exist? - to_chat(M, " You're overcome with a desire to see [love].") + to_chat(M, " You're overcome with a desire to see [love].") M.adjustBrainLoss(1)//I found out why everyone was so damaged! ..() @@ -1316,12 +1320,12 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(Lover.has_status_effect(STATUS_EFFECT_INLOVE)) to_chat(Lover, "You are already fully devoted to someone else!") return - to_chat(Lover, "You develop deep feelings for [Love], your heart beginning to race as you look upon them with new eyes.") + to_chat(Lover, "You develop deep feelings for [Love], your heart beginning to race as you look upon them with new eyes.") if(Lover.mind) Lover.mind.store_memory("You are in love with [Love].") Lover.faction |= "[REF(Love)]" Lover.apply_status_effect(STATUS_EFFECT_INLOVE, Love) - forge_valentines_objective(Lover, Love) + forge_valentines_objective(Lover, Love, TRUE) return //Requires player to be within vicinity of creator @@ -1367,7 +1371,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/hatmium/on_mob_life(mob/living/carbon/human/M) //hat.armor = list("melee" = (1+(current_cycle/20)), "bullet" = (1+(current_cycle/20)), "laser" = (1+(current_cycle/20)), "energy" = (1+(current_cycle/20)), "bomb" = (1+(current_cycle/20)), "bio" = (1+(current_cycle/20)), "rad" = (1+(current_cycle/20)), "fire" = (1+(current_cycle/20)), "acid" = (1+(current_cycle/20))) - var/hatArmor = (1+(current_cycle/100))*purity + var/hatArmor = (1+(current_cycle/30))*purity if(!overdosed) hat.armor = list("melee" = hatArmor, "bullet" = hatArmor, "laser" = hatArmor, "energy" = hatArmor, "bomb" = hatArmor, "bio" = hatArmor, "rad" = hatArmor, "fire" = hatArmor) else @@ -1393,6 +1397,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y var/obj/item/organ/tongue/nT DoNotSplit = TRUE pH = 5 + var/obj/item/organ/tongue/T /datum/reagent/fermi/furranium/on_mob_life(mob/living/carbon/M) @@ -1415,7 +1420,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(seen) to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") if(21) - var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) + T = M.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO T.Remove(M) nT.Insert(M) @@ -1436,6 +1441,14 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") ..() +/datum/reagent/fermi/furranium/on_mob_delete(mob/living/carbon/M) + if(purity <= 0.9)//Only permanent if you're a good chemist. + nT = M.getorganslot(ORGAN_SLOT_TONGUE) + nT.Remove(M) + T.Insert(M) + to_chat(M, "You feel your tongue.... unfluffify...?" + M.say("Pleh!") + /////////////////////////////////////////////////////////////////////////////////////////////// //Nanite removal diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index f1c158d4cb..400df70760 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -26,18 +26,18 @@ var/datum/effect_system/smoke_spread/chem/s = new() if(pH < 4) //if acidic, make acid spray //s.set_up(/datum/reagent/fermi/fermiAcid, (volume/3), pH*10, T) - R.add_reagent("fermiAcid", ((volume/3)/pH)) - pHmod = 2 + my_atom.reagents.add_reagent("fermiAcid", ((volume/3)/pH)) + //pHmod = 2 for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents /*if (istype(reagent, /datum/reagent/fermi)) continue //Don't allow fermichems into the mix (fermi explosions are handled elsewhere and it's a huge pain) */ - R.add_reagent(reagent, reagent.volume) + //R.add_reagent(reagent, reagent.volume) if (reagent.purity < 0.6) ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 if(R.reagent_list) - s.set_up(R, (volume/10)*pHmod, 10, T) + s.set_up(my_atom.reagents, (volume/10), 10, T) s.start() if(temp>500)//if hot, start a fire @@ -59,7 +59,7 @@ var/datum/effect_system/reagents_explosion/e = new() e.set_up(round((volume/30)*(pH-9)), T, 0, 0) e.start() - pHmod = 1.5 + //pHmod = 1.5 if(!ImpureTot == 0) //If impure, v.small emp ImpureTot *= volume @@ -92,7 +92,7 @@ /datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. - var/location = get_turf(my_atom) + var/turf/open/location = get_turf(my_atom) var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list E.location_created = location //add on_new() handling of vars @@ -253,11 +253,11 @@ message_admins("On finish for enthral proc'd") var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list - if(!B) + if(!B.data) var/list/seen = viewers(5, get_turf(my_atom)) for(var/mob/M in seen) - to_chat(M, "The reaction splutters and fails to react.") - //E.purity = 0 + to_chat(M, "The reaction splutters and fails to react.") //if this appears, WHAT?! + E.purity = 0 if (B.data.["gender"] == "female") E.data.["creatorGender"] = "Mistress" E.creatorGender = "Mistress" @@ -278,7 +278,7 @@ s.set_up(R, volume, T) s.start() my_atom.reagents.clear_reagents() - ..(volume = 0, pH = 7, purity = 1) //Just a lil fire. + ..(volume = 0, pH = 7) //Just a lil fire. /datum/chemical_reaction/fermi/hatmium // done name = "Hat growth serum" From 4607a2b6c3fc8d4c829cb6a4f8188471b6bf23c9 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 27 May 2019 05:39:52 +0100 Subject: [PATCH 161/608] Compile safe. Today's fixes. --- code/datums/traits/good.dm | 15 +- code/datums/traits/negative.dm | 26 ++++ .../antagonists/valentines/valentine.dm | 7 +- code/modules/events/holiday/vday.dm | 6 +- .../mob/living/simple_animal/friendly/cat.dm | 124 ++++++++++------ code/modules/reagents/chemistry/holder.dm | 108 +++++--------- code/modules/spells/spell_types/shapeshift.dm | 4 +- code/modules/surgery/organs/vocal_cords.dm | 11 +- icons/mob/pets.dmi | Bin 63393 -> 65221 bytes .../code/datums/status_effects/chems.dm | 26 ++-- .../code/datums/traits/negative.dm | 26 ---- .../code/datums/traits/positive.dm | 14 -- .../code/modules/arousal/organs/breasts.dm | 10 +- .../code/modules/arousal/organs/genitals.dm | 26 +--- .../chemistry/reagents/fermi_reagents.dm | 138 +++++------------- .../reagents/chemistry/recipes/fermi.dm | 65 +++++---- tgstation.dme | 1 - 17 files changed, 255 insertions(+), 352 deletions(-) delete mode 100644 modular_citadel/code/datums/traits/positive.dm diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 513115b194..8e666cfeeb 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -157,7 +157,7 @@ gain_text = "You feel HONGRY." lose_text = "You no longer feel HONGRY." -/datum/quirk/trandening +/datum/quirk/trandening //What does trandening mean? name = "High Luminosity Eyes" desc = "When the next big fancy implant came out you had to buy one on impluse!" value = 1 @@ -169,3 +169,16 @@ var/obj/item/autosurgeon/gloweyes/gloweyes = new(get_turf(H)) H.equip_to_slot(gloweyes, SLOT_IN_BACKPACK) H.regenerate_icons() + +/datum/quirk/BloodPressure + name = "Synthetic blood" + desc = "You've got a new form of synthetic blood that increases the total blood volume inside of you as well as the rate of replenishment!" + value = 1 //I honeslty dunno if this is a good trait? I just means you use more of medbays blood and make janitors madder, but you also regen blood a lil faster. + mob_trait = TRAIT_HIGH_BLOOD + gain_text = "You feel full of blood!" + lose_text = "You feel like your blood pressure went down." + +/datum/quirk/BloodPressure/add() + var/mob/living/M = quirk_holder + M.blood_ratio = 1.2 + M.blood_volume += 150 diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 79afe0049c..4851be05b9 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -324,3 +324,29 @@ gain_text = "There's a lot on your mind right now." lose_text = "Your mind finally feels calm." medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events." + +//For reviewers: If you think it's a bad idea, feel free to remove it. I won't be upset :blobcat: +/datum/quirk/Hypno + name = "Hypnotherapy user" + desc = "You had hypnotherapy right before your shift, you're not sure it had any effects, though." + mob_trait = "hypnotherapy" + value = -1 //I mean, it can be a really bad trait to have, but on the other hand, some people want it? + gain_text = "You really think the hypnotherapy helped you out." + //lose_text = "You forget about the hypnotherapy you had, or did you even have it?" + +/datum/quirk/Hypno/add() + //You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic! + addtimer(CALLBACK(src, /datum/quirk/Hypno.proc/triggered, quirk_holder), rand(12000, 36000))//increase by 100, it's lower so I can test it. + +//DOES NOT give any indication when someone is triggered - this is intentional so people don't abuse it, you're supposed to get a random thing said to you as a mini objective. +/datum/quirk/Hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. + var/mob/living/carbon/human/H = quirk_holder + var/list/seen = viewers(8, get_turf(H)) + seen -= quirk_holder + if(LAZYLEN(seen) == 0) + to_chat(H, "That object accidentally sets off your implanted trigger, sending you into a hypnotic daze!") + else + to_chat(H, "[pick(seen)] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") + H.apply_status_effect(/datum/status_effect/trance, 200, TRUE) + message_admins("Trance applied") + qdel(src) diff --git a/code/modules/antagonists/valentines/valentine.dm b/code/modules/antagonists/valentines/valentine.dm index f53d61ab6d..21e54374a4 100644 --- a/code/modules/antagonists/valentines/valentine.dm +++ b/code/modules/antagonists/valentines/valentine.dm @@ -49,11 +49,6 @@ /datum/antagonist/valentine/chem/greet() to_chat(owner, "You're in love with [date.name]! Protect [date.p_them()] at all costs. This takes priority over all other loyalties.") -/datum/antagonist/valentine/chem/check_completion() - if(date.M.stat != DEAD) - return TRUE - return FALSE - /datum/antagonist/valentine/chem/roundend_report() var/objectives_complete = TRUE if(owner.objectives.len) @@ -63,6 +58,6 @@ break if(objectives_complete) - return "[owner.name] protected [owner.p_their()] love: [date.name]! What a cutie!" + return "[owner.name] protected [owner.p_their()] love: [date.name]! What a cutie!" else return "[owner.name] date failed!" diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index 368e30e7eb..8f77af58eb 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -45,10 +45,12 @@ lover.mind.special_role = "valentine" if (chemLove == TRUE) var/datum/antagonist/valentine/chem/V = new //Changes text and EOG check basically. + V.date = date.mind + lover.mind.add_antag_datum(V) else var/datum/antagonist/valentine/V = new - V.date = date.mind - lover.mind.add_antag_datum(V) //These really should be teams but i can't be assed to incorporate third wheels right now + V.date = date.mind + lover.mind.add_antag_datum(V) //These really should be teams but i can't be assed to incorporate third wheels right now /datum/round_event/valentines/announce(fake) priority_announce("It's Valentine's Day! Give a valentine to that special someone!") diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 97f1b2dd36..70fc16d0bc 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -308,53 +308,63 @@ gold_core_spawnable = NO_SPAWN health = 50 //So people can't instakill it maxHealth = 50 + speak = list("Meowrowr!", "Mew!", "Miauen!") + speak_emote = list("wigglepurrs", "mewls") + emote_hear = list("meows.", "mews.") + emote_see = list("looks at you eagerly for pets!", "wiggles enthusiastically.") + gold_core_spawnable = NO_SPAWN //secretcatchemcode, shh!! Of couse I hide it amongst cats. Also, yes, I expect you, Mr.Maintaner to read and review this, dispite it being hidden and not mentioned in the changelogs. +//I'm not trying to be sneaky, I'm trying to keep it a secret! +//I don't know how to do hidden chems like Aurora //ChemReactionVars: /datum/chemical_reaction/fermi/secretcatchem //DONE name = "secretcatchem" id = "secretcatchem" - results = list("secretcatchem" = 2) - required_reagents = list("stable_plasma" = 0.5, "sugar" = 0.5, "cream" = 0.5, "blood" = 0.5) + results = list("secretcatchem" = 0.5) + required_reagents = list("stable_plasma" = 0.1, "sugar" = 0.1, "cream" = 0.1, "blood" = 0.1, "slimejelly" = 0.1) required_catalysts = list("felinidmutationtoxin" = 5) + required_temp = 600 mix_message = "the reaction gives off a meow!" + mix_sound = "modular_citadel/sound/voice/merowr.ogg" //FermiChem vars: - OptimalTempMin = 700 // Lower area of bell curve for determining heat based rate reactions - OptimalTempMax = 800 // Upper end for above - ExplodeTemp = 900 // Temperature at which reaction explodes - OptimalpHMin = 6 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) - OptimalpHMax = 8 // Higest value for above - ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) - CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharpT = 0 // How sharp the temperature exponential curve is (to the power of value) - CurveSharppH = 0 // How sharp the pH exponential curve is (to the power of value) - ThermicConstant = 0 // Temperature change per 1u produced - HIonRelease = 0 // pH change per 1u reaction (inverse for some reason) - RateUpLim = 0.1 // Optimal/max rate possible if all conditions are perfect - FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics - FermiExplode = FALSE // If the chemical explodes in a special way + OptimalTempMin = 650 + //OptimalTempMax = 800 + //ExplodeTemp = 900 + OptimalpHMin = 0 + //OptimalpHMax = 8 + ReactpHLim = 2 + //CatalystFact = 0 + CurveSharpT = 0 + CurveSharppH = 0 + ThermicConstant = 0 + HIonRelease = 0 + RateUpLim = 0.1 + FermiChem = TRUE + FermiExplode = FALSE PurityMin = 0.2 -/datum/chemical_reaction/fermi/secretcatchem/Initialize() - message_admins("randomizing reaction") +/datum/chemical_reaction/fermi/secretcatchem/New() + //rand doesn't seem to work with n^-e + //message_admins("randomizing reaction") OptimalTempMin += rand(-100, 100) - OptimalTempMax += rand(-100, 100) - ExplodeTemp += rand(-100, 100) - OptimalpHMin += rand(-1, 1) - OptimalpHMax += rand(-1, 1) + OptimalTempMax += (OptimalpHMin+rand(0, 200)) + ExplodeTemp += (OptimalpHMax+rand(0, 200)) + OptimalpHMin += rand(1, 10) + OptimalpHMax += (OptimalpHMin + rand(0, 5)) ReactpHLim += rand(-2, 2) - CurveSharpT += rand(0.01, 5) - CurveSharppH += rand(0.01, 5) + CurveSharpT += (rand(1, 500)/100) + CurveSharppH += (rand(1, 500)/100) ThermicConstant += rand(-50, 50) - HIonRelease += rand(-0.25, 0.25) - RateUpLim += rand(0, 100) - PurityMin += rand(-0.1, 0.1) + HIonRelease += (rand(-25, 25)/100) + RateUpLim += (rand(1, 1000)/10) + PurityMin += (rand(-1, 1)/10) var/additions = list("aluminum", "silver", "gold", "plasma", "silicon", "bluespace") - var/chosenA = pick(additions) - required_reagents[chosenA] = rand(0.1, 1) + //var/chosenA = pick(additions) + required_reagents += list("[pick(additions)]", rand(0.1, 1)) /datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. - message_admins("Someone found the hidden reaction. Amazing!! Please tell Fermi!!") + message_admins("Someone found the hidden reaction. Amazing!! Please tell Fermis!!") //ReagentVars //Turns you into a cute catto while it's in your system. @@ -366,8 +376,7 @@ taste_description = "hairballs and cream" color = "#ffc224" var/catshift = FALSE - var/mob/living/simple_animal/pet/cat/custom_cat/catto - //var/mob/living/carbon/human/origin maybe unneeded + var/mob/living/simple_animal/pet/cat/custom_cat/catto = null /datum/reagent/fermi/secretcatchem/New() name = "Catgirli[pick("a","u","e","y")]m [pick("apex", "prime", "meow")]" @@ -377,28 +386,53 @@ //origin = H var/current_species = H.dna.species.type var/datum/species/mutation = /datum/species/human/felinid - if((mutation && mutation != current_species) && (purity > 0.9))//ONLY if purity is 1, and given the stuff is random. It's basically impossible to get this to 1. + if((mutation != current_species) && (purity >= 0.8))//ONLY if purity is high, and given the stuff is random. It's basically impossible to get this to 1. H.set_species(mutation) H.gender = FEMALE + //exception(al) handler, I said cat tail damnit! + H.dna.features["mam_tail"] = "Cat" + H.dna.features["tail_human"] = "Cat" + H.dna.features["ears"] = "Cat" + H.dna.features["mam_ears"] = "Cat" + H.dna.features["tail_lizard"] = "Cat" + H.dna.features["mam_tail"] = "Cat" + H.dna.features["mam_tail_animated"] = "Cat" + H.facial_hair_style = "Shaved" + H.verb_say = "mewls" catshift = TRUE + playsound(get_turf(H), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) + to_chat(H, "You suddenly turn into a cat!") catto = new(get_turf(H.loc)) H.mind.transfer_to(catto) - H.moveToNullspace() - catto.name = M.name - catto.desc = "A cute catto! They remind you of [M] somehow." - catto.color = "#[dna.features["mcolor"]]" + catto.name = H.name + catto.desc = "A cute catto! They remind you of [H] somehow." + catto.color = "#[H.dna.features["mcolor"]]" + //H.moveToNullspace() classic breaking Japes + H.forceMove(locate(10,6,1))//To the zelda room. -/datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/human/H) +/datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) if(prob(5)) playsound(get_turf(catto), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) - catto.emote("me","lets out a meowrowr!") + catto.say("lets out a meowrowr!*") ..() -/datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H) - var/words = "Your body shifts back to normal." +/datum/reagent/fermi/secretcatchem/on_mob_delete(mob/living/carbon/H) + var/words = "Your body shifts back to normal." + do_teleport(H, catto.loc) + catto.mind.transfer_to(H) if(catshift == TRUE) - words += " ...But wait, are those ears and a tail?") - to_chat(H, "[words]") - H.doMove(catto) - catto.mind.transfer_to(M) + words += " ...But wait, are those ears and a tail?" + H.say("*wag")//force update sprites. + to_chat(H, "[words]") qdel(catto) + +/datum/chemical_reaction/fermi/secretcatchem/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) + var/mob/living/simple_animal/pet/cat/custom_cat/catto = new(get_turf(my_atom)) + var/list/seen = viewers(8, get_turf(my_atom)) + for(var/mob/M in seen) + to_chat(M, "The reaction suddenly gives out a meow, condensing into a chemcat!")//meow! + playsound(get_turf(my_atom), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) + catto.name = "FermiCat" + catto.desc = "A cute Fermichem cat, created by a lot of compicated and confusing chemistry!" + catto.color = "#770000" + my_atom.reagents.remove_reagent("secretcatchem", 10) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index b7e4f6aa96..61b7ab2c1a 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -345,7 +345,7 @@ im //beaker check proc, /datum/reagents/proc/beaker_check(atom/A) - if(istype(A, /obj/item/reagent_containers/glass/beaker/meta)) + if(istype(A, /obj/item/reagent_containers/glass/beaker/meta) || istype(A, /obj/item/reagent_containers/glass/bottle)) //prevent bottles from being dispenced and melting. return if(istype(A, /obj/item/reagent_containers/glass/beaker/plastic))//reaclly weird how this runtimes but the previous doesn't if(chem_temp > 444)//assuming polypropylene @@ -361,7 +361,6 @@ im var/list/seen = viewers(5, get_turf(A)) var/iconhtml = icon2html(A, seen) for(var/mob/M in seen) - message_admins("pH at melting: [pH]") to_chat(M, "[iconhtml] \The [my_atom]'s melts from the extreme pH!") playsound(get_turf(A), 'sound/FermiChem/acidmelt.ogg', 80, 1) qdel(A) @@ -442,15 +441,6 @@ im if(!C.required_other) matching_other = 1 - //FermiChem - /* - if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! - if (C.FermiExplode == TRUE) - //To be added! - - TODO: make plastic beakers melt at 447 kalvin, all others at ~850 and meta-material never break. - */ - if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! meets_temp_requirement = 1//binary pass @@ -484,30 +474,25 @@ im var/datum/chemical_reaction/C = selected_reaction if (C.FermiChem == TRUE && !continue_reacting) - message_admins("FermiChem Proc'd") for(var/B in cached_required_reagents) multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01)) for(var/P in selected_reaction.results) targetVol = cached_results[P]*multiplier - //message_admins("FermiChem target volume: [targetVol]") - if( (chem_temp <= C.ExplodeTemp) && (chem_temp >= C.OptimalTempMin)) if( (pH >= (C.OptimalpHMin - C.ReactpHLim)) && (pH <= (C.OptimalpHMax + C.ReactpHLim)) )//To prevent pointless reactions //if (reactedVol < targetVol) if (fermiIsReacting == TRUE) return 0 else - //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) - //selected_reaction.on_reaction(src, my_atom, multiplier) START_PROCESSING(SSprocessing, src) - //message_admins("FermiChem processing started") selected_reaction.on_reaction(src, my_atom, multiplier) fermiIsReacting = TRUE fermiReactID = selected_reaction reaction_occurred = 1 if (chem_temp > C.ExplodeTemp) var/datum/chemical_reaction/fermi/Ferm = selected_reaction + fermiIsReacting = FALSE Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH) return 0 else @@ -564,24 +549,17 @@ im var/list/cached_required_reagents = C.required_reagents//update reagents list var/list/cached_results = C.results//resultant chemical list var/multiplier = INFINITY - //var/special_react_result = C.check_special_react(src) Only add if I add in the fermi-izer chem - //message_admins("updating targetVol from [targetVol]") for(var/B in cached_required_reagents) // multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01)) - message_admins("Multi:[multiplier],( reag ammount:[get_reagent_amount(B)] / req reag:[cached_required_reagents[B]]") - //multiplier*=10 if (multiplier == 0) STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE - //message_admins("FermiChem STOPPED due to reactant removal! Reacted vol: [reactedVol] of [targetVol]") reactedVol = 0 targetVol = 0 + C.FermiFinish(src, my_atom, multiplier) handle_reactions() update_total() - //var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] - C.FermiFinish(src, my_atom, multiplier) - //C.on_reaction(src, multiplier, special_react_result) //Reaction sounds and words playsound(get_turf(my_atom), C.mix_sound, 80, 1) var/list/seen = viewers(5, get_turf(my_atom))//Sound and sight checkers @@ -592,27 +570,21 @@ im for(var/P in cached_results) targetVol = cached_results[P]*multiplier - //message_admins("to [targetVol]") - if (fermiIsReacting == FALSE) - //message_admins("THIS SHOULD NEVER APPEAR!") + CRASH("Fermi has refused to stop reacting even though we asked her nicely.") if (chem_temp > C.OptimalTempMin && fermiIsReacting == TRUE)//To prevent pointless reactions if (reactedVol < targetVol) reactedVol = FermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) - //message_admins("FermiChem tick activated started, Reacted vol: [reactedVol] of [targetVol]") else STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE - //message_admins("FermiChem STOPPED due to volume reached! Reacted vol: [reactedVol] of [targetVol]") reactedVol = 0 targetVol = 0 + C.FermiFinish(src, my_atom, multiplier) handle_reactions() update_total() - //var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] - C.FermiFinish(src, my_atom, multiplier) - //C.on_reaction(src, multiplier, special_react_result) //Reaction sounds and words playsound(get_turf(my_atom), C.mix_sound, 80, 1) var/list/seen = viewers(5, get_turf(my_atom))//Sound and sight checkers @@ -622,15 +594,12 @@ im return else STOP_PROCESSING(SSprocessing, src) - //message_admins("FermiChem STOPPED due to temperature! Reacted vol: [reactedVol] of [targetVol]") fermiIsReacting = FALSE reactedVol = 0 targetVol = 0 + C.FermiFinish(src, my_atom, multiplier) handle_reactions() update_total() - //var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] - C.FermiFinish(src, my_atom, multiplier) - //C.on_reaction(src, multiplier, special_react_result) //Reaction sounds and words playsound(get_turf(my_atom), C.mix_sound, 80, 1) var/list/seen = viewers(5, get_turf(my_atom))//Sound and sight checkers @@ -646,36 +615,29 @@ im var/deltaT = 0 var/deltapH = 0 var/stepChemAmmount = 0 - //var/ammoReacted = 0 + //get purity from combined beaker reactant purities HERE. var/purity = 1 - //var/tempVol = totalVol - message_admins("multiplier [multiplier], target vol:[targetVol], rate lim: [C.RateUpLim], reactedVol: [reactedVol]") //Begin Parse - //WARNING("Purity precalc: [overallPurity]") - //update_holder_purity(C)//updates holder's purity - //WARNING("Purity postcalc: [overallPurity]") - //Check extremes first if (cached_temp > C.ExplodeTemp) //go to explode proc - //message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [cached_temp]") + fermiIsReacting = FALSE C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) + STOP_PROCESSING(SSprocessing, src) return + //Make sure things are limited. if (pH > 14) pH = 14 - //message_admins("pH is lover limit, cur pH: [pH]") else if (pH < 0) pH = 0 //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - //message_admins("pH is lover limit, cur pH: [pH]") + //For now, purity is handled elsewhere - //Calculate DeltapH (Deviation of pH from optimal) //Lower range if (pH < C.OptimalpHMin) @@ -692,14 +654,12 @@ im else deltapH = (((- pH + (C.OptimalpHMax + C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH))//Reverse - to + to prevent math operation failures. //Within mid range - if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) deltapH = 1 //This should never proc: else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") - //TODO Add CatalystFact - //message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") + //TODO Add CatalystFact - though, might be pointless. //Calculate DeltaT (Deviation of T from optimal) if (cached_temp < C.OptimalTempMax && cached_temp >= C.OptimalTempMin) @@ -708,54 +668,51 @@ im deltaT = 1 else deltaT = 0 - //message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") - - stepChemAmmount = CLAMP((deltaT * C.RateUpLim), 0, (targetVol - reactedVol)) //used to have multipler, now it doesn't - if (stepChemAmmount > C.RateUpLim) + /* + stepChemAmmount = CLAMP(((deltaT * cached_results[P]) * multipler), 0, (targetVol - reactedVol)) //used to have multipler, now it does + if (stepChemAmmount * cached_results[P] > C.RateUpLim) stepChemAmmount = C.RateUpLim else if (stepChemAmmount <= 0.01) - //message_admins("stepChem underflow [stepChemAmmount]") stepChemAmmount = 0.01 + */ if ((reactedVol + stepChemAmmount) > targetVol) stepChemAmmount = targetVol - reactedVol - //message_admins("target volume reached. Reaction should stop after this loop. stepChemAmmount: [stepChemAmmount] + reactedVol: [reactedVol] = targetVol [targetVol]") - //if (reactedVol > 0) - // purity = ((purity * reactedVol) + (deltapH * stepChemAmmount)) /((reactedVol+ stepChemAmmount)) //This should add the purity to the product - //else purity = (deltapH)//set purity equal to pH offset - //TODO: Check overall beaker purity with proc - //Then adjust purity of result AND yeild ammount with said purity. + //Then adjust purity of result with reagent purity. purity *= reactant_purity(C) - // End. - /* - */ - //message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]") - for(var/B in cached_required_reagents) - //message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]") remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + var/TotalStep = 0 for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? - //reactedVol = max(reactedVol, 1) //this shouldnt happen ... + stepChemAmmount = CLAMP(((deltaT * cached_results[P]) * multiplier), 0, (targetVol - reactedVol)) //used to have multipler, now it does + if (stepChemAmmount * cached_results[P] > C.RateUpLim) + stepChemAmmount = C.RateUpLim + else if (stepChemAmmount <= 0.01) + stepChemAmmount = 0.01 + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*(stepChemAmmount), null, cached_temp, purity)//add reagent function!! I THINK I can do this: + add_reagent(P, (stepChemAmmount), null, cached_temp, purity)//add reagent function!! I THINK I can do this: + TotalStep += stepChemAmmount//for multiple products //Above should reduce yeild based on holder purity. //Purity Check + //NOT MULTIPROD SAFE. TODO: Add multiproduct support for(var/datum/reagent/R in my_atom.reagents.reagent_list) if(P == R.id) if (R.purity < C.PurityMin)//If purity is below the min, blow it up. + fermiIsReacting = FALSE C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) - return + return 0 C.FermiCreate(src)//proc that calls when step is done //Apply pH changes and thermal output of reaction to beaker - chem_temp = round(cached_temp + (C.ThermicConstant * stepChemAmmount)) //Why won't you update!!! - pH += (C.HIonRelease * stepChemAmmount) + chem_temp = round(cached_temp + (C.ThermicConstant * stepChemAmmount)) //Why won't you update!!! Because I'm silly. + pH += (C.HIonRelease * stepChemAmmount)//honestly pH shifting is so confusing //keep track of the current reacted amount reactedVol = reactedVol + stepChemAmmount //return said amount to compare for next step. @@ -814,6 +771,7 @@ im for(var/reagent in cached_reagents) var/datum/reagent/R = reagent del_reagent(R.id) + pH = REAGENT_NORMAL_PH return 0 /datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1) diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index e3b3ac6416..e16a6eff84 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -15,10 +15,10 @@ var/die_with_shapeshifted_form = TRUE var/convert_damage = FALSE //If you want to convert the caster's health to the shift, and vice versa. var/convert_damage_type = BRUTE //Since simplemobs don't have advanced damagetypes, what to convert damage back into. - + //TODO: Remember to remove this before making final commit and make a new request for this. But until then, I'm gonna be a catto wizard! var/shapeshift_type //Incase I ever get lucky enough to be a wizard. Also why can you be a dog but not a cat!! I know this isn't fermichem related, but this is really important!!! var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\ - /mob/living/simple_animal/pet/cat,\ //TODO: Remember to remove this before making final commit and make a new request for this. But until then, I'm gonna be a catto wizard! + /mob/living/simple_animal/pet/cat,\ /mob/living/simple_animal/pet/dog/corgi,\ /mob/living/simple_animal/hostile/carp/ranged/chaos,\ /mob/living/simple_animal/bot/ed209,\ diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 389dc2a335..a10990ce84 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -809,7 +809,7 @@ var/static/regex/statecustom_words = regex("state triggers|state your triggers") var/static/regex/custom_words = regex("new trigger|listen to me") var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|trance")//What a descriptive name! - var/static/regex/recognise_words = regex("recognise me|i'm back|did you miss me?") + var/static/regex/recognise_words = regex("recognise me|did you miss me?") var/static/regex/objective_words = regex("new objective|obey this command|unable to resist|compulsed") var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die") var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") @@ -951,6 +951,8 @@ var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) E.status = "Antiresist" + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've let [E.enthrallGender] down..."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "Your mind clouds over, as you find yourself unable to resist!"), 5) E.statusStrength = (1 * power_multiplier * E.phase) E.cooldown += 15//Too short? yes, made 15 @@ -1105,6 +1107,7 @@ //tier3 //STATE TRIGGERS + //Doesn't work, Maintaners, help. else if((findtext(message, statecustom_words)))//doesn't work for(var/V in listeners) var/speaktrigger = "" @@ -1113,9 +1116,9 @@ if (E.phase > 2) for (var/trigger in E.customTriggers) speaktrigger += "[trigger], " - C.add_trait(TRAIT_DEAF, "Triggers") //So you don't trigger yourself! - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, /atom/movable/proc/say, "[speaktrigger]"), 5) - C.remove_trait(TRAIT_DEAF, "Triggers") + C.add_trait(TRAIT_DEAF, "Triggers") //So you don't trigger yourself! + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, /atom/movable/proc/say, "[speaktrigger]"), 5) + C.remove_trait(TRAIT_DEAF, "Triggers") //CUSTOM TRIGGERS diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi index e1ebe86922fa69d3893a5513ae4ed981fc4c9c1d..773258d3ee942ff2a11648ed46a9a8d1218b5fe5 100644 GIT binary patch delta 8083 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 delta 6241 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 rascally willy has become a more managable size, liberating your movements.") o.remove_movespeed_modifier("hugedick") - o.AdjustBloodVol(bloodCalc/2) + o.AdjustBloodVol(bloodCalc) if(22 to INFINITY) if(prob(2)) to_chat(o, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!") o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) - o.AdjustBloodVol(bloodCalc/2) + o.AdjustBloodVol(bloodCalc) ..() /datum/status_effect/chem/PElarger/on_remove(mob/living/carbon/human/o) @@ -286,7 +286,7 @@ cooldown -= 1 return if(1)//Initial enthrallment - if (enthrallTally > 150) + if (enthrallTally > 125) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. resistanceTally /= 2 @@ -301,7 +301,7 @@ owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) if(owner.lewd) - to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") + to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") if (2) //partially enthralled if (enthrallTally > 250) phase += 1 @@ -310,11 +310,11 @@ resistanceTally /= 2 if(owner.lewd) to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") - to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. + to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. else to_chat(owner, "You are unable to put up a resistance any longer, and now are under the control of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [master] in death. ") owner.add_trait(TRAIT_PACIFISM, "MKUltra") //IMPORTANT - else if (resistanceTally > 250) + else if (resistanceTally > 200) enthrallTally *= 0.5 phase -= 1 resistanceTally = 0 @@ -458,14 +458,14 @@ if(status == "Antiresist") if (statusStrength < 0) status = null - to_chat(owner, "Your mind feels able to resist oncemore.") + to_chat(owner, "Your mind feels able to resist oncemore.") else statusStrength -= 1 else if(status == "heal") if (statusStrength < 0) status = null - to_chat(owner, "You finish licking your wounds.") + to_chat(owner, "You finish licking your wounds.") else statusStrength -= 1 owner.heal_overall_damage(1, 1, 0, FALSE, FALSE) @@ -475,16 +475,16 @@ owner.add_trait(TRAIT_GOTTAGOFAST, "MKUltra") status = "charged" if(master.lewd) - to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") + to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") else - to_chat(owner, "[master]'s command fills you with a burst of speed!") + to_chat(owner, "[master]'s command fills you with a burst of speed!") else if (status == "charged") if (statusStrength < 0) status = null owner.remove_trait(TRAIT_GOTTAGOFAST, "MKUltra") owner.Knockdown(50) - to_chat(owner, "Your body gives out as the adrenaline in your system runs out.") + to_chat(owner, "Your body gives out as the adrenaline in your system runs out.") else statusStrength -= 1 cooldown += 1 //Cooldown doesn't process till status is done @@ -504,7 +504,7 @@ cooldownMsg = FALSE else if (cooldownMsg == FALSE) if(master.lewd) - to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") + to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") else to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") cooldownMsg = TRUE @@ -653,7 +653,7 @@ deltaResist += 0.1 //Though I commend your spamming efforts. return else - deltaResist = 2 + resistGrowth + deltaResist = 1.75 + resistGrowth resistGrowth += 0.05 //distance modifer diff --git a/modular_citadel/code/datums/traits/negative.dm b/modular_citadel/code/datums/traits/negative.dm index 9ecdc59a81..c0cbe57b5a 100644 --- a/modular_citadel/code/datums/traits/negative.dm +++ b/modular_citadel/code/datums/traits/negative.dm @@ -1,27 +1 @@ // Citadel-specific Negative Traits - -//For reviewers: If you think it's a bad idea, feel free to remove it. I won't be upset :blobcat: -/datum/quirk/Hypno - name = "Hypnotherapy user" - desc = "You had hypnotherapy right before your shift, you're not sure it had any effects, though." - mob_trait = "hypnotherapy" - value = -1 //I mean, it can be a really bad trait to have, but on the other hand, some people want it? - gain_text = "You really think the hypnotherapy helped you out." - //lose_text = "You forget about the hypnotherapy you had, or did you even have it?" - -/datum/quirk/Hypno/add() - //You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic! - addtimer(CALLBACK(src, /datum/quirk/Hypno.proc/triggered, quirk_holder), rand(12000, 36000))//increase by 100, it's lower so I can test it. - -//DOES NOT give any indication when someone is triggered - this is intentional so people don't abuse it, you're supposed to get a random thing said to you as a mini objective. -/datum/quirk/Hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. - var/mob/living/carbon/human/H = quirk_holder - var/list/seen = viewers(8, get_turf(H)) - seen -= quirk_holder - if(LAZYLEN(seen) == 0) - to_chat(H, "That object accidentally sets off your implanted trigger, sending you into a hypnotic daze!") - else - to_chat(H, "[pick(seen)] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") - H.apply_status_effect(/datum/status_effect/trance, 200, TRUE) - message_admins("Trance applied") - qdel(src) diff --git a/modular_citadel/code/datums/traits/positive.dm b/modular_citadel/code/datums/traits/positive.dm deleted file mode 100644 index 34d4d95600..0000000000 --- a/modular_citadel/code/datums/traits/positive.dm +++ /dev/null @@ -1,14 +0,0 @@ -// Citadel-specific Positive Traits - -/datum/quirk/BloodPressure - name = "Synthetic blood" - desc = "You've got a new form of synthetic blood that increases the total blood volume inside of you as well as the rate of replenishment!" - value = 1 //I honeslty dunno if this is a good trait? I just means you use more of medbays blood and make janitors madder, but you also regen blood a lil faster. - mob_trait = TRAIT_HIGH_BLOOD - gain_text = "You feel full of blood!" - lose_text = "You feel like your blood pressure went down." - -/datum/quirk/BloodPressure/add() - var/mob/living/M = quirk_holder - M.blood_ratio = 1.2 - M.blood_volume += 150 diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index f10f9916a9..4d1793fb25 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -53,8 +53,8 @@ desc = "You see a pair of breasts." else desc = "You see some breasts, they seem to be quite exotic." - if(isnum(size)) - desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "two big old tonhongerekoogers", "a couple of giant bonkhonagahoogs", "a pair of humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [round(size)]cm in diameter." + if(cached_size > 16) + desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "two big old tonhongerekoogers", "a couple of giant bonkhonagahoogs", "a pair of humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [round(cached_size)]cm in diameter." else if (!isnum(size)) if (size == "flat") desc += " They're very small and flatchested, however." @@ -121,20 +121,14 @@ size = "flat" if(isnum(prev_size)) prev_size = breast_sizes[prev_size] - //message_admins("2. [breast_values[size]] vs [breast_values[prev_size]] || [size] vs [prev_size]") if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") var/mob/living/carbon/human/H = owner - message_admins("Cached: [cached_size], prev: [prev_size], size: [size]") H.Force_update_genitals() else if (breast_values[size] < breast_values[prev_size]) to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size)]-cup.") var/mob/living/carbon/human/H = owner H.Force_update_genitals() prev_size = size - /* for future use, DO NOT DELETE: else if (cached_size >= 16) - if(size != "huge") - to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom.")// taking both of your hands to hold!.") size = "huge" - */ diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index c5e2778091..049252e5b7 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -288,7 +288,7 @@ if(istype(O, /obj/item/organ/genital)) organCheck = TRUE if (organCheck == FALSE) - if(ishuman(src)) + if(ishuman(src) && dna.species.id == "human") dna.features["genitals_use_skintone"] = TRUE dna.species.use_skintones = TRUE return @@ -297,8 +297,7 @@ dna.features["breasts_color"] = "#[dna.features["mcolor"]]" return -/datum/species/proc/handle_genitals(mob/living/carbon/human/H) - //message_admins("attempting to update sprite") +/datum/species/proc/handle_genitals(mob/living/carbon/human/H)//more like handle sadness if(!H)//no args CRASH("H = null") if(!LAZYLEN(H.internal_organs))//if they have no organs, we're done @@ -316,7 +315,6 @@ for(var/L in relevant_layers) //Less hardcode H.remove_overlay(L) //start scanning for genitals - //var/list/worn_stuff = H.get_equipped_items()//cache this list so it's not built again for(var/obj/item/organ/O in H.internal_organs) if(isgenital(O)) var/obj/item/organ/genital/G = O @@ -362,23 +360,7 @@ genital_overlay.color = "#[H.dna.features["breasts_color"]]" if("vag_color") genital_overlay.color = "#[H.dna.features["vag_color"]]" - /* This was removed for some reason? - if(MUTCOLORS) - if(fixed_mut_color) - genital_overlay.color = "#[fixed_mut_color]" - else - genital_overlay.color = "#[H.dna.features["mcolor"]]" - if(MUTCOLORS2) - if(fixed_mut_color2) - genital_overlay.color = "#[fixed_mut_color2]" - else - genital_overlay.color = "#[H.dna.features["mcolor2"]]" - if(MUTCOLORS3) - if(fixed_mut_color3) - genital_overlay.color = "#[fixed_mut_color3]" - else - genital_overlay.color = "#[H.dna.features["mcolor3"]]" - */ + standing += genital_overlay if(LAZYLEN(standing)) H.overlays_standing[layer] = standing.Copy() @@ -387,7 +369,7 @@ for(var/L in relevant_layers) H.apply_overlay(L) -/* Behold the maddness I went through. +/* Behold the maddness I went through. This is here until the genetial problem is confirmed fixed. /datum/species/proc/handle_breasts(mob/living/carbon/human/H) //check for breasts first! diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 3ede358c88..1481ee85a6 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -37,30 +37,26 @@ . = ..() if(!M) return - message_admins("adding to human [purity]") if(src.purity < 0) CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") if (src.purity == 1 || src.DoNotSplit == TRUE) return - else if (src.InverseChemVal > src.purity) + else if (src.InverseChemVal > src.purity)//Turns all of a added reagent into the inverse chem M.reagents.remove_reagent(src.id, amount, FALSE) M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1) - message_admins("all convered to [src.InverseChem]") return else //var/pureVol = amount * puritys - var/impureVol = amount * (1 - purity) - message_admins("splitting [src.id] [amount] into [src.ImpureChem] [impureVol]") + var/impureVol = amount * (1 - purity) //turns impure ratio into impure chem M.reagents.remove_reagent(src.id, (impureVol), FALSE) M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) return -//When merging two fermichems +//When merging two fermichems, see above /datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity)//basically on_mob_add but for merging . = ..() if(!ishuman(M)) return - message_admins("merging to human [purity]") if (purity < 0) CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") if (purity == 1 || src.DoNotSplit == TRUE) @@ -71,12 +67,9 @@ for(var/datum/reagent/fermi/R in M.reagents.reagent_list) if(R.name == "") R.name = src.name//Negative effects are hidden - message_admins("all convered to [src.InverseChem]") return else - //var/pureVol = var/impureVol = amount * (1 - purity) - message_admins("splitting [src] [amount] into [src.ImpureChem] [impureVol]") M.reagents.remove_reagent(src.id, impureVol, FALSE) M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) for(var/datum/reagent/fermi/R in M.reagents.reagent_list) @@ -85,12 +78,6 @@ return - -///datum/reagent/fermi/overdose_start(mob/living/carbon/M) - //current_cycle++ - - - //////////////////////////////////////////////////////////////////////////////////////////////////// // EIGENSTASIUM /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -152,7 +139,6 @@ do_sparks(5,FALSE,M) if(prob(20)) do_sparks(5,FALSE,M) - //message_admins("eigenstate state: [current_cycle]") ..() /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location @@ -217,24 +203,20 @@ fermi_Tclone.appearance = M.appearance C.real_name = M.real_name M.visible_message("[M] collapses in from an alternative reality!") - message_admins("Fermi T Clone: [fermi_Tclone]") do_teleport(C, get_turf(C), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! do_sparks(5,FALSE,C) C.emote("spin") M.emote("spin") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! O� suis-je?!", "Yee haw!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "Ciekawe co na obiad?", "You fool! You took too much eigenstasium! You've doomed us all!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Fermichem was a mistake", "This is one hell of a strong beepsky smash.", "Now neither of us will be virgins!")]\"") - message_admins("Fermi T Clone: [fermi_Tclone] teleport attempt") if(2) var/mob/living/carbon/C = fermi_Tclone do_sparks(5,FALSE,C) qdel(C) //Deletes CLONE, or at least I hope it is. - message_admins("Fermi T Clone: [fermi_Tclone] deletion attempt") M.visible_message("[M] is snapped across to a different alternative reality!") src.addictCyc3 = 0 //counter fermi_Tclone = null src.addictCyc3++ - message_admins("[src.addictCyc3]") do_teleport(M, get_turf(M), 2, no_effects=TRUE) //Teleports player randomly do_sparks(5,FALSE,M) ..() //loop function @@ -344,9 +326,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING pollStarted = TRUE candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") if(20 to INFINITY) - //message_admins("Number of candidates [LAZYLEN(candies)]") if(LAZYLEN(candies) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! - message_admins("Candidate found! [candies] is becomeing a clone of [M]! Hee~!! Exciting!!") + message_admins("Ghost candidate found! [candies] is becoming a clone of [M]! Hee~!! Exciting!!") to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") //var/typepath = owner.type //clone = new typepath(owner.loc) @@ -405,12 +386,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING return //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? - //after_success(user, SM) //qdel(src) else if(src.playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). - //message_admins("Failed to find clone Candidate") src.unitCheck = TRUE if(M.has_status_effect(/datum/status_effect/chem/SGDF)) // Heal the user if they went to all this trouble to make it and can't get a clone, the poor fellow. switch(current_cycle) @@ -450,8 +429,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.apply_status_effect(/datum/status_effect/chem/SGDF) if(87 to INFINITY) M.reagents.remove_reagent(src.id, 1000)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. - message_admins("Purging SGDF [volume]") - //message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") ..() @@ -528,7 +505,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/startHunger /datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. - //message_admins("SGZF ingested") switch(current_cycle)//Pretends to be normal if(20) to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") @@ -552,7 +528,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.adjustToxLoss(1, 0)// the warning! if(86) if (!M.reagents.has_reagent("pen_acid"))//Counterplay is pent.) - message_admins("Zombie spawned at [M.loc]") + message_admins("(non-infectious) Zombie spawned at [M.loc], produced by impure chem, wah!") M.nutrition = startHunger - 500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE M.next_move_modifier = 1 to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") @@ -579,7 +555,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. TODO: turn tumour slime into real variant. M.adjustToxLoss(1, 0) - //message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") ..() //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -630,8 +605,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(S, "A pair of breasts suddenly fly out of the [M]!") //var/turf/T2 = pick(turf in view(5, M)) var/T2 = get_random_station_turf() - M.adjustBruteLoss(5) + M.adjustBruteLoss(25) M.Knockdown(50) + M.Stun(50) B.throw_at(T2, 8, 1) M.reagents.remove_reagent(src.id, 1000) return @@ -640,7 +616,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") if(!B) H.emergent_genital_call() - //message_admins("No breasts found on init!") return var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) B.prev_size = B.size @@ -653,7 +628,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/mob/living/carbon/human/H = M var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) //If they don't have breasts, give them breasts. - //message_admins("No breasts found!") var/obj/item/organ/genital/breasts/nB = new nB.Insert(M) if(nB) @@ -670,7 +644,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.reagents.remove_reagent(src.id, 5) B = nB //If they have them, increase size. If size is comically big, limit movement and rip clothes. - //message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.cached_size = B.cached_size + 0.1 if (B.cached_size >= 8.5 && B.cached_size < 9) if(H.w_uniform || H.wear_suit) @@ -694,7 +667,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(P) P.cached_length = P.cached_length - 0.1 - //message_admins("lewdsnek size: [P.size], [P.cached_length], [holder]") P.update() if(T) T.Remove(M) @@ -756,8 +728,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING for(var/mob/S in seen) to_chat(S, "A penis suddenly flies out of the [M]!") var/T2 = get_random_station_turf() - M.adjustBruteLoss(5) + M.adjustBruteLoss(25) M.Knockdown(50) + M.Stun(50) P.throw_at(T2, 8, 1) M.reagents.remove_reagent(src.id, 1000) return @@ -765,20 +738,17 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING H.genital_override = TRUE var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) - message_admins("No penis found on init!") H.emergent_genital_call() return P.prev_size = P.length P.cached_length = P.length - message_admins("init P len chem: [P.length], prev: [P.prev_size], cache = [P.cached_length]") /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch. if(!ishuman(M)) return var/mob/living/carbon/human/H = M var/obj/item/organ/genital/penis/P = M.getorganslot("penis") - if(!P) - message_admins("No penis found!")//They do have a preponderance for escapism, or so I've heard. + if(!P)//They do have a preponderance for escapism, or so I've heard. var/obj/item/organ/genital/penis/nP = new nP.Insert(M) if(nP) @@ -811,7 +781,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(B) B.cached_size = B.cached_size - 0.1 - //message_admins("Breast size: [B.size], [B.cached_size], [holder]") B.update() if(V) V.Remove(M) @@ -1078,15 +1047,10 @@ Feel free to add more. triggers work when said by ANYONE, not just the enchanter. This is only state 3 pets, state 4 pets cannot get custom triggers, you broke them you bully. -6. One other thing that I can't get to work - replacing the mention of your enthraller with Master/Mistress. Maybe it's too much trouble. - 7. If you're an antage you get a bonus to resistance AND to enthralling. Thus it can be worth using this on both sides. It shouldn't be hard to resist as an antag. There are futher bonuses to command, Chaplains and chemist. If you give your pet a collar then their resistance reduced too. (I think thats everything?) -How buggy is it? -Probably very, it's hard to test this by myself. - BALANCE ISSUES: There are none, but I'm glad you asked. @@ -1108,6 +1072,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. DoNotSplit = TRUE + metabolization_rate = 0.1//It has to be slow, so there's time for the effect. data = list("creatorID" = null, "creatorGender" = null, "creatorName" = null) var/creatorID //ckey var/creatorGender @@ -1137,34 +1102,22 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y creator = get_mob_by_key(creatorID) /datum/reagent/fermi/enthrall/on_new(list/data) - message_admins("FermiNew for enthral proc'd") creatorID = data.["creatorID"] creatorGender = data.["creatorGender"] creatorName = data.["creatorName"] creator = get_mob_by_key(creatorID) - message_admins("name: [creatorName], ID: [creatorID], gender: [creatorGender]") - /* - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list - //var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list - if (B.data.["gender"] == "female") - creatorGender = "Mistress" - else - creatorGender = "Master" - creatorName = B.data.["real_name"] - creatorID = B.data.["ckey"] - */ + //FERMICHEM2 split into different chems /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) . = ..() if(!creatorID) - message_admins("Something went wrong in enthral creation THIS SHOULD NOT APPEAR") + CRASH("Something went wrong in enthral creation THIS SHOULD NOT APPEAR") return if(!ishuman(M))//Just to make sure screwy stuff doesn't happen. return var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) //Somehow a beaker got here? (what) if(E) return - message_admins("key: [M.ckey] vs [creatorID], ") if(purity < 0.5)//Impure chems don't function as you expect return if((M.ckey == creatorID) && (creatorName == M.real_name)) //same name AND same player - same instance of the player. (should work for clones?) @@ -1179,14 +1132,6 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y to_chat(M, "You feel your vocal chords tingle as your voice comes out in a more sultry tone.") else M.apply_status_effect(/datum/status_effect/chem/enthrall) - //var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) - /* - if(creator) - E.enthrallID = creatorID - E.enthrallGender = creatorGender - E.master = creator - */ - /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) . = ..() @@ -1222,9 +1167,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y metabolization_rate = 0.5 var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)//If purity is over 5, works as intended if(!E) - M.reagents.remove_reagent(src.id, 1) - //M.apply_status_effect(/datum/status_effect/chem/enthrall) - message_admins("No enthrall status found in [M]!") + return else E.enthrallTally += 1 if(prob(25)) @@ -1446,7 +1389,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y nT = M.getorganslot(ORGAN_SLOT_TONGUE) nT.Remove(M) T.Insert(M) - to_chat(M, "You feel your tongue.... unfluffify...?" + to_chat(M, "You feel your tongue.... unfluffify...?") M.say("Pleh!") /////////////////////////////////////////////////////////////////////////////////////////////// @@ -1519,7 +1462,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y id = "fermiAcid" description = "Someone didn't do like an otter, and add acid to water." taste_description = "acid burns, ow" - color = "#000000" + color = "#FFFFFF" pH = 0 /datum/reagent/fermi/fermiAcid/on_mob_life(mob/living/carbon/C, method) @@ -1592,7 +1535,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y id = "fermiTox" description = "You should be really careful with this...! Also, how did you get this?" data = "merge" - color = "#000000" + color = "FFFFFF" /datum/reagent/fermi/fermiTox/on_mob_life(mob/living/carbon/C, method) if(C.dna && istype(C.dna.species, /datum/species/jelly)) @@ -1610,11 +1553,17 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y addProc = FALSE pH = 6 -/datum/reagent/fermi/fermiABuffer/on_new(oldpH) - if(LAZYLEN(holder.reagent_list) == 1) +/datum/reagent/fermi/fermiABuffer/on_new() + message_admins("Adding acid") + if(LAZYLEN(holder.reagent_list) == 1) return - pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) + src.pH = data + if (pH <= 3) + pH = 3 + else if (pH >= 7) + pH = 7 + holder.pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) //Shouldn't be required holder.remove_reagent(src.id, 1000) ..() @@ -1628,35 +1577,14 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y pH = 8 /datum/reagent/fermi/fermiBBuffer/on_new() + message_admins("Adding base") if(LAZYLEN(holder.reagent_list) == 1) return - pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) + src.pH = data + if (pH >= 11) + pH = 11 + else if (pH <= 7) + pH = 7 + holder.pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) //Shouldn't be required Might be..? holder.remove_reagent(src.id, 1000) ..() - -/* -/datum/reagent/fermi/fermiTest/on_merge() - ..() - message_admins("FermiTest addition!") - var/location = get_turf(holder.my_atom) - if(purity < 0.34 || purity == 1) - var/datum/effect_system/foam_spread/s = new() - s.set_up(volume*2, location, holder) - s.start() - if((purity < 0.67 && purity >= 0.34)|| purity == 1) - var/datum/effect_system/smoke_spread/chem/s = new() - s.set_up(holder, volume*2, location) - s.start() - if(purity >= 0.67) - for (var/datum/reagent/reagent in holder.reagent_list) - if (istype(reagent, /datum/reagent/fermi)) - var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id] - Ferm.FermiExplode(src, holder.my_atom, holder, holder.total_volume, holder.chem_temp, holder.pH) - else - var/datum/chemical_reaction/Ferm = GLOB.chemical_reagents_list[reagent.id] - Ferm.on_reaction(holder, reagent.volume) - for(var/mob/M in viewers(8, location)) - to_chat(M, "The solution reacts dramatically, with a meow!") - playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) - holder.clear_reagents() - */ diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 400df70760..96d8d4c601 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -16,30 +16,12 @@ /datum/chemical_reaction/fermi/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? if (Exploding == TRUE) return + if(!pH)//Dunno how things got here without a pH. pH = 7 var/ImpureTot = 0 - var/pHmod = 1 + //var/pHmod = 1 var/turf/T = get_turf(my_atom) - message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot], containing [my_atom.reagents.reagent_list]") - var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case. - var/datum/effect_system/smoke_spread/chem/s = new() - if(pH < 4) //if acidic, make acid spray - //s.set_up(/datum/reagent/fermi/fermiAcid, (volume/3), pH*10, T) - my_atom.reagents.add_reagent("fermiAcid", ((volume/3)/pH)) - //pHmod = 2 - - for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents - /*if (istype(reagent, /datum/reagent/fermi)) - continue //Don't allow fermichems into the mix (fermi explosions are handled elsewhere and it's a huge pain) - */ - //R.add_reagent(reagent, reagent.volume) - if (reagent.purity < 0.6) - ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 - if(R.reagent_list) - s.set_up(my_atom.reagents, (volume/10), 10, T) - s.start() - if(temp>500)//if hot, start a fire switch(temp) if (500 to 750) @@ -55,6 +37,26 @@ new /obj/effect/hotspot(turf) //volume /= 5 + message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].") + var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case. + var/datum/effect_system/smoke_spread/chem/s = new() + /*Endless loop hell + for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents + if (istype(reagent, /datum/reagent/fermi)) + my_atom.reagents.remove_reagent(reagent.id, 1000)//Prevent endless loops + continue //Don't allow fermichems into the mix (fermi explosions are handled elsewhere and it's a huge pain) + //R.add_reagent(reagent, reagent.volume) + if (reagent.purity < 0.6) + ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 + */ + if(pH < 4) //if acidic, make acid spray + //s.set_up(/datum/reagent/fermi/fermiAcid, (volume/3), pH*10, T) + R.add_reagent("fermiAcid", ((volume/3)/pH)) + //pHmod = 2 + if(R.reagent_list) + s.set_up(R, (volume/10), 10, T) + s.start() + if (pH > 10) //if alkaline, small explosion. var/datum/effect_system/reagents_explosion/e = new() e.set_up(round((volume/30)*(pH-9)), T, 0, 0) @@ -86,7 +88,7 @@ CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = 5 //Temperature change per 1u produced HIonRelease = -0.1 //pH change per 1u reaction - RateUpLim = 55 //Optimal/max rate possible if all conditions are perfect (NEEDS TO BE A MULTIPLE OF 10 IF RESULTS IS DOWN BY A FACTOR OF 10) + RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect (NEEDS TO BE A MULTIPLE OF 10 IF RESULTS IS DOWN BY A FACTOR OF 10) FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way @@ -225,10 +227,10 @@ /datum/chemical_reaction/fermi/enthrall//done name = "MKUltra" id = "enthrall" - results = list("enthrall" = 0.3) - required_reagents = list("iron" = 1, "iodine" = 1) - //required_reagents = list("cocoa" = 0.1, "astral" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) - required_catalysts = list("blood" = 0.1) + results = list("enthrall" = 0.5) + //required_reagents = list("iron" = 1, "iodine" = 1) Test vars + required_reagents = list("cocoa" = 0.1, "astral" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) + required_catalysts = list("blood" = 1) mix_message = "the reaction gives off a burgundy plume of smoke!" //FermiChem vars: OptimalTempMin = 780 @@ -340,7 +342,7 @@ /datum/chemical_reaction/fermi/naninte_b_gone//done test name = "Naninte bain" id = "naninte_b_gone" - results = list("naninte_b_gone" = 20) + results = list("naninte_b_gone" = 2) required_reagents = list("synthflesh" = 5, "uranium" = 5, "iron" = 5, "salglu_solution" = 5) mix_message = "the reaction gurgles, encapsulating the reagents in flesh before the emp can be set off." required_temp = 499//To force fermireactions before EMP. @@ -356,7 +358,7 @@ CurveSharppH = 1 ThermicConstant = 5 HIonRelease = 0.01 - RateUpLim = 20 + RateUpLim = 2 FermiChem = TRUE PurityMin = 0.15 @@ -387,6 +389,10 @@ Fa.pH = 3 Fa.data = 3 return + else if (Fa.pH >= 7) + Fa.pH = 7 + Fa.data = 7 + return Fa.pH = my_atom.reagents.pH Fa.data = Fa.pH @@ -395,7 +401,7 @@ id = "fermiBBuffer" results = list("fermiBBuffer" = 15) required_reagents = list("fermiABuffer" = 5, "ethanol" = 5, "salglu_solution" = 1, "water" = 5) - required_catalysts = list("sacid" = 5) //vagely acetic + required_catalysts = list("sacid" = 1) //vagely acetic //FermiChem vars: OptimalTempMin = 250 OptimalTempMax = 500 @@ -418,5 +424,8 @@ Fb.pH = 11 Fb.data = 11 return + else if (Fb.pH <= 7) + Fb.pH = 7 + Fb.data = 7 Fb.pH = my_atom.reagents.pH Fb.data = Fb.pH diff --git a/tgstation.dme b/tgstation.dme index 1eb169aa9e..d03359e2fa 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2820,7 +2820,6 @@ #include "modular_citadel\code\datums\status_effects\debuffs.dm" #include "modular_citadel\code\datums\traits\negative.dm" #include "modular_citadel\code\datums\traits\neutral.dm" -#include "modular_citadel\code\datums\traits\positive.dm" #include "modular_citadel\code\datums\wires\airlock.dm" #include "modular_citadel\code\datums\wires\autoylathe.dm" #include "modular_citadel\code\game\area\cit_areas.dm" From a1afeb880fff052905d830641821adc77617ef80 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 27 May 2019 15:00:19 +0100 Subject: [PATCH 162/608] Final testing. Added pH meter too. Compile safe. --- .../mob/living/simple_animal/friendly/cat.dm | 2 +- code/modules/research/designs/misc_designs.dm | 11 +++++++++++ code/modules/research/techweb/all_nodes.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 8 ++++++++ .../code/modules/reagents/objects/items.dm | 15 +++++++++++++++ modular_citadel/icons/obj/FermiChem.dmi | Bin 3898 -> 4234 bytes sound/FermiChem/SoundSources.txt | 1 + sound/FermiChem/bufferadd.ogg | Bin 0 -> 37400 bytes 8 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 sound/FermiChem/bufferadd.ogg diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 70fc16d0bc..061fdead02 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -372,7 +372,7 @@ /datum/reagent/fermi/secretcatchem //Should I hide this from code divers? A secret cit chem? name = "secretcatchem" //an attempt at hiding it id = "secretcatchem" - description = "An illegal and hidden chem that turns people into cats/catgirls. It's said that it's so rare and unstable that having it means you've been blessed." + description = "An illegal and hidden chem that turns people into cats. It's said that it's so rare and unstable that having it means you've been blessed." taste_description = "hairballs and cream" color = "#ffc224" var/catshift = FALSE diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index d567334998..2e6908ea30 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -456,6 +456,17 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING +/datum/design/pHmeter + name = "pH meter" + desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution." + id = "pHmeter" + build_type = PROTOLATHE + materials = list(MAT_METAL = 1000, MAT_SILVER = 100, MAT_DIAMOND = 100) + build_path = /obj/item/pHmeter + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + + ///////////////////////////////////////// ////////////Armour////////////// ///////////////////////////////////////// diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index e25dced31c..de9dd4b71f 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -69,7 +69,7 @@ display_name = "Advanced Biotechnology" description = "Advanced Biotechnology" prereq_ids = list("biotech") - design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker", "healthanalyzer_advanced","harvester","holobarrier_med") + design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker", "healthanalyzer_advanced","harvester","holobarrier_med", "pHmeter") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 1481ee85a6..d8a6e87391 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1564,6 +1564,10 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y else if (pH >= 7) pH = 7 holder.pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) //Shouldn't be required + var/list/seen = viewers(5, get_turf(my_atom)) + for(var/mob/M in seen) + to_chat(M, "The beaker fizzes as the buffer's pH changes!") + playsound(get_turf(holder), 'modular_citadel/sound/FermiChem/bufferadd.ogg', 50, 1, -1) holder.remove_reagent(src.id, 1000) ..() @@ -1586,5 +1590,9 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y else if (pH <= 7) pH = 7 holder.pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) //Shouldn't be required Might be..? + var/list/seen = viewers(5, get_turf(my_atom)) + for(var/mob/M in seen) + to_chat(M, "The beaker froths as the buffer's pH changes!") + playsound(get_turf(holder), 'modular_citadel/sound/FermiChem/bufferadd.ogg', 50, 1, -1) holder.remove_reagent(src.id, 1000) ..() diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 26636f049a..1b78ce2ec2 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -9,6 +9,7 @@ w_class = WEIGHT_CLASS_TINY //set flammable somehow +//A little janky with pockets /obj/item/pHbooklet/attack_hand(mob/user) if(user.get_held_index_of_item(src)) if(numberOfPages >= 1) @@ -84,3 +85,17 @@ color = "#c6040c" desc += " The paper looks to be around a pH of [round(cont.reagents.pH, 1)]" used = TRUE + +/obj/item/pHmeter + name = "pH meter" + desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays nothing." + icon_state = "pHmeter" + icon = 'modular_citadel/icons/obj/FermiChem.dmi' + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_TINY + +/obj/item/pHmeter/afterattack(obj/item/reagent_containers/cont, mob/user, proximity) + if(!istype(cont)) + return + to_chat(M, "gives a beep and displays [round(cont.reagents.pH, 0.1)]") + desc = "An electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays [round(cont.reagents.pH, 0.1)]." diff --git a/modular_citadel/icons/obj/FermiChem.dmi b/modular_citadel/icons/obj/FermiChem.dmi index b11bf83f68cd5e22695c566f66f89427f4c606c4..e470b9638fedf942ef90586c3d1d6cb8f095013b 100644 GIT binary patch literal 4234 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 literal 3898 zcmV-A55@3_P)V=-0C=30&`k=1Fc1acb#jV9_oaW^Y^qWNQG}i#)~N|r4P$8O?Yj_4S7o}J zfse=IrEn_Fx`w>c@`1GYc>)E;%~p!1@1g?*hrJXIeedG>EYU^;1xeYM495^(i4>iu z1r+S0xRD)ky+1OP?K}^6jK)%r3?6Ji;yPYv*_iBdCB%tEd$Pf?WQ%rSmHpnJ_-{A9 z{281=QRk3XTD}3$hml_%i=3$d01ie;L_t(|ob8=^Y+KbG$G_+LojOhvJI9Hch2}P+-$QXiS|{R#qa0sMt$dR0czXHHEgc zgmx`yL(?|2$?7~BC#mhkzV`Jw`@^~J_50esPGk3eB+K@>_nzNze&6#uuX|4b6&00h z7jm@=kSlJNi={iqVzn0h?*y*=RwaLrR;i2t;Mu32PUwtRfA>4Z3M|Lr#g5zMVoHfX zF#$aL^wX?$*|NCwo>QlkG65j0{%ctTTD=~Ca?v2I0Fu?}L^Rgd$E7JPfNK@E%f&?J z1Ih^@r2wS0ddIHa0D$%<9*Z28rp>0K(?tQV%Qb6dx!S}EK}4<~xO68p*4JaluHCTP ztI*KUgdMwfN75P^nqaqAMTF2;Umy3HZHm$Pv9&)DTD?B<60ecdRLbrHcs!oCG_Tha zmHyg}9dfhFites11^~4+HSuLh;`myJqo79s+4Ofr5eR`m+9pC)1nAuJ4t&08jE;_= zbI&`Gw9(NK_ zvNK~VZTL@z5C|lV04bXQkH>>2Hf@q+WLHNA>Z)z1tF{3^vF{lzme@iC+H9md$%GMnu)CG9BT{B)%416&v!l$}{3vFz&T$fP^~ z;+>z?@fRKks;&r}t6u^Bu!8}BVa=P0MuN*@V>c6x<`)1!2!TeYyA71yMk$4Re0;B^ zqT(JU?d6IP2&6o&=uBWHVo5}*S|989NNpDxVc_alT={M_fEeq+AAX!EDFVWAn>mgH zW0ELC2sBzPI7;tU%8rtgU8#nIiV8qU5;;D$rUL+1(h6GD6aM1j0jnYEI9ae%F%euI z8(YkA+cv!Z<(`U}eJ~t7Ywrn9C zJ9o18&OL&M@h&)vBQB%^h;y=tR0IIR(ICO~*>HJm%)oKngCGQuL;ykvD5YSb(5q#Y zl@m(X%C+||xAp@v1n~Kn$0MIhOD$2yJRW!C^KwUnBBKDQ2sW{PyJ+BAHa$2}(@S8^;y)(5pJ{lxz66kbzen9H{L@SAMaJyWb#cJJsd2H-ZC>Z=P z2nkqhwx8$t^Ww<1_KVKX^u~~+0w^!9fOBFT$e?GRXcXX_m_&JbMJ8p6LlgmUWv(F6 zq)%LvV2XEswu?j-tCa#kna$P<;3v8Kog^pI=^% zBcC4vka{vG6|o}NxT-sRAVvtuYW`ea9*z}2CXpc9+7HACpmq65R#&$O6Ykuco(#v5 zr8s)z3-p{kk&`3DCIOI$07x13=d$xfq#}?jfLxppBxnLW9yb;)ScFrjda!I+Yvess zyj~9m1};S9(cgDAn=-~BZ4#uTghF;caK(wD5QIP=r4Vv;K9HmjAl}6zz7GvKQCeCW zIX*f%k}xy7y((!QO57PFMHE46OAEvf;>K0sW1{ohHf$&e$0s6Pk6sDq16iyFj*gC? zp`j_^vHt$EQ6k7UQV{^aSN`yOYYPh6`M{MspG8MYBY{%R2eMoa_Ij1A&AA{tT5J*u z-SI%QV`GJo=$u?g(ge6sSGNd*gBNB}*v!0t*k-aOAbhPSat#0s4qiZA-J+;;4FH_NGvk#3=n}d`8Q`*D~wd z+xM++Z{L?LE#D};+leXw8LV$_-`Bf$@4nu>dm|1{lvaqSO@K^V?!NmLIcc+jlKUg5 z5kMxVIy*l;)!F%Ry0oiJru!qP5ukv`$NmV)4g)VT_Db!Qug^IFEFiN!)MVXYXzK<+ zn_{-bcK*PQ9k--P%Ll0*mIZR#A3<5?e8Ctb0)P|14YMnNPB3;)H-XXuxEjpH{s{8^ zK(UUMauu9>Es*Q}2&V7sSLVTxa0!4{k_g~ASsCQc8w_kS0bw)Cj07NJ+AI}e*2rmp zgb{{`MQ;Ld$g)*1oj}p~WF~4cfPny;uXe!{B-i~Bq&WNfn4D&yUbj5WWpg z#5pt+i6H4jAWs0!6m7jzRt~w7$k9dQ{ItwCUUYaYJ-xkAkG(mEh5&?{l2jtNcK(0` zLdVXX448=m5|TMyN}}f;rISX9M4$>_4kC&mQ_=|lh!=sn7BC0dv}H@)DyFlqFG^gh z0Oly0wrnBUKFXd6ssQFN()|(gg(`qKPQFE;b^;58xcw0l5G#~K%f@Oaus{)?d`cD# zo?-h_D*ZF`dfPyBO2t)zQ{vAOovreMBhJfPvcR4CD zk^WyL6%`c~6%`c~6%`c~6%`c~6%`egXtJI!cDr1+1MmR23&5Q*htFB8)`xQ`*j%?? zEM)y;kXEOAAQ%WdK_t&+5RSvl_k{|SZBE-S7P7u0sKjDM9ci;YXnKaeGZoqeiDgND$z=d>MXU35a14({PveY6a&5`6z5U z`<%X-5mV@2V7NaY_KOkOoxmge_N@|v!GDyPOm#N99hD2J;q_=R?GAvz2P69k#ODg= z0@Q9<{oG}x3!2tGw+|Zcd7kk`Q^lH}sq5l0ktKkmpMLg$z)WwOOG-@(7B2+R=rJ`# z08bY*!Z$EY?1z5-31~EW#sW+GD9^oMSo_C!)8{OYWcJzA0T|JbQul|@@_XRZJ{okJ zA6r}9y5Xo&wu>EE0{HZw@3Vz<^H5b=1Mf5eyYz49_%C5F_d~1YLEY0}+9r^)2B1U- z!k2;#pZ=j?-COS{QOGOyYvJ{A;3hvoS*Qz~@dT*r5=JL)fm{1+Xe(C2T(f#A#Jg{+ zZLl9!!gjGEs}C@6{w!8k{2lsn9)hnFI)fI(+Yjbn16p|bC+Y@{8|um3qtl5P&xukj)1TVaONhU z)C^*2 zAm$n{odCw41@r1)F!{jq(=e_2M3K8w-}wF8+l7#Js~`kmG!p1JKR8e@5CnrkG&eS) zeExj+c^>x4N|cyP2!%p?t;1nd!hW$Ldm`wWXEr`BSgzl`_p1#!bzB4Z{NRiYAm%zy z41i944fy#tOS%F2N(rNeDNt`U@S5SFvOjp z5=BNcfw$j%>$du)rkA>hZ^eNxYoH4ZLT|K!%wGm(_JdAegds49pnDJp`|m_a^?egc z7WSq)?%3AU(C|`~-404Agz%&f1VI3salB5Wflj9rMWCqtVkG0K;B~jG+q!aj{r2Fz zwPWw^UxKNNlQ3v`aK;tTm5xK0ynubDegMm&?|YgT8rLda;BVb@)7GU9$M%NBi^qb3 z0Jql*du1icEEf2A9%i!{CW8T#QV#&d?H3zax6j889IhE04ScBe^{%Wo_F~o2_b|a^ldTnz8Zm4}Cu0%4)kEj4|l-de|!~!5HgjjNM!7 zaOBN?v5->-?d0J@wuve3!1;j@$4w30xa_OMQ1FIrE0t^O%5U-FQK3$?GgdDRgm3MQBC zt}YX$^eKbE@KBZA-d^3*G^_SiR8&+{R8&+{R8&+{R0@dy0~+olZjrP4u>b%707*qo IM6N<$f@JG9F8}}l diff --git a/sound/FermiChem/SoundSources.txt b/sound/FermiChem/SoundSources.txt index 15b25ccd05..bd45f866f5 100644 --- a/sound/FermiChem/SoundSources.txt +++ b/sound/FermiChem/SoundSources.txt @@ -5,5 +5,6 @@ heatmelt.ogg - from https://freesound.org/people/toiletrolltube/sounds/181483/ heatacid.ogg - from https://freesound.org/people/klankbeeld/sounds/233697/ from bubbles2.ogg from fuse.ogg +bufferadd.ogg- https://freesound.org/people/toiletrolltube/sounds/181483/ Work is licensed under the Creative Commons and Attribution License. \ No newline at end of file diff --git a/sound/FermiChem/bufferadd.ogg b/sound/FermiChem/bufferadd.ogg new file mode 100644 index 0000000000000000000000000000000000000000..31bc4404252e60169cb44e8fa84d100761b4803b GIT binary patch literal 37400 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

    Pm( zS{BGznhHWGT!yxs?Wjig&YG;8lj}1M)>atd$S6jkSQk$T(M~xHZQ&pk4nipmTyg`* z!m@DSlvSfj7_=@pSX=8-vp9iDH(rbsKIT_bR*q_xSd6TiWs#iAA~~|urhZgC*GJ8L zu{e5>8Vyj{meD$o@2$I!^WRYWXE^_#$+Mf^1BM0I{F?fk?JM|Sz!#guXf3Kye3hd+ zsjT#yHyOS1;Lcu`Oie>uh2p427PRH;HL8*Ger}j`Z?=!%x#9!=z`|{0;boOQ001^$ sNu;laWw4B5VR?N(cJnJ^dNZfGu$h`}yh{`SvMK|km{I@$*ZE$*0rH9;qW}N^ literal 0 HcmV?d00001 From c531e6afa6bd9a7a1c9f65cf69cd73c0aa0ccbd1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 27 May 2019 15:03:29 +0100 Subject: [PATCH 163/608] Okay, forgot to stage changes. Now compile safe. --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 8 ++++---- modular_citadel/code/modules/reagents/objects/items.dm | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index d8a6e87391..66f7f5fe45 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1564,10 +1564,10 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y else if (pH >= 7) pH = 7 holder.pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) //Shouldn't be required - var/list/seen = viewers(5, get_turf(my_atom)) + var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The beaker fizzes as the buffer's pH changes!") - playsound(get_turf(holder), 'modular_citadel/sound/FermiChem/bufferadd.ogg', 50, 1, -1) + playsound(get_turf(holder), 'sound/FermiChem/bufferadd.ogg', 50, 1, -1) holder.remove_reagent(src.id, 1000) ..() @@ -1590,9 +1590,9 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y else if (pH <= 7) pH = 7 holder.pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) //Shouldn't be required Might be..? - var/list/seen = viewers(5, get_turf(my_atom)) + var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The beaker froths as the buffer's pH changes!") - playsound(get_turf(holder), 'modular_citadel/sound/FermiChem/bufferadd.ogg', 50, 1, -1) + playsound(get_turf(holder), 'sound/FermiChem/bufferadd.ogg', 50, 1, -1) holder.remove_reagent(src.id, 1000) ..() diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 1b78ce2ec2..457514df88 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -97,5 +97,5 @@ /obj/item/pHmeter/afterattack(obj/item/reagent_containers/cont, mob/user, proximity) if(!istype(cont)) return - to_chat(M, "gives a beep and displays [round(cont.reagents.pH, 0.1)]") + to_chat(src, "gives a beep and displays [round(cont.reagents.pH, 0.1)]") desc = "An electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays [round(cont.reagents.pH, 0.1)]." From 79a7b6b45b178cc8883336fb7369dd6d8e92ba8c Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 27 May 2019 20:25:57 +0100 Subject: [PATCH 164/608] Fixes. --- code/game/say.dm | 1 - code/modules/jobs/job_types/medical.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 47 ++++++++++++------- code/modules/research/designs/misc_designs.dm | 2 +- code/modules/vending/wardrobes.dm | 2 +- .../code/modules/arousal/organs/genitals.dm | 21 +++++++-- .../chemistry/reagents/fermi_reagents.dm | 43 +++++++++-------- .../reagents/chemistry/recipes/fermi.dm | 36 ++++---------- .../code/modules/reagents/objects/items.dm | 20 ++++---- 9 files changed, 97 insertions(+), 77 deletions(-) diff --git a/code/game/say.dm b/code/game/say.dm index a6cf177140..e797fe5e64 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -29,7 +29,6 @@ GLOBAL_LIST_INIT(freqtospan, list( send_speech(message, 7, src, , spans, message_language=language) /atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - //message_admins("Pre: [message], [speaker], [message_language], [raw_message], [radio_freq], [spans], [message_mode]") SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, message, speaker, message_language, raw_message, radio_freq, spans, message_mode) /atom/movable/proc/can_speak() diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index 6447077173..716e58f417 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -127,7 +127,7 @@ Chemist backpack = /obj/item/storage/backpack/chemistry satchel = /obj/item/storage/backpack/satchel/chem duffelbag = /obj/item/storage/backpack/duffelbag/med - l_hand = /obj/item/pHbooklet + l_hand = /obj/item/FermiChem/pHbooklet chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 61b7ab2c1a..0e3d10850b 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -128,7 +128,7 @@ im update_total() handle_reactions() - pH = REAGENT_NORMAL_PH //Maybe unnessicary? NO incredibly nessicary, blows the beaker up otherwise + //pH = REAGENT_NORMAL_PH //Maybe unnessicary? NO incredibly nessicary, blows the beaker up otherwise. YES 100% NOT REQUIRED, THIS IS FOR REAMOVING AN AMMOUNT, NOT ALL. return amount /datum/reagents/proc/get_master_reagent_name() @@ -684,20 +684,37 @@ im //Then adjust purity of result with reagent purity. purity *= reactant_purity(C) + /*old + stepChemAmmount = CLAMP(((deltaT * cached_results[P]) * multiplier), 0, (targetVol - reactedVol)) //used to have multipler, now it does + if (stepChemAmmount * cached_results[P] > C.RateUpLim) + stepChemAmmount = C.RateUpLim + else if (stepChemAmmount <= 0.01) + stepChemAmmount = 0.01 + */ + var/removeChemAmmount + var/addChemAmmount + //ONLY WORKS FOR ONE PRODUCT AT THE MOMENT + for(var/P in cached_results) + //stepChemAmmount = CLAMP(((deltaT * multiplier), 0, ((targetVol - reactedVol)/cached_results[P])) //used to have multipler, now it does + stepChemAmmount = (multiplier*cached_results[P]) + if (stepChemAmmount >= C.RateUpLim) + stepChemAmmount = (C.RateUpLim)//something weird with this line maybe. + addChemAmmount = deltaT * stepChemAmmount + if (addChemAmmount >= (targetVol - reactedVol)) + addChemAmmount = (targetVol - reactedVol) + if (addChemAmmount < 0.01) + addChemAmmount = 0.01 + removeChemAmmount = (addChemAmmount/cached_results[P]) + message_admins("Reaction vars: PreReacted: [reactedVol] of [targetVol]. deltaT [deltaT], multiplier [multiplier], Step [stepChemAmmount], uncapped Step [deltaT*(multiplier*cached_results[P])], addChemAmmount [addChemAmmount], removeFactor [removeChemAmmount] Pfactor [cached_results[P]], adding [addChemAmmount]") + for(var/B in cached_required_reagents) - remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + remove_reagent(B, (removeChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. var/TotalStep = 0 for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? - stepChemAmmount = CLAMP(((deltaT * cached_results[P]) * multiplier), 0, (targetVol - reactedVol)) //used to have multipler, now it does - if (stepChemAmmount * cached_results[P] > C.RateUpLim) - stepChemAmmount = C.RateUpLim - else if (stepChemAmmount <= 0.01) - stepChemAmmount = 0.01 - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, (stepChemAmmount), null, cached_temp, purity)//add reagent function!! I THINK I can do this: - TotalStep += stepChemAmmount//for multiple products + add_reagent(P, (addChemAmmount), null, cached_temp, purity)//add reagent function!! I THINK I can do this: + TotalStep += addChemAmmount//for multiple products //Above should reduce yeild based on holder purity. //Purity Check //NOT MULTIPROD SAFE. TODO: Add multiproduct support @@ -711,10 +728,10 @@ im C.FermiCreate(src)//proc that calls when step is done //Apply pH changes and thermal output of reaction to beaker - chem_temp = round(cached_temp + (C.ThermicConstant * stepChemAmmount)) //Why won't you update!!! Because I'm silly. - pH += (C.HIonRelease * stepChemAmmount)//honestly pH shifting is so confusing + chem_temp = round(cached_temp + (C.ThermicConstant * addChemAmmount)) //Why won't you update!!! Because I'm silly. + pH += (C.HIonRelease * addChemAmmount)//honestly pH shifting is so confusing //keep track of the current reacted amount - reactedVol = reactedVol + stepChemAmmount + reactedVol = reactedVol + addChemAmmount //return said amount to compare for next step. return (reactedVol) @@ -891,8 +908,6 @@ im update_total() if(my_atom) my_atom.on_reagent_change(ADD_REAGENT) - //if(R.FermiChem == TRUE) - // R.on_mob_add(my_atom) R.on_merge(data, amount, my_atom, other_purity) if(istype(D, /datum/reagent/fermi))//Is this a fermichem? var/datum/reagent/fermi/Ferm = D //It's Fermi time! @@ -958,7 +973,7 @@ im if (R.id == reagent) //clamp the removal amount to be between current reagent amount //and zero, to prevent removing more than the holder has stored - if((total_volume - amount) == 0)//Because this can result in 0, I don't want it to crash. + if((total_volume - amount) <= 0)//Because this can result in 0, I don't want it to crash. pH = 7 else pH = ((pH * total_volume)-(R.pH * amount))/(total_volume - amount) diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 2e6908ea30..e33895f831 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -462,7 +462,7 @@ id = "pHmeter" build_type = PROTOLATHE materials = list(MAT_METAL = 1000, MAT_SILVER = 100, MAT_DIAMOND = 100) - build_path = /obj/item/pHmeter + build_path = /obj/item/FermiChem/pHmeter category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index cbb0e552b1..c40bec7eda 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -313,7 +313,7 @@ /obj/item/storage/backpack/chemistry = 3, /obj/item/storage/backpack/satchel/chem = 3, /obj/item/storage/bag/chemistry = 3, - /obj/item/pHbooklet = 3)//pH indicator) + /obj/item/FermiChem/pHbooklet = 3)//pH indicator) refill_canister = /obj/item/vending_refill/wardrobe/chem_wardrobe /obj/item/vending_refill/wardrobe/chem_wardrobe diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 049252e5b7..cc14e5ad95 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -293,8 +293,8 @@ dna.species.use_skintones = TRUE return //So people who haven't set stuff up don't get rainbow surprises. - dna.features["cock_color"] = "#[dna.features["mcolor"]]" - dna.features["breasts_color"] = "#[dna.features["mcolor"]]" + //dna.features["cock_color"] = "#[dna.features["mcolor"]]" + //dna.features["breasts_color"] = "#[dna.features["mcolor"]]" return /datum/species/proc/handle_genitals(mob/living/carbon/human/H)//more like handle sadness @@ -360,7 +360,22 @@ genital_overlay.color = "#[H.dna.features["breasts_color"]]" if("vag_color") genital_overlay.color = "#[H.dna.features["vag_color"]]" - + //This was removed for some reason, but it breaks my code, so now it's back!! Tadahhh. + if(MUTCOLORS) + if(fixed_mut_color) + genital_overlay.color = "#[fixed_mut_color]" + else + genital_overlay.color = "#[H.dna.features["mcolor"]]" + if(MUTCOLORS2) + if(fixed_mut_color2) + genital_overlay.color = "#[fixed_mut_color2]" + else + genital_overlay.color = "#[H.dna.features["mcolor2"]]" + if(MUTCOLORS3) + if(fixed_mut_color3) + genital_overlay.color = "#[fixed_mut_color3]" + else + genital_overlay.color = "#[H.dna.features["mcolor3"]]" standing += genital_overlay if(LAZYLEN(standing)) H.overlays_standing[layer] = standing.Copy() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 66f7f5fe45..52ec12b899 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -617,9 +617,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(!B) H.emergent_genital_call() return - var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) - B.prev_size = B.size - B.cached_size = sizeConv[B.size] + if(!B.size == "huge") + var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) + B.prev_size = B.size + B.cached_size = sizeConv[B.size] //message_admins("init B size: [B.size], prev: [B.prev_size], cache = [B.cached_size], raw: [sizeConv[B.size]]") //if this runtimes it's cause someone's breasts are too big! /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size @@ -1110,11 +1111,11 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y //FERMICHEM2 split into different chems /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) . = ..() - if(!creatorID) - CRASH("Something went wrong in enthral creation THIS SHOULD NOT APPEAR") - return if(!ishuman(M))//Just to make sure screwy stuff doesn't happen. return + if(!creatorID) + CRASH("Something went wrong in enthral creation THIS SHOULD NOT APPEAR") //nervermind this appears when you blow up the reaction. I dunno how + return var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) //Somehow a beaker got here? (what) if(E) return @@ -1141,7 +1142,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y return var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers for(var/victim in seen) - if((victim == /mob/living/simple_animal/pet/) || (victim == M)) + if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (!M.client)) seen = seen - victim if(!seen) return @@ -1150,9 +1151,9 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y return else // If someone else drinks it, the creator falls in love with them! var/mob/living/carbon/C = get_mob_by_key(creatorID) - if(C.has_status_effect(STATUS_EFFECT_INLOVE)) + if(M.has_status_effect(STATUS_EFFECT_INLOVE)) return - if(C in viewers(7, get_turf(M))) + if((C in viewers(7, get_turf(M))) && (C.client)) M.reagents.remove_reagent(src.id, src.volume) FallInLove(C, M) return @@ -1550,23 +1551,25 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y description = "This reagent will consume itself and move the pH of a beaker towards 3 when added to another." taste_description = "an acidy sort of taste, blech." color = "#fbc314" - addProc = FALSE - pH = 6 + pH = 3 -/datum/reagent/fermi/fermiABuffer/on_new() +/datum/reagent/fermi/fermiABuffer/on_new(datapH) message_admins("Adding acid") + src.data = datapH if(LAZYLEN(holder.reagent_list) == 1) return - src.pH = data + /*to be fixed later + pH = data if (pH <= 3) pH = 3 else if (pH >= 7) pH = 7 + */ holder.pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) //Shouldn't be required var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) - to_chat(M, "The beaker fizzes as the buffer's pH changes!") + to_chat(M, "The beaker fizzes as the pH changes!") playsound(get_turf(holder), 'sound/FermiChem/bufferadd.ogg', 50, 1, -1) holder.remove_reagent(src.id, 1000) ..() @@ -1577,22 +1580,24 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y description = "This reagent will consume itself and move the pH of a beaker towards 11 when added to another." taste_description = "an soapy sort of taste, blech." color = "#3853a4" - addProc = FALSE - pH = 8 + pH = 11 -/datum/reagent/fermi/fermiBBuffer/on_new() +/datum/reagent/fermi/fermiBBuffer/on_new(datapH) message_admins("Adding base") + src.data = datapH if(LAZYLEN(holder.reagent_list) == 1) return + /*to be fixed later src.pH = data if (pH >= 11) pH = 11 else if (pH <= 7) pH = 7 + */ holder.pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) //Shouldn't be required Might be..? var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) - to_chat(M, "The beaker froths as the buffer's pH changes!") - playsound(get_turf(holder), 'sound/FermiChem/bufferadd.ogg', 50, 1, -1) + to_chat(M, "The beaker froths as the pH changes!") + playsound(get_turf(holder.my_atom), 'sound/FermiChem/bufferadd.ogg', 50, 1) holder.remove_reagent(src.id, 1000) ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 96d8d4c601..496ffe6461 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -88,7 +88,7 @@ CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = 5 //Temperature change per 1u produced HIonRelease = -0.1 //pH change per 1u reaction - RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect (NEEDS TO BE A MULTIPLE OF 10 IF RESULTS IS DOWN BY A FACTOR OF 10) + RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way @@ -218,7 +218,7 @@ CurveSharppH = 1 ThermicConstant = 25 HIonRelease = -0.5 - RateUpLim = 10 + RateUpLim = 20 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.25 // explode purity! @@ -235,7 +235,7 @@ //FermiChem vars: OptimalTempMin = 780 OptimalTempMax = 800 - ExplodeTemp = 820 + ExplodeTemp = 830 OptimalpHMin = 12 OptimalpHMax = 13 ReactpHLim = 2 @@ -244,7 +244,7 @@ CurveSharppH = 4 ThermicConstant = 10 HIonRelease = -0.1 - RateUpLim = 2 + RateUpLim = 1 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.2 @@ -280,7 +280,6 @@ s.set_up(R, volume, T) s.start() my_atom.reagents.clear_reagents() - ..(volume = 0, pH = 7) //Just a lil fire. /datum/chemical_reaction/fermi/hatmium // done name = "Hat growth serum" @@ -342,7 +341,7 @@ /datum/chemical_reaction/fermi/naninte_b_gone//done test name = "Naninte bain" id = "naninte_b_gone" - results = list("naninte_b_gone" = 2) + results = list("naninte_b_gone" = 20) required_reagents = list("synthflesh" = 5, "uranium" = 5, "iron" = 5, "salglu_solution" = 5) mix_message = "the reaction gurgles, encapsulating the reagents in flesh before the emp can be set off." required_temp = 499//To force fermireactions before EMP. @@ -382,19 +381,10 @@ RateUpLim = 20 FermiChem = TRUE -//This reaction bugs and turns everything in it to FermiABuffer - but now it's a feature instead! And then I fixed it anyways + /datum/chemical_reaction/fermi/fermiABuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this var/datum/reagent/fermi/fermiABuffer/Fa = locate(/datum/reagent/fermi/fermiABuffer) in my_atom.reagents.reagent_list - if (Fa.pH <= 3) - Fa.pH = 3 - Fa.data = 3 - return - else if (Fa.pH >= 7) - Fa.pH = 7 - Fa.data = 7 - return - Fa.pH = my_atom.reagents.pH - Fa.data = Fa.pH + Fa.data = 3 /datum/chemical_reaction/fermi/fermiBBuffer//done test name = "Ethyl Ethanoate buffer" @@ -417,15 +407,7 @@ RateUpLim = 15 FermiChem = TRUE -//This reaction bugs and turns everything in it to FermiBBuffer - but now it's a feature instead! And then I fixed it anyways + /datum/chemical_reaction/fermi/fermiBBuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this var/datum/reagent/fermi/fermiBBuffer/Fb = locate(/datum/reagent/fermi/fermiBBuffer) in my_atom.reagents.reagent_list - if (Fb.pH >= 11) - Fb.pH = 11 - Fb.data = 11 - return - else if (Fb.pH <= 7) - Fb.pH = 7 - Fb.data = 7 - Fb.pH = my_atom.reagents.pH - Fb.data = Fb.pH + Fb.data = 11 diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 457514df88..30b9c8d711 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -1,4 +1,4 @@ -/obj/item/pHbooklet +/obj/item/FermiChem/pHbooklet name = "pH indicator booklet" desc = "A booklet containing paper soaked in universal indicator." icon_state = "pHbooklet" @@ -10,10 +10,10 @@ //set flammable somehow //A little janky with pockets -/obj/item/pHbooklet/attack_hand(mob/user) +/obj/item/FermiChem/pHbooklet/attack_hand(mob/user) if(user.get_held_index_of_item(src)) if(numberOfPages >= 1) - var/obj/item/pHpaper/P = new /obj/item/pHpaper + var/obj/item/FermiChem/pHpaper/P = new /obj/item/FermiChem/pHpaper P.add_fingerprint(user) P.forceMove(user.loc) user.put_in_active_hand(P) @@ -34,7 +34,7 @@ user.put_in_active_hand(src) return -/obj/item/pHpaper +/obj/item/FermiChem/pHpaper name = "pH indicator strip" desc = "A piece of paper that will change colour depending on the pH of a solution." icon_state = "pHpaper" @@ -46,12 +46,14 @@ w_class = WEIGHT_CLASS_TINY //set flammable somehow -/obj/item/pHpaper/afterattack(obj/item/reagent_containers/cont, mob/user, proximity) +/obj/item/FermiChem/pHpaper/afterattack(obj/item/reagent_containers/cont, mob/user, proximity) if(!istype(cont)) return if(used == TRUE) to_chat(user, "[user] has already been used!") return + if(LAZYLEN(cont.reagents.reagent_list) == null) + return switch(round(cont.reagents.pH, 1)) if(14 to INFINITY) color = "#462c83" @@ -86,7 +88,7 @@ desc += " The paper looks to be around a pH of [round(cont.reagents.pH, 1)]" used = TRUE -/obj/item/pHmeter +/obj/item/FermiChem/pHmeter name = "pH meter" desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays nothing." icon_state = "pHmeter" @@ -94,8 +96,10 @@ resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_TINY -/obj/item/pHmeter/afterattack(obj/item/reagent_containers/cont, mob/user, proximity) +/obj/item/FermiChem/pHmeter/afterattack(obj/item/reagent_containers/cont, mob/user, proximity) if(!istype(cont)) return - to_chat(src, "gives a beep and displays [round(cont.reagents.pH, 0.1)]") + if(LAZYLEN(cont.reagents.reagent_list) == null) + return + to_chat(user, "The pH meter beeps and displays [round(cont.reagents.pH, 0.1)]") desc = "An electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays [round(cont.reagents.pH, 0.1)]." From 5771fd9442e21337a69a66934c29eae9346a8096 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 27 May 2019 20:52:05 +0100 Subject: [PATCH 165/608] Should be the last fix. --- .../mob/living/simple_animal/friendly/cat.dm | 10 ++++++---- .../chemistry/reagents/fermi_reagents.dm | 16 ++++++++-------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 061fdead02..b28983d642 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -323,7 +323,7 @@ id = "secretcatchem" results = list("secretcatchem" = 0.5) required_reagents = list("stable_plasma" = 0.1, "sugar" = 0.1, "cream" = 0.1, "blood" = 0.1, "slimejelly" = 0.1) - required_catalysts = list("felinidmutationtoxin" = 5) + //required_catalysts = list("water" = 5) required_temp = 600 mix_message = "the reaction gives off a meow!" mix_sound = "modular_citadel/sound/voice/merowr.ogg" @@ -348,8 +348,8 @@ //rand doesn't seem to work with n^-e //message_admins("randomizing reaction") OptimalTempMin += rand(-100, 100) - OptimalTempMax += (OptimalpHMin+rand(0, 200)) - ExplodeTemp += (OptimalpHMax+rand(0, 200)) + OptimalTempMax += (OptimalTempMin+rand(0, 200)) + ExplodeTemp += (OptimalTempMaxx+rand(0, 200)) OptimalpHMin += rand(1, 10) OptimalpHMax += (OptimalpHMin + rand(0, 5)) ReactpHLim += rand(-2, 2) @@ -361,7 +361,9 @@ PurityMin += (rand(-1, 1)/10) var/additions = list("aluminum", "silver", "gold", "plasma", "silicon", "bluespace") //var/chosenA = pick(additions) - required_reagents += list("[pick(additions)]", rand(0.1, 1)) + var/cataly = list ("felinidmutationtoxin", "uranium", "bluespace") + required_reagents[pick(additions)] = rand(0.1, 1)) + required_catalysts = list("[pick(cataly)]" = rand(0.1, 1)) /datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. message_admins("Someone found the hidden reaction. Amazing!! Please tell Fermis!!") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 52ec12b899..3300ce19a7 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -428,7 +428,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) if(87 to INFINITY) - M.reagents.remove_reagent(src.id, 1000)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. + M.reagents.remove_reagent(src.id, src.volume)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. ..() @@ -609,7 +609,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.Knockdown(50) M.Stun(50) B.throw_at(T2, 8, 1) - M.reagents.remove_reagent(src.id, 1000) + M.reagents.remove_reagent(src.id, src.volume) return var/mob/living/carbon/human/H = M H.genital_override = TRUE @@ -733,7 +733,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.Knockdown(50) M.Stun(50) P.throw_at(T2, 8, 1) - M.reagents.remove_reagent(src.id, 1000) + M.reagents.remove_reagent(src.id, src.volume) return var/mob/living/carbon/human/H = M H.genital_override = TRUE @@ -1507,7 +1507,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(LAZYLEN(holder.reagent_list) == 1) return else - holder.remove_reagent("fermiTest", 1000)//Avoiding recurrsion + holder.remove_reagent("fermiTest", src.volume)//Avoiding recurrsion message_admins("FermiTest addition!") var/location = get_turf(holder.my_atom) if(purity < 0.34 || purity == 1) @@ -1528,7 +1528,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y Ferm.on_reaction(holder, reagent.volume) for(var/mob/M in viewers(8, location)) to_chat(M, "The solution reacts dramatically, with a meow!") - playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) + playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1) holder.clear_reagents() /datum/reagent/fermi/fermiTox @@ -1570,8 +1570,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The beaker fizzes as the pH changes!") - playsound(get_turf(holder), 'sound/FermiChem/bufferadd.ogg', 50, 1, -1) - holder.remove_reagent(src.id, 1000) + playsound(get_turf(holder), 'sound/FermiChem/bufferadd.ogg', 50, 1) + holder.remove_reagent(src.id, src.volume) ..() /datum/reagent/fermi/fermiBBuffer @@ -1599,5 +1599,5 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y for(var/mob/M in seen) to_chat(M, "The beaker froths as the pH changes!") playsound(get_turf(holder.my_atom), 'sound/FermiChem/bufferadd.ogg', 50, 1) - holder.remove_reagent(src.id, 1000) + holder.remove_reagent(src.id, src.volume) ..() From df2a14880ea0a0b4b976dec15e6ce7c3f021a54f Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 28 May 2019 00:35:33 +0100 Subject: [PATCH 166/608] Beginning comment purge. --- .../mob/living/simple_animal/friendly/cat.dm | 20 ++++++++-------- .../code/modules/arousal/organs/penis.dm | 4 ++-- .../chemistry/reagents/fermi_reagents.dm | 23 ++++--------------- .../reagents/chemistry/recipes/fermi.dm | 2 +- 4 files changed, 18 insertions(+), 31 deletions(-) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index b28983d642..aa218c8193 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -348,22 +348,22 @@ //rand doesn't seem to work with n^-e //message_admins("randomizing reaction") OptimalTempMin += rand(-100, 100) - OptimalTempMax += (OptimalTempMin+rand(0, 200)) - ExplodeTemp += (OptimalTempMaxx+rand(0, 200)) - OptimalpHMin += rand(1, 10) - OptimalpHMax += (OptimalpHMin + rand(0, 5)) + OptimalTempMax = (OptimalTempMin+rand(0, 200)) + ExplodeTemp = (OptimalTempMax+rand(0, 200)) + OptimalpHMin += rand(1, 10 + OptimalpHMax = (OptimalpHMin + rand(1, 5)) ReactpHLim += rand(-2, 2) CurveSharpT += (rand(1, 500)/100) CurveSharppH += (rand(1, 500)/100) ThermicConstant += rand(-50, 50) HIonRelease += (rand(-25, 25)/100) - RateUpLim += (rand(1, 1000)/10) + RateUpLim += (rand(1, 1000)/100) PurityMin += (rand(-1, 1)/10) var/additions = list("aluminum", "silver", "gold", "plasma", "silicon", "bluespace") //var/chosenA = pick(additions) - var/cataly = list ("felinidmutationtoxin", "uranium", "bluespace") - required_reagents[pick(additions)] = rand(0.1, 1)) - required_catalysts = list("[pick(cataly)]" = rand(0.1, 1)) + var/cataly = list ("felinidmutationtoxin", "uranium", "bluespace", "milk") + required_reagents[pick(additions)] = rand(1, 5)//weird + required_catalysts = list("[pick(cataly)]" = 1) /datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. message_admins("Someone found the hidden reaction. Amazing!! Please tell Fermis!!") @@ -388,7 +388,7 @@ //origin = H var/current_species = H.dna.species.type var/datum/species/mutation = /datum/species/human/felinid - if((mutation != current_species) && (purity >= 0.8))//ONLY if purity is high, and given the stuff is random. It's basically impossible to get this to 1. + if((mutation != current_species) && (purity >= 0.8))//ONLY if purity is high, and given the stuff is random. It's basically impossible to get this to 1. It already requires felind too, so no new functionality there. H.set_species(mutation) H.gender = FEMALE //exception(al) handler, I said cat tail damnit! @@ -437,4 +437,4 @@ catto.name = "FermiCat" catto.desc = "A cute Fermichem cat, created by a lot of compicated and confusing chemistry!" catto.color = "#770000" - my_atom.reagents.remove_reagent("secretcatchem", 10) + my_atom.reagents.remove_any(10) diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 553b7983f0..fd23e1054e 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -60,9 +60,9 @@ o.apply_status_effect(/datum/status_effect/chem/PElarger) if (round(length) > round(prev_size)) - to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "Chase Redtail", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.") + to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.") else if (round(length) < round(prev_size)) - to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "Chase Redtail", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.") + to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.") prev_size = length icon_state = sanitize_text("penis_[shape]_[size]") girth = (length * girth_ratio)//Is it just me or is this ludicous, why not make it exponentially decay? diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 3300ce19a7..742e446f10 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -109,7 +109,8 @@ addiction_stage2_end = 30 addiction_stage3_end = 41 addiction_stage4_end = 44 //Incase it's too long - var/turf/open/location_created + var/location_created + //var/turf/open/location_created var/turf/open/location_return = null var/addictCyc1 = 0 var/addictCyc2 = 0 @@ -1553,20 +1554,13 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y color = "#fbc314" pH = 3 - +//Consumes self on addition and shifts pH /datum/reagent/fermi/fermiABuffer/on_new(datapH) message_admins("Adding acid") src.data = datapH if(LAZYLEN(holder.reagent_list) == 1) return - /*to be fixed later - pH = data - if (pH <= 3) - pH = 3 - else if (pH >= 7) - pH = 7 - */ - holder.pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) //Shouldn't be required + holder.pH = ((holder.pH * holder.total_volume)+(pH * (src.volume*3)))/(holder.total_volume + (src.volume*3)) //Shouldn't be required var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The beaker fizzes as the pH changes!") @@ -1587,14 +1581,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y src.data = datapH if(LAZYLEN(holder.reagent_list) == 1) return - /*to be fixed later - src.pH = data - if (pH >= 11) - pH = 11 - else if (pH <= 7) - pH = 7 - */ - holder.pH = ((holder.pH * holder.total_volume)+(pH * src.volume))/(holder.total_volume + src.volume) //Shouldn't be required Might be..? + holder.pH = ((holder.pH * holder.total_volume)+(pH * (src.volume*3)))/(holder.total_volume + (src.volume*3)) //Shouldn't be required Might be..? var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The beaker froths as the pH changes!") diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 496ffe6461..7ed8af67c1 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -92,7 +92,7 @@ FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way - +//I can never get this to work, please pitch in if you can figure it out. Runtime: Cannot modify null.location_created. /datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. var/turf/open/location = get_turf(my_atom) var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list From 8282819c843714df5485fff3bf44ca5d35842dce Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 28 May 2019 05:03:58 +0100 Subject: [PATCH 167/608] CHECK PLASMA THOUGH! --- code/modules/mob/living/carbon/life.dm | 6 -- .../mob/living/simple_animal/friendly/cat.dm | 10 +-- .../chemistry/machinery/reagentgrinder.dm | 7 -- code/modules/reagents/chemistry/reagents.dm | 5 -- .../code/modules/arousal/organs/genitals.dm | 88 +++---------------- .../code/modules/arousal/organs/penis.dm | 4 +- .../chemistry/reagents/fermi_reagents.dm | 9 +- .../reagents/chemistry/recipes/fermi.dm | 10 ++- 8 files changed, 28 insertions(+), 111 deletions(-) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 64ecf35e4b..bbe882627f 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -49,12 +49,6 @@ /mob/living/carbon/handle_breathing(times_fired) if((times_fired % 4) == 2 || failed_last_breath) breathe() //Breathe per 4 ticks, unless suffocating - /* Hey maintainer reading this right now, should we handle suffocation this way? - if(failed_last_breath) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) - else - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "suffocation") - */ else if(istype(loc, /obj/)) var/obj/location_as_object = loc diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index aa218c8193..27e8094127 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -323,7 +323,7 @@ id = "secretcatchem" results = list("secretcatchem" = 0.5) required_reagents = list("stable_plasma" = 0.1, "sugar" = 0.1, "cream" = 0.1, "blood" = 0.1, "slimejelly" = 0.1) - //required_catalysts = list("water" = 5) + required_catalysts = list("felinidmutationtoxin" = 1) required_temp = 600 mix_message = "the reaction gives off a meow!" mix_sound = "modular_citadel/sound/voice/merowr.ogg" @@ -359,11 +359,10 @@ HIonRelease += (rand(-25, 25)/100) RateUpLim += (rand(1, 1000)/100) PurityMin += (rand(-1, 1)/10) - var/additions = list("aluminum", "silver", "gold", "plasma", "silicon", "bluespace") + var/additions = list("aluminum", "silver", "gold", "plasma", "silicon", "bluespace", "uranium", "milk") //var/chosenA = pick(additions) - var/cataly = list ("felinidmutationtoxin", "uranium", "bluespace", "milk") required_reagents[pick(additions)] = rand(1, 5)//weird - required_catalysts = list("[pick(cataly)]" = 1) + //required_catalysts = list("[pick(cataly)]" = 1) /datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. message_admins("Someone found the hidden reaction. Amazing!! Please tell Fermis!!") @@ -391,7 +390,7 @@ if((mutation != current_species) && (purity >= 0.8))//ONLY if purity is high, and given the stuff is random. It's basically impossible to get this to 1. It already requires felind too, so no new functionality there. H.set_species(mutation) H.gender = FEMALE - //exception(al) handler, I said cat tail damnit! + //exception(al) handler: H.dna.features["mam_tail"] = "Cat" H.dna.features["tail_human"] = "Cat" H.dna.features["ears"] = "Cat" @@ -409,7 +408,6 @@ catto.name = H.name catto.desc = "A cute catto! They remind you of [H] somehow." catto.color = "#[H.dna.features["mcolor"]]" - //H.moveToNullspace() classic breaking Japes H.forceMove(locate(10,6,1))//To the zelda room. /datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 63327e1d85..5c39cd9db2 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -319,10 +319,3 @@ beaker.reagents.remove_reagent("sugar", amount) beaker.reagents.remove_reagent("moonshine", amount) beaker.reagents.add_reagent("moonsugar", amount*2) - /*Add later - if(beaker.reagents.has_reagent("synthflesh") && - var/amount = min(beaker.reagents.get_reagent_amount("synthflesh"), beaker.reagents.get_reagent_amount("whiskey")) - beaker.reagents.remove_reagent("sugar", amount) - beaker.reagents.remove_reagent("moonshine", amount) - beaker.reagents.add_reagent("meat", amount*2) - */ diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 40654ae60b..d7fc347728 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -131,8 +131,3 @@ rs += "[R.name], [R.volume]" return rs.Join(" | ") -/* MOVED TO CHEMICAL REACTION -//Handler for explosion reaction -/datum/reagents/proc/FermiExplode(turf/T, obj/O, mob/living/M, volume) - return -*/ diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index cc14e5ad95..03de151f94 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -292,9 +292,15 @@ dna.features["genitals_use_skintone"] = TRUE dna.species.use_skintones = TRUE return + if(MUTCOLORS) + if(fixed_mut_color) + genital_overlay.color = "#[fixed_mut_color]" + else + genital_overlay.color = "#[H.dna.features["mcolor"]]" + return //So people who haven't set stuff up don't get rainbow surprises. - //dna.features["cock_color"] = "#[dna.features["mcolor"]]" - //dna.features["breasts_color"] = "#[dna.features["mcolor"]]" + dna.features["cock_color"] = "#[dna.features["mcolor"]]" + dna.features["breasts_color"] = "#[dna.features["mcolor"]]" return /datum/species/proc/handle_genitals(mob/living/carbon/human/H)//more like handle sadness @@ -335,7 +341,7 @@ S = GLOB.vagina_shapes_list[G.shape] if(/obj/item/organ/genital/breasts) S = GLOB.breasts_shapes_list[G.shape] - aroused_state = 0//Breasts don't have aroused_states, there's literally no difference in the spite. + var/temp_aroused_state = 0//Breasts don't have aroused_states, there's literally no difference in the spite. When someone touched up/edits the code for their implementation, remove this and change temp_aroused_state to aroused_state //if(size == "huge") @@ -344,14 +350,14 @@ if(!S || S.icon_state == "none") continue var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer) - genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[aroused_state]_[layertext]" + genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[temp_aroused_state]_[layertext]" if(S.center) genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y) if(use_skintones && H.dna.features["genitals_use_skintone"]) genital_overlay.color = "#[skintone2hex(H.skin_tone)]" - genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]-s_[aroused_state]_[layertext]" + genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]-s_[temp_aroused_state]_[layertext]" else switch(S.color_src) if("cock_color") @@ -383,75 +389,3 @@ for(var/L in relevant_layers) H.apply_overlay(L) - -/* Behold the maddness I went through. This is here until the genetial problem is confirmed fixed. -/datum/species/proc/handle_breasts(mob/living/carbon/human/H) - //check for breasts first! - - var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") - if(!B) - return - message_admins("attempting to update sprite in a hacky way") - //obj/item/organ/genital/breasts/update_icon(/obj/item/organ/genital) //Where did this come from? - //Variables: - var/size = B.size - var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER) - var/datum/sprite_accessory/S = GLOB.breasts_shapes_list[B.shape] - var/list/standing = list() - - - //if(!S || S.icon_state == "none") - //return - - for(var/layer in relevant_layers) - var/layertext = genitals_layertext(layer) - S = GLOB.breasts_shapes_list[B.shape] - - message_admins("Attempting sprite calc: Bslot:[B.slot], B.shape:[B.shape], size:[size], Arouse:[B.aroused_state], layertxt:[layertext]") - - var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer) - - //If breasts are hueg (larger than 5 only have one sprite atm) - if (B.breast_values[size] > 5) - genital_overlay.icon_state = "[B.slot]_[B.shape]_[size]_0_[layertext]"//I haven't done around sizes above 5, I dunno how..! - else - genital_overlay.icon_state = "[B.slot]_[S.icon_state]_[size]_[B.aroused_state]_[layertext]" - - //center icon - if(S.center) - genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y) - - //Check skin colour - if(use_skintones && H.dna.features["genitals_use_skintone"]) - genital_overlay.color = "#[skintone2hex(H.skin_tone)]" - else - switch(S.color_src) - if("vag_color") - genital_overlay.color = "#[H.dna.features["vag_color"]]" - if(MUTCOLORS) - if(fixed_mut_color) - genital_overlay.color = "#[fixed_mut_color]" - else - genital_overlay.color = "#[H.dna.features["mcolor"]]" - if(MUTCOLORS2) - if(fixed_mut_color2) - genital_overlay.color = "#[fixed_mut_color2]" - else - genital_overlay.color = "#[H.dna.features["mcolor2"]]" - if(MUTCOLORS3) - if(fixed_mut_color3) - genital_overlay.color = "#[fixed_mut_color3]" - else - genital_overlay.color = "#[H.dna.features["mcolor3"]]" - - standing += genital_overlay - //Standing..? - if(LAZYLEN(standing)) - H.overlays_standing[layer] = standing.Copy() - standing = list() - - for(var/L in relevant_layers) - H.apply_overlay(L) - H.update_icons() - ///obj/item/organ/genital/breasts/update_icon(/obj/item/organ/genital) //Where did this come from? -*/ diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index fd23e1054e..8cb1560b98 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -48,12 +48,12 @@ size = 3 if(owner.has_status_effect(/datum/status_effect/chem/PElarger)) o.remove_status_effect(/datum/status_effect/chem/PElarger) - if(21 to 29) //If massive and due for large effects + if(21 to 34) //If massive and due for large effects length = cached_length size = 3 if(!owner.has_status_effect(/datum/status_effect/chem/PElarger)) o.apply_status_effect(/datum/status_effect/chem/PElarger) - if(30 to INFINITY) //If comical + if(35 to INFINITY) //If comical length = cached_length size = 4 //no new sprites for anything larger yet if(!owner.has_status_effect(/datum/status_effect/chem/PElarger)) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 742e446f10..cc5a2c9515 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1444,7 +1444,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y //Increases shock events. /datum/reagent/fermi/naninte_b_goneTox/on_mob_life(mob/living/carbon/C)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good) - if(prob(5)) + if(prob(15)) to_chat(C, "The residual voltage in your system causes you to seize up!") C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) if(prob(50)) @@ -1538,12 +1538,13 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y description = "You should be really careful with this...! Also, how did you get this?" data = "merge" color = "FFFFFF" - + +//I'm concerned this is too weak, but I also don't want deathmixes. /datum/reagent/fermi/fermiTox/on_mob_life(mob/living/carbon/C, method) if(C.dna && istype(C.dna.species, /datum/species/jelly)) - C.adjustToxLoss(-1) + C.adjustToxLoss(-2.5) else - C.adjustToxLoss(1) + C.adjustToxLoss(2.5) ..() /datum/reagent/fermi/fermiABuffer diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 7ed8af67c1..a37e55d87a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -40,15 +40,17 @@ message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].") var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case. var/datum/effect_system/smoke_spread/chem/s = new() - /*Endless loop hell + Endless loop hell for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents if (istype(reagent, /datum/reagent/fermi)) - my_atom.reagents.remove_reagent(reagent.id, 1000)//Prevent endless loops - continue //Don't allow fermichems into the mix (fermi explosions are handled elsewhere and it's a huge pain) + R.add_reagent(reagent.id, reagent.volume) + else if (istype(reagent, /datum/reagent/toxin/plasma)) + R.add_reagent(reagent.id, reagent.volume) //for !FUN! (am I doing this right?) + continue //Only allow fermichems into the mix (fermi explosions are handled elsewhere and it's a huge pain) //R.add_reagent(reagent, reagent.volume) if (reagent.purity < 0.6) ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 - */ + if(pH < 4) //if acidic, make acid spray //s.set_up(/datum/reagent/fermi/fermiAcid, (volume/3), pH*10, T) R.add_reagent("fermiAcid", ((volume/3)/pH)) From 7ab4cbeedcaabe9f2a7e2f86ab3e910ef8f7d60a Mon Sep 17 00:00:00 2001 From: Thalpy Date: Tue, 28 May 2019 18:42:39 +0100 Subject: [PATCH 168/608] Library pls --- modular_citadel/code/datums/status_effects/chems.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index ad631ea551..cfb46d5b5e 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -340,7 +340,7 @@ phase = 2 mental_capacity = 500 customTriggers = list() - to_chat(owner, "Your mind starts to heal, fixing the damage caused by the massive ammounts of chem injected into your system earlier, .") + to_chat(owner, "Your mind starts to heal, fixing the damage caused by the massive amounts of chem injected into your system earlier, returning clarity to your mind. Though, you still feel drawn towards [master]'s words...'") M.slurring = 0 M.confused = 0 resistGrowth = 0 From 4f28dbd7fc5c3d6dd0b1b78a797277dcd2fb61d3 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Tue, 28 May 2019 18:44:14 +0100 Subject: [PATCH 169/608] Lil clarification. --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index cc5a2c9515..e6da457a1d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1203,7 +1203,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y E.master = creator else E = M.has_status_effect(/datum/status_effect/chem/enthrall) - to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName].") + to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side at all costs.") M.slurring = 100 M.confused = 100 E.phase = 4 @@ -1538,7 +1538,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y description = "You should be really careful with this...! Also, how did you get this?" data = "merge" color = "FFFFFF" - + //I'm concerned this is too weak, but I also don't want deathmixes. /datum/reagent/fermi/fermiTox/on_mob_life(mob/living/carbon/C, method) if(C.dna && istype(C.dna.species, /datum/species/jelly)) From 48ae55d61d1ba2f80213c83e1fb4949af6a1508a Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 28 May 2019 19:25:31 +0100 Subject: [PATCH 170/608] Sishen implementation --- code/modules/surgery/organs/vocal_cords.dm | 2 +- .../code/modules/arousal/organs/genitals.dm | 6 +++--- .../organs/genitals_sprite_accessories.dm | 17 +++++++++++++++++ .../code/modules/arousal/organs/penis.dm | 4 ++-- .../icons/obj/genitals/breasts_onmob.dmi | Bin 3543 -> 3929 bytes modular_citadel/icons/obj/genitals/penis.dmi | Bin 2800 -> 4707 bytes .../icons/obj/genitals/penis_onmob.dmi | Bin 3880 -> 9804 bytes .../icons/obj/genitals/taur_penis_onmob.dmi | Bin 704 -> 1673 bytes .../icons/obj/genitals/vagina_onmob.dmi | Bin 939 -> 1203 bytes 9 files changed, 23 insertions(+), 6 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index a10990ce84..a12a6d5809 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -813,7 +813,7 @@ var/static/regex/objective_words = regex("new objective|obey this command|unable to resist|compulsed") var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die") var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") - var/static/regex/hallucinate_words = regex("trip balls|hallucinate") + var/static/regex/hallucinate_words = regex("get high|hallucinate") var/static/regex/hot_words = regex("heat|hot|hell") var/static/regex/cold_words = regex("cold|cool down|chill|freeze") var/static/regex/getup_words = regex("get up") diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 03de151f94..61bba76cc3 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -341,7 +341,7 @@ S = GLOB.vagina_shapes_list[G.shape] if(/obj/item/organ/genital/breasts) S = GLOB.breasts_shapes_list[G.shape] - var/temp_aroused_state = 0//Breasts don't have aroused_states, there's literally no difference in the spite. When someone touched up/edits the code for their implementation, remove this and change temp_aroused_state to aroused_state + //var/temp_aroused_state = 0//Breasts don't have aroused_states, there's literally no difference in the spite. When someone touched up/edits the code for their implementation, remove this and change temp_aroused_state to aroused_state //if(size == "huge") @@ -350,14 +350,14 @@ if(!S || S.icon_state == "none") continue var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer) - genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[temp_aroused_state]_[layertext]" + genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[aroused_state]_[layertext]" if(S.center) genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y) if(use_skintones && H.dna.features["genitals_use_skintone"]) genital_overlay.color = "#[skintone2hex(H.skin_tone)]" - genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]-s_[temp_aroused_state]_[layertext]" + genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]-s_[aroused_state]_[layertext]" else switch(S.color_src) if("cock_color") diff --git a/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm index e857c0d7ed..8ebe29b604 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm @@ -31,6 +31,19 @@ icon_state = "tapered" name = "Tapered" +/datum/sprite_accessory/penis/tentacle + icon_state = "tentacle" + name = "Tentacled" + +/datum/sprite_accessory/penis/hemi + icon_state = "hemi" + name = "Hemi" + +/datum/sprite_accessory/penis/hemiknot + icon_state = "hemiknot" + name = "Knotted Hemi" + + //////////////////////// // Taur cocks go here // //////////////////////// @@ -95,6 +108,10 @@ icon_state = "furred" name = "Furred" +/datum/sprite_accessory/vagina/gaping + icon_state = "gaping" + name = "Gaping" + //BREASTS BE HERE /datum/sprite_accessory/breasts icon = 'modular_citadel/icons/obj/genitals/breasts_onmob.dmi' diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 8cb1560b98..560e019196 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -48,12 +48,12 @@ size = 3 if(owner.has_status_effect(/datum/status_effect/chem/PElarger)) o.remove_status_effect(/datum/status_effect/chem/PElarger) - if(21 to 34) //If massive and due for large effects + if(21 to 35) //If massive and due for large effects length = cached_length size = 3 if(!owner.has_status_effect(/datum/status_effect/chem/PElarger)) o.apply_status_effect(/datum/status_effect/chem/PElarger) - if(35 to INFINITY) //If comical + if(36 to INFINITY) //If comical length = cached_length size = 4 //no new sprites for anything larger yet if(!owner.has_status_effect(/datum/status_effect/chem/PElarger)) diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi index c5bbbe3808eeb79cb02e3b24526697fcb11d0ffc..a5a9bad6938d9f582c22654aab0b33c0cb9e946b 100644 GIT binary patch literal 3929 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 HgC+eROJWij delta 2784 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 diff --git a/modular_citadel/icons/obj/genitals/penis_onmob.dmi b/modular_citadel/icons/obj/genitals/penis_onmob.dmi index 2457759b732edd537fa4ac5d22d8abc7c0b13073..416965415d3a20cfe2de644e1dd69634533303f0 100644 GIT binary patch literal 9804 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 literal 3880 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 diff --git a/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi b/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi index 3debbd0047228c869a639a16566445d46fcbf113..ae2339e2e0bd84400814bd62b29f58045746a76b 100644 GIT binary patch literal 1673 zcmXw43sh5A7JY;Qtu(|IYZ&V38=?RRh0FYVPSJrEn@4f40ynYw<<({i4X?u6Zl}5O_ z?MeuDZ5x}y-}dr!XD>XhckX8srDaT?VY@8e_*tPcHoQfpWAmdphjHiR89l49lC~4< zsAJLpEd4M#;h?kFFFowOpnXq3v~>;5U38EbR(`nMX~Ot!+V{;pg|Ji3;)&9t+PNBe zd!Rq|B6pGu;yH2mkYU zYyKyi?Z$OAcK2}AMHAV(ucnIngYS=wdm%SqwZ?>72%%*|Fy6C~WB0*0UmuzkcxQq( z;&ERPey;?T;hKv`6S*bpl+Q2b8yAM;Hd7Kr(p|pX%KRDEFtT7JYLv=keCad&A8O7B zjN-)K!`CP|73SE7@ZguS_%dSxKjMN%1Lw)8PW$p+-2sP$$5M&ok?s;X(sI{v&d=Fnc;nFdpGNMLy}PL3aceNC$yQgo-7Vk2GfmmoIogQ22f^U6iV z&E@ut&AQ1E=J_#pub(NFbZqJv;&A!6r61B{+>c_I#bYd0z26dCN|VMN9lk_!Oj);;oR zOu(52z4mW_b<07okjV+0-E*YAj^I><6v=IZq{xqY-WUvJnv^hATY!G&dQ!TXpOiA_=0rA&{UIim z7~?fYGS0*o89DHfNNpn^3fa_(IMzY5zT0gjThTv|#7Is@n&6?&g@n_a#4QfZr?Um@ zMvTkd?WU3H`tdZ8`L(@d8{bmzBYhoAz4A*k#H%|BdjBBabHlvYv%y`3^UzDldH=H< zJ)1CH4Q9=%Ew6`ySIlptsqges=NYTk*&ISeu?l3-Kki4+9Gy~XbJvc7?DoQXp+Kt4=btDTH}D1kg&>R(Mf#~tqQb;X3l!X z@#Q8_m5W7X-xM#NO>0$V7aWt|L$n-l&SV_;+O(Ljw(L|=FC0ePe5p-|NXmJt1KNp# zAe_YAe4QfFLrQId$Q<*3*qQa&S@S4xMKJ%O8dOcwJIusc&`C(Va1?ZVfPC&!S|K1D zctfxwS5#5&3XpFm7^uQYNV%BqVX&IOp^eP7kBM8w_$~#?8$n5hx(vpOi*tttx)GI}Tefz#$*k%~j9?DK|qk`qLrX**s>v>;u;i1G8 z0df8a=^D? Q*Z_c20m1$aC+PXV0<(+`6z6 z8x9R6Z)ecPavUhJ;BFRU={p)wBg9y3u(+V+hxTAps~Rz--k7{#UJ;ko@~DAK}@k-paGqfdBvjvPnci zRCt{2n?Y{EFc3w@Qj>KzK`N)o5xOW{ux3L}(?xrOc0o^BAt5zmeuh+uf}!uNh{ygJ zd%=8cV+H_lchv1&3#1p_-t@=h0#*NcuLWFl^BiQf&Vr|Rd}>`Gpu1{WDPTL*N@y)-i zKjUoRd%S-jw=niDuiRkx=f(sBOA7!1VE6+iFt0!8#OA))$|V;1 zgGSDwb4zpKd?AY-Ni&}>#14h?1pt5>qwMPgqsS|hi;cN|5bo}8S`(yAl!2d;HW)gu z0YLx&fMvOUc`y8a;$(j?=K8?o5zdv*4%&je(q!%ub1Q}BjeukTAW;zSx}OhpU1#ZF=uUvE%zYdZ?bgciZ>zYRitcCjgleaPU zs&Y5(V((_j)O{~kjm-1X7|2NaNijs%Ka&bQ$6hLL;r{yY_n&Dm$l56 z^t>?NhVP}hX-YuB#GBn0d@?L#ZpNPoV}HE8dHEmD=B}_1sW+y38rKS)Xm3dqIPmnW z9mglr4)K|DCpQ-51oFPPw0Ie#^NSm*%_Vuksf!PbWR+aAy3{?TXO}`K7Rclth z>(?*8{=Zs1;m@Zct+nU<4?eUtgLt9m;oZC0r+(gi^Ll#b^Yr`IE}uJp&)+8g+}f=t zBOD=0)`!H-|6lNZRVa}9XnXqjs@I?Q*QNd3VG{=wka%|aw>X1vdONGj94D~)J#jy; z-oN_v%Ah{mr~>?YAEvg|#l#STR1;?zng} zkx_8D09eW66?OX@O85Qy$#nJSr{~-u&rh3s013^t6E`+N%!pgL%WnSl@4;8U{(Mza zS-a0FK5qW{bIeH2I1qnzm9;=tqTRloRXgkxCzd5_%vgH7|MlzJu_Ey~QQJ=*HusO- z?)$p#Kr`EUpYVwI_?&Bd)pm>DzmxfwGpE1r`7lvn-~2FXNZ#A0F21XP#T5 z^^ebDo$Kx2ukYp0tGe>wezk(@>UU6YwQPCCH|5q+)^D$pqHDhXD7%|`>0SLD`FGpi z{(YtKk|FPUWZlM_Tm2><{`$3q=@R1+^8kr`d**n({v3SaUHzZ`Vi02(c$D<6h2Fns zcXs*HpA~GE)l-)ItYEq$F|$XM1r|O%$v>9w50Bp;zjyzFKfnII`pfxr%CQr$=;C>_ z#X|o2_4_S9XTR2|FO@7)Si63H%g;}o3^PokeG+EXF&DO$hN&#k4+Gig>FVdQ&MBb@ E0FF6DcmMzZ literal 939 zcmV;c162HpP){n(v1Tq;Nalz@9)ga%;m<*+O)Fj+1&Z=@@M%DXaE2J0d!JM zQvg8b*k%9#0PlKKSad{Xb7OL8aCB*JZU6vyoUN2k3xY5h#?S6k482yU{ke4sD>`Hl z-Q}fC9q5W}8Giew9xNnbD|UI`!Sn3*?ius&X1hPcI659sMTKNHj@NiG^O5spMCH1f zhsen(%W~B^^Hlim3gUtHu6CS>D+oK!$bn>zR^3&vzCy-N$I zbs74TWxK-3kRgLRS7)h#q%pHJWaPdCuMyq!wx`%5tU3;+NC000fV`uo#XTA%;=<-erya34Qp z@!!8?@o%#5d;_n;^?kn(000000FN&&ucs5F@s~fs35LcA{7g3h000000FSSAe;{sf zr2T=5#_|5O>EgM9H0Blr0001Zh>N(on^vb&zkh`j?8huVt?$RL-=`Z$uVCEZ00000 z0APXA`h3`*7~=j!TAxqj_lGRL^&c<{yYd7aZap{) Date: Tue, 28 May 2019 22:33:04 +0100 Subject: [PATCH 171/608] Last round of test checks. --- .../mob/living/simple_animal/friendly/cat.dm | 2 +- .../code/modules/arousal/organs/genitals.dm | 14 +++++++----- .../chemistry/reagents/fermi_reagents.dm | 20 +++++++++-------- .../reagents/chemistry/recipes/fermi.dm | 22 +++++++++---------- .../modules/reagents/objects/fermiclothes.dm | 2 +- 5 files changed, 32 insertions(+), 28 deletions(-) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 27e8094127..74780393b8 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -350,7 +350,7 @@ OptimalTempMin += rand(-100, 100) OptimalTempMax = (OptimalTempMin+rand(0, 200)) ExplodeTemp = (OptimalTempMax+rand(0, 200)) - OptimalpHMin += rand(1, 10 + OptimalpHMin += rand(1, 10) OptimalpHMax = (OptimalpHMin + rand(1, 5)) ReactpHLim += rand(-2, 2) CurveSharpT += (rand(1, 500)/100) diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 61bba76cc3..3fce3cacd0 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -211,7 +211,8 @@ B.color = "#[dna.features["breasts_color"]]" B.size = dna.features["breasts_size"] B.prev_size = B.size - B.cached_size = B.breast_values[B.size] + if (!B.size == "huge") + B.cached_size = B.breast_values[B.size] B.shape = dna.features["breasts_shape"] B.fluid_id = dna.features["breasts_fluid"] B.update() @@ -293,11 +294,10 @@ dna.species.use_skintones = TRUE return if(MUTCOLORS) - if(fixed_mut_color) - genital_overlay.color = "#[fixed_mut_color]" - else - genital_overlay.color = "#[H.dna.features["mcolor"]]" - return + if(src.dna.species.fixed_mut_color) + dna.features["cock_color"] = "#[src.dna.species.fixed_mut_color]" + dna.features["breasts_color"] = "#[src.dna.species.fixed_mut_color]" + return //So people who haven't set stuff up don't get rainbow surprises. dna.features["cock_color"] = "#[dna.features["mcolor"]]" dna.features["breasts_color"] = "#[dna.features["mcolor"]]" @@ -367,6 +367,7 @@ if("vag_color") genital_overlay.color = "#[H.dna.features["vag_color"]]" //This was removed for some reason, but it breaks my code, so now it's back!! Tadahhh. + /* if(MUTCOLORS) if(fixed_mut_color) genital_overlay.color = "#[fixed_mut_color]" @@ -382,6 +383,7 @@ genital_overlay.color = "#[fixed_mut_color3]" else genital_overlay.color = "#[H.dna.features["mcolor3"]]" + */ standing += genital_overlay if(LAZYLEN(standing)) H.overlays_standing[layer] = standing.Copy() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index e6da457a1d..9cf2c1fa1b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -370,7 +370,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Really hacky way to deal with this stupid problem I have, and heal the clone. I think around 30u will make a healthy clone. SM.reagents.add_reagent("SDGFheal", volume) - M.reagents.remove_reagent(src.id, 999) + M.reagents.remove_reagent(src.id, src.vol) //Give the new clone an idea of their character //SHOULD print last 5 messages said by the original to the clones chatbox @@ -552,7 +552,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING S.real_name = "Living teratoma"//horrifying!! S.rabid = 1//Make them an angery boi //S.updateappearance(mutcolor_update=1) - M.reagents.remove_reagent(src.id, 20) + M.reagents.remove_reagent(src.id, src.volume) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. TODO: turn tumour slime into real variant. M.adjustToxLoss(1, 0) @@ -847,7 +847,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason //M.alpha = 255//Reset addiction //antiGenetics = 255// DOesn't work for some reason? switch(current_cycle) - if(0)//Require a minimum + if(2)//Require a minimum origin = M if (G == null) G = new(get_turf(M.loc)) @@ -869,7 +869,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason if(prob(50)) to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") do_teleport(G, M.loc) - M.reagents.remove_reagent(src.id, current_cycle-1, FALSE) + M.reagents.remove_reagent(src.id, current_cycle/2, FALSE) ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) @@ -885,7 +885,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason if(M.reagents.has_reagent("astral")) antiGenetics = 255//Doesn't reset when you take more, which is weird for me, it should. M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them. - if(prob(60)) + if(prob(65)) M.alpha-- antiGenetics-- switch(antiGenetics) @@ -1369,7 +1369,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO T.Remove(M) nT.Insert(M) - qdel(T) + T.forceMove(locate(10,6,1))//To the zelda room. + to_chat(M, "Youw tongue feews... weally fwuffy!!") if(22 to INFINITY) if(prob(10)) to_chat(M, "You find yourself unable to supress the desire to meow!") @@ -1387,9 +1388,10 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y ..() /datum/reagent/fermi/furranium/on_mob_delete(mob/living/carbon/M) - if(purity <= 0.9)//Only permanent if you're a good chemist. + if(purity < 0.9)//Only permanent if you're a good chemist. nT = M.getorganslot(ORGAN_SLOT_TONGUE) nT.Remove(M) + qdel(nT) T.Insert(M) to_chat(M, "You feel your tongue.... unfluffify...?") M.say("Pleh!") @@ -1533,9 +1535,9 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y holder.clear_reagents() /datum/reagent/fermi/fermiTox - name = ""//defined on setup + name = "FermiTox"//defined on setup id = "fermiTox" - description = "You should be really careful with this...! Also, how did you get this?" + description = "You should be really careful with this...! Also, how did you get this? You shouldn't have this!" data = "merge" color = "FFFFFF" diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index a37e55d87a..00b26f90a9 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -40,7 +40,7 @@ message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].") var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case. var/datum/effect_system/smoke_spread/chem/s = new() - Endless loop hell + //Endless loop hell? for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents if (istype(reagent, /datum/reagent/fermi)) R.add_reagent(reagent.id, reagent.volume) @@ -219,8 +219,8 @@ CurveSharpT = 1 CurveSharppH = 1 ThermicConstant = 25 - HIonRelease = -0.5 - RateUpLim = 20 + HIonRelease = 1 + RateUpLim = 15 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.25 // explode purity! @@ -244,8 +244,8 @@ //CatalystFact = 0 CurveSharpT = 0.5 CurveSharppH = 4 - ThermicConstant = 10 - HIonRelease = -0.1 + ThermicConstant = 15 + HIonRelease = 0.1 RateUpLim = 1 FermiChem = TRUE FermiExplode = TRUE @@ -301,7 +301,7 @@ CurveSharppH = 0.5 ThermicConstant = -2 HIonRelease = -0.05 - RateUpLim = 5 + RateUpLim = 2 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.5 @@ -318,7 +318,7 @@ name = "Furranium" id = "furranium" results = list("furranium" = 0.5) - required_reagents = list("aphro" = 1, "moonsugar" = 1, "silver" = 2, "salglu_solution" = 1) + required_reagents = list("aphro" = 0.1, "moonsugar" = 0.1, "silver" = 0.2, "salglu_solution" = 0.1) //mix_message = "" //FermiChem vars: OptimalTempMin = 350 @@ -332,7 +332,7 @@ CurveSharppH = 0.5 ThermicConstant = -10 HIonRelease = -0.1 - RateUpLim = 10 + RateUpLim = 2 FermiChem = TRUE PurityMin = 0.30 @@ -343,8 +343,8 @@ /datum/chemical_reaction/fermi/naninte_b_gone//done test name = "Naninte bain" id = "naninte_b_gone" - results = list("naninte_b_gone" = 20) - required_reagents = list("synthflesh" = 5, "uranium" = 5, "iron" = 5, "salglu_solution" = 5) + results = list("naninte_b_gone" = 4) + required_reagents = list("synthflesh" = 1, "uranium" = 1, "iron" = 1, "salglu_solution" = 1) mix_message = "the reaction gurgles, encapsulating the reagents in flesh before the emp can be set off." required_temp = 499//To force fermireactions before EMP. //FermiChem vars: @@ -359,7 +359,7 @@ CurveSharppH = 1 ThermicConstant = 5 HIonRelease = 0.01 - RateUpLim = 2 + RateUpLim = 1 FermiChem = TRUE PurityMin = 0.15 diff --git a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm b/modular_citadel/code/modules/reagents/objects/fermiclothes.dm index 2c0df581c4..9e3852eff3 100644 --- a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm +++ b/modular_citadel/code/modules/reagents/objects/fermiclothes.dm @@ -7,7 +7,7 @@ icon_state = "cowboy" desc = "A sythesized hat, you can't seem to take it off. And tips their hat." armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - item_flags = NODROP //Tips their hat! + //item_flags = NODROP //Tips their hat! /* /obj/item/clothing/head/hattip/equipped(mob/living/carbon/human/user, slot) From 12eb5e9b1791fb2fa8e32603ef714c584e879090 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 28 May 2019 23:35:50 +0100 Subject: [PATCH 172/608] ARGH --- .../code/datums/status_effects/chems.dm | 4 +-- .../code/modules/arousal/organs/breasts.dm | 10 ++---- .../code/modules/arousal/organs/genitals.dm | 15 +++++--- .../chemistry/reagents/fermi_reagents.dm | 36 ++++--------------- 4 files changed, 22 insertions(+), 43 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index cfb46d5b5e..f235851686 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -82,7 +82,7 @@ to_chat(owner, "Your enormous breasts are way too large to fit anything over them!") if (B.size == "huge") if(prob(2)) - to_chat(H, "Your back is feeling a little sore.") + to_chat(owner, "Your back is feeling a little sore.") var/target = o.get_bodypart(BODY_ZONE_CHEST) o.apply_damage(0.1, BRUTE, target) if(!B.cached_size == B.breast_values[B.prev_size]) @@ -104,7 +104,7 @@ if (!(B.breast_sizes[B.prev_size] == B.size)) to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!") if(prob(5)) - to_chat(H, "Your back is feeling a little sore.") + to_chat(owner, "Your back is feeling a little sore.") ..() /datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 4d1793fb25..6d1a49a66b 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -6,8 +6,8 @@ zone = "chest" slot = "breasts" w_class = 3 - size = BREASTS_SIZE_DEF //SHOULD BE A LETTER, starts as a number...??? - var/cached_size = null//for enlargement SHOULD BE A NUMBER + size = "c" //SHOULD BE A LETTER, starts as a number...??? + var/cached_size = BREASTS_SIZE_DEF //for enlargement SHOULD BE A NUMBER var/prev_size //For flavour texts SHOULD BE A LETTER var/breast_sizes = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "flat") var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0) @@ -24,12 +24,6 @@ /obj/item/organ/genital/breasts/Initialize() . = ..() reagents.add_reagent(fluid_id, fluid_max_volume) - //prev_size = size - //cached_size = breast_values[size] - /* This breaks the character creation sceen. for some reason sizes are set to numbers there. - if (cached_size == "c")//fix for a weird bug that has something to do with how they're set up on the character create screen. - cached_size = 3 - */ /obj/item/organ/genital/breasts/on_life() if(QDELETED(src)) diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 3fce3cacd0..45cfb6303e 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -211,8 +211,12 @@ B.color = "#[dna.features["breasts_color"]]" B.size = dna.features["breasts_size"] B.prev_size = B.size + message_admins("B.size[B.size]") if (!B.size == "huge") - B.cached_size = B.breast_values[B.size] + if(isnum(B.size)) + B.cached_size = B.size + else + B.cached_size = B.breast_values[B.size] B.shape = dna.features["breasts_shape"] B.fluid_id = dna.features["breasts_fluid"] B.update() @@ -288,11 +292,15 @@ for(var/obj/item/organ/O in internal_organs) if(istype(O, /obj/item/organ/genital)) organCheck = TRUE + if(/obj/item/organ/genital/penis) + if(!dna.features["has_cock"] == 1) + dna.features["has_cock"] = 1//Goddamnit get in there. if (organCheck == FALSE) if(ishuman(src) && dna.species.id == "human") dna.features["genitals_use_skintone"] = TRUE dna.species.use_skintones = TRUE - return + + /* I can't get this to work. if(MUTCOLORS) if(src.dna.species.fixed_mut_color) dna.features["cock_color"] = "#[src.dna.species.fixed_mut_color]" @@ -301,6 +309,7 @@ //So people who haven't set stuff up don't get rainbow surprises. dna.features["cock_color"] = "#[dna.features["mcolor"]]" dna.features["breasts_color"] = "#[dna.features["mcolor"]]" + */ return /datum/species/proc/handle_genitals(mob/living/carbon/human/H)//more like handle sadness @@ -341,8 +350,6 @@ S = GLOB.vagina_shapes_list[G.shape] if(/obj/item/organ/genital/breasts) S = GLOB.breasts_shapes_list[G.shape] - //var/temp_aroused_state = 0//Breasts don't have aroused_states, there's literally no difference in the spite. When someone touched up/edits the code for their implementation, remove this and change temp_aroused_state to aroused_state - //if(size == "huge") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 9cf2c1fa1b..3950297212 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -136,7 +136,6 @@ if(purity > 0.75) //Teleports you home if it's pure enough do_sparks(5,FALSE,M) do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg') - //M.forceMove(location_created) //Teleports to creation location do_sparks(5,FALSE,M) if(prob(20)) do_sparks(5,FALSE,M) @@ -330,12 +329,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(LAZYLEN(candies) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! message_admins("Ghost candidate found! [candies] is becoming a clone of [M]! Hee~!! Exciting!!") to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") - //var/typepath = owner.type - //clone = new typepath(owner.loc) var/typepath = M.type var/mob/living/carbon/human/fermi_Gclone = new typepath(M.loc) - //var/mob/living/carbon/SM = owner - //var/mob/living/carbon/M = M var/mob/living/carbon/human/SM = fermi_Gclone if(istype(SM) && istype(M)) SM.real_name = M.real_name @@ -352,7 +347,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ZI.Remove(M) ZI.Insert(SM) - //SM.sentience_act() to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") @@ -370,7 +364,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Really hacky way to deal with this stupid problem I have, and heal the clone. I think around 30u will make a healthy clone. SM.reagents.add_reagent("SDGFheal", volume) - M.reagents.remove_reagent(src.id, src.vol) + M.reagents.remove_reagent(src.id, src.volume) //Give the new clone an idea of their character //SHOULD print last 5 messages said by the original to the clones chatbox @@ -387,8 +381,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING return //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? - //after_success(user, SM) - //qdel(src) else if(src.playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). src.unitCheck = TRUE @@ -458,17 +450,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.next_move_modifier = 1 if (M.nutrition < 1500) M.nutrition += 500 -//If the reaction explodes -/* -/datum/reagent/fermi/SDGF/FermiExplode(turf/open/T)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies - //var/mob/living/simple_animal/slime/S = new(get_turf(location_created),"grey") - var/mob/living/simple_animal/slime/S = new(T,"grey")//should work, in theory - S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)//I dunno how slimes work cause fire is burny - S.name = "Living teratoma" - S.real_name = "Living teratoma"//horrifying!! - S.rabid = 1//Make them an angery boi, grr grr - to_chat("The cells clump up into a horrifying tumour.") -*/ //Unobtainable, used in clone spawn. /datum/reagent/fermi/SDGFheal @@ -527,7 +508,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI if(75 to 85) M.adjustToxLoss(1, 0)// the warning! - if(86) + if(86)//mean clone time! if (!M.reagents.has_reagent("pen_acid"))//Counterplay is pent.) message_admins("(non-infectious) Zombie spawned at [M.loc], produced by impure chem, wah!") M.nutrition = startHunger - 500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE @@ -541,7 +522,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name ZI.desc = "[M]'s clone, gone horribly wrong." - //ZI.updateappearance(mutcolor_update=1) + M.reagents.remove_reagent(src.id, 20) else//easier to deal with to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour!") @@ -622,7 +603,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) B.prev_size = B.size B.cached_size = sizeConv[B.size] - //message_admins("init B size: [B.size], prev: [B.prev_size], cache = [B.cached_size], raw: [sizeConv[B.size]]") //if this runtimes it's cause someone's breasts are too big! /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size if(!ishuman(M))//Just in case @@ -718,7 +698,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth InverseChemVal = 0.3 InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse - //var/mob/living/carbon/human/H /datum/reagent/fermi/PElarger/on_mob_add(mob/living/carbon/M) . = ..() @@ -841,13 +820,12 @@ Buginess level: works as intended - except teleport makes sparks for some reason var/antiGenetics = 255 var/sleepytime = 0 InverseChemVal = 0.25 - //var/Svol = volume /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! - //M.alpha = 255//Reset addiction - //antiGenetics = 255// DOesn't work for some reason? + M.alpha = 255//Reset addiction + antiGenetics = 255// DOesn't work for some reason? switch(current_cycle) - if(2)//Require a minimum + if(0)//Require a minimum origin = M if (G == null) G = new(get_turf(M.loc)) @@ -869,7 +847,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason if(prob(50)) to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") do_teleport(G, M.loc) - M.reagents.remove_reagent(src.id, current_cycle/2, FALSE) + M.reagents.remove_reagent(src.id, current_cycle-1, FALSE) ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) From 543dc9a399e63eb9b8668b5dfa217e8468caa01f Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 01:33:07 +0100 Subject: [PATCH 173/608] Final fixes, finally fixed all problems. --- code/modules/surgery/organs/vocal_cords.dm | 9 ++-- .../code/datums/status_effects/chems.dm | 51 +++++++------------ .../code/modules/arousal/organs/breasts.dm | 9 ++-- .../code/modules/arousal/organs/genitals.dm | 35 +++++++------ .../chemistry/reagents/fermi_reagents.dm | 6 +-- 5 files changed, 49 insertions(+), 61 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index a12a6d5809..01e03bc8b8 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -784,8 +784,8 @@ //Mixables var/static/regex/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara") //enthral_words works - var/static/regex/reward_words = regex("good boy|good girl|good pet") //reward_words works - var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") ////punish_words works + var/static/regex/reward_words = regex("good boy|good girl|good pet|good job") //reward_words works + var/static/regex/punish_words = regex("bad boy|bad girl|bad pet|bad job") ////punish_words works //phase 0 var/static/regex/saymyname_words = regex("say my name|who am i|whoami") //works I think var/static/regex/wakeup_words = regex("revert|awaken|snap") //works @@ -801,8 +801,8 @@ var/static/regex/nya_words = regex("nya|meow|mewl") var/static/regex/sleep_words = regex("sleep|slumber|rest") var/static/regex/strip_words = regex("strip|derobe|nude") - var/static/regex/walk_words = regex("slow down") - var/static/regex/run_words = regex("run") + var/static/regex/walk_words = regex("slow down|walk") + var/static/regex/run_words = regex("run|speed up") var/static/regex/liedown_words = regex("lie down") //TO ADD var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown|kneel") //phase 3 @@ -951,7 +951,6 @@ var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) E.status = "Antiresist" - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've let [E.enthrallGender] down..."), 5) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "Your mind clouds over, as you find yourself unable to resist!"), 5) E.statusStrength = (1 * power_multiplier * E.phase) E.cooldown += 15//Too short? yes, made 15 diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index f235851686..443633791b 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -98,12 +98,13 @@ if((B.cached_size) < 16) switch(round(B.cached_size)) if(9) - if (!(B.breast_sizes[B.prev_size] == B.size)) + if (B.breast_sizes[B.prev_size] != B.breast_sizes[B.size]) to_chat(o, "Your expansive chest has become a more managable size, liberating your movements.") if(10 to INFINITY) - if (!(B.breast_sizes[B.prev_size] == B.size)) + if (B.breast_sizes[B.prev_size] != B.breast_sizes[B.size]) to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!") if(prob(5)) + to_chat(owner, "Your back is feeling a little sore.") ..() @@ -126,7 +127,6 @@ var/moveCalc /datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. - message_admins("PElarge started!") var/mob/living/carbon/human/o = owner var/items = o.get_contents() if(o.w_uniform || o.wear_suit) @@ -144,7 +144,7 @@ /datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/penis/P = o.getorganslot("penis") - moveCalc = 1+((round(P.length) - 21)/10) //effects how fast you can move + moveCalc = 1+((round(P.length) - 21)/5) //effects how fast you can move bloodCalc = 1+((round(P.length) - 21)/10) //effects how much blood you need (I didn' bother adding an arousal check because I'm spending too much time on this organ already.) if(!P) o.remove_movespeed_modifier("hugedick") @@ -298,6 +298,8 @@ else if (resistanceTally > 150) phase = -1 to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") + if(DistApart < 10) + to_chat(master, "[(H.lewd?"Your pet":"Your thrall")] seems to have broken free of your enthrallment!") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) if(owner.lewd) @@ -503,10 +505,11 @@ cooldown -= (0.8 + (mental_capacity/500)) cooldownMsg = FALSE else if (cooldownMsg == FALSE) - if(master.lewd) - to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") - else - to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") + if(DistApart < 10) + if(master.lewd) + to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") + else + to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") cooldownMsg = TRUE cooldown = 0 if (tranceTime > 0) //custom trances only last 50 ticks. @@ -653,7 +656,7 @@ deltaResist += 0.1 //Though I commend your spamming efforts. return else - deltaResist = 1.75 + resistGrowth + deltaResist = 1.7 + resistGrowth resistGrowth += 0.05 //distance modifer @@ -692,24 +695,23 @@ //Antag resistance //cultists are already brainwashed by their god if(iscultist(owner)) - deltaResist *= 1.5 + deltaResist *= 1.3 else if (is_servant_of_ratvar(owner)) - deltaResist *= 1.5 + deltaResist *= 1.3 //antags should be able to resist, so they can do their other objectives. This chem does frustrate them, but they've all the tools to break free when an oportunity presents itself. else if (owner.mind.assigned_role in GLOB.antagonists) - deltaResist *= 1.4 + deltaResist *= 1.2 //role resistance //Chaplains are already brainwashed by their god if(owner.mind.assigned_role == "Chaplain") - deltaResist *= 1.5 + deltaResist *= 1.2 //Command staff has authority, if(owner.mind.assigned_role in GLOB.command_positions) - deltaResist *= 1.4 - //if(owner.has_status == "sub"); power_multiplier *= 0.8 //for skylar //I'm kidding <3 + deltaResist *= 1.1 //Chemists should be familiar with drug effects if(owner.mind.assigned_role == "Chemist") - deltaResist *= 1.3 + deltaResist *= 1.2 //Happiness resistance //Your Thralls are like pets, you need to keep them happy. @@ -727,22 +729,5 @@ if(M.has_trait(TRAIT_MINDSHIELD)) deltaResist += 5//even faster! - /* - if (deltaResist>0)//just in case - deltaResist /= phase//later phases require more resistance - */ message_admins("Enthrall processing for [M]: enthrallTally: [enthrallTally], resistanceTally: [resistanceTally], delta: [deltaResist]") return - -//I think this can be left out, but I'll leave the code incase anyone wants to add to it. -/* -/datum/status_effect/chem/enthrall/proc/owner_say(mob/speaker, message) //I can only hope this works - - //var/datum/status_effect/chem/enthrall/E = owner.has_status_effect(/datum/status_effect/chem/enthrall) - //var/mob/living/master = E.master - message_admins("[owner] said something") - var/static/regex/owner_words = regex("[master]") - if(findtext(message, owner_words)) - message = replacetext(lowertext(message), lowertext(master), "[enthrallGender]") - return message -*/ diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 6d1a49a66b..27a2d720bf 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -6,8 +6,8 @@ zone = "chest" slot = "breasts" w_class = 3 - size = "c" //SHOULD BE A LETTER, starts as a number...??? - var/cached_size = BREASTS_SIZE_DEF //for enlargement SHOULD BE A NUMBER + size = BREASTS_SIZE_DEF //SHOULD BE A LETTER, starts as a number...??? + var/cached_size = null //for enlargement SHOULD BE A NUMBER var/prev_size //For flavour texts SHOULD BE A LETTER var/breast_sizes = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "flat") var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0) @@ -78,15 +78,14 @@ //Allows breasts to grow and change size, with sprite changes too. //maximum wah //Comical sizes slow you down in movement and actions. -//Rediculous sizes makes you more cumberson. -//Should I turn someone with meter wide... assets into a blob? +//Rediculous sizes makes you more cumbersome. //this is far too lewd wah /obj/item/organ/genital/breasts/update_size()//wah if(!ishuman(owner) || !owner) return - if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!(Why does this runtime??) - fixed + if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!fixed to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") src.Remove(owner) switch(round(cached_size)) diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 45cfb6303e..f63adf3962 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -1,6 +1,6 @@ /obj/item/organ/genital color = "#fcccb3" - var/shape = "human" + var/shape = "Human" //Changed to be uppercase, let me know if this breaks everything..!! var/sensitivity = 1 var/list/genital_flags = list() var/can_masturbate_with = FALSE @@ -210,13 +210,20 @@ else B.color = "#[dna.features["breasts_color"]]" B.size = dna.features["breasts_size"] - B.prev_size = B.size - message_admins("B.size[B.size]") - if (!B.size == "huge") - if(isnum(B.size)) - B.cached_size = B.size + if(!isnum(B.size)) + if(B.size == "flat") + B.cached_size = 0 + B.prev_size = 0 + else if (B.cached_size == "huge") + B.prev_size = "huge" + message_admins("I hate genitals, this should not appear. I'm so mad.") else B.cached_size = B.breast_values[B.size] + B.prev_size = B.size + else + B.cached_size = B.size + B.prev_size = B.size + message_admins("B.size [B.size], Cache [B.cached_size], prev [B.prev_size]") B.shape = dna.features["breasts_shape"] B.fluid_id = dna.features["breasts_fluid"] B.update() @@ -293,23 +300,21 @@ if(istype(O, /obj/item/organ/genital)) organCheck = TRUE if(/obj/item/organ/genital/penis) - if(!dna.features["has_cock"] == 1) - dna.features["has_cock"] = 1//Goddamnit get in there. + dna.features["has_cock"] = TRUE + if(/obj/item/organ/genital/breasts) + dna.features["has_breasts"] = TRUE//Goddamnit get in there. if (organCheck == FALSE) if(ishuman(src) && dna.species.id == "human") dna.features["genitals_use_skintone"] = TRUE dna.species.use_skintones = TRUE - - /* I can't get this to work. if(MUTCOLORS) if(src.dna.species.fixed_mut_color) - dna.features["cock_color"] = "#[src.dna.species.fixed_mut_color]" - dna.features["breasts_color"] = "#[src.dna.species.fixed_mut_color]" + dna.features["cock_color"] = "[src.dna.species.fixed_mut_color]" + dna.features["breasts_color"] = "[src.dna.species.fixed_mut_color]" return //So people who haven't set stuff up don't get rainbow surprises. - dna.features["cock_color"] = "#[dna.features["mcolor"]]" - dna.features["breasts_color"] = "#[dna.features["mcolor"]]" - */ + dna.features["cock_color"] = "[dna.features["mcolor"]]" + dna.features["breasts_color"] = "[dna.features["mcolor"]]" return /datum/species/proc/handle_genitals(mob/living/carbon/human/H)//more like handle sadness diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 3950297212..6ff655c8c5 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -597,7 +597,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING H.genital_override = TRUE var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") if(!B) - H.emergent_genital_call() return if(!B.size == "huge") var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) @@ -612,6 +611,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(!B) //If they don't have breasts, give them breasts. var/obj/item/organ/genital/breasts/nB = new nB.Insert(M) + H.emergent_genital_call() if(nB) if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) nB.color = skintone2hex(H.skin_tone) @@ -719,7 +719,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING H.genital_override = TRUE var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) - H.emergent_genital_call() return P.prev_size = P.length P.cached_length = P.length @@ -732,6 +731,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(!P)//They do have a preponderance for escapism, or so I've heard. var/obj/item/organ/genital/penis/nP = new nP.Insert(M) + H.emergent_genital_call() if(nP) nP.length = 1 to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.")//OwO @@ -1038,7 +1038,7 @@ Okay, seriously, unless you're an antag, it will be difficult to enthrall people If it becomes an issue, I'll make all pets pacifists and apply more weakness effects based on mood and state. I'll probably do this anyways as I want the bond between the two to be imperative. As stated earlier the biggest concern is the use as a murder aid, which I have ideas for. (weaken the enthraller during the enthrallment process?) -And as stated earlier, this chem is hard to make, and is punishing on failure. You fall in love with the chem dispencer and have to stay within 8 tiles of it. Additionally, you hug the dispencer instead of using it - thus making you unable to continue chemistry for that round, and likely getting the CMO mad as hecc at you. +And as stated earlier, this chem is hard to make, and is punishing on failure. You fall in love with someone if it's impure, and then your piorities change. (thats not written yet but thats the idea.) */ From 331c2887eaad89cf393ca5b66bbab780b11db2af Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 01:41:30 +0100 Subject: [PATCH 174/608] Small recipie changes. --- modular_citadel/code/datums/status_effects/chems.dm | 5 ++--- .../code/modules/reagents/chemistry/recipes/fermi.dm | 7 +++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 443633791b..6b0e4fb318 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -81,7 +81,7 @@ playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) to_chat(owner, "Your enormous breasts are way too large to fit anything over them!") if (B.size == "huge") - if(prob(2)) + if(prob(1)) to_chat(owner, "Your back is feeling a little sore.") var/target = o.get_bodypart(BODY_ZONE_CHEST) o.apply_damage(0.1, BRUTE, target) @@ -103,8 +103,7 @@ if(10 to INFINITY) if (B.breast_sizes[B.prev_size] != B.breast_sizes[B.size]) to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!") - if(prob(5)) - + if(prob(2)) to_chat(owner, "Your back is feeling a little sore.") ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 00b26f90a9..a7a69e2025 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -46,8 +46,7 @@ R.add_reagent(reagent.id, reagent.volume) else if (istype(reagent, /datum/reagent/toxin/plasma)) R.add_reagent(reagent.id, reagent.volume) //for !FUN! (am I doing this right?) - continue //Only allow fermichems into the mix (fermi explosions are handled elsewhere and it's a huge pain) - //R.add_reagent(reagent, reagent.volume) + continue //Only allow fermichems into the mix (specific fermi explosions are handled elsewhere) if (reagent.purity < 0.6) ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 @@ -106,7 +105,7 @@ name = "Synthetic-derived growth factor" id = "SDGF" results = list("SDGF" = 0.3) - required_reagents = list("stable_plasma" = 0.5, "slimejelly" = 0.5, "synthflesh" = 0.1, "blood" = 0.1) + required_reagents = list("stable_plasma" = 0.5, "slimejelly" = 0.5, "uranium" = 0.5, "synthflesh" = 0.5, "blood" = 0.5) mix_message = "the reaction gives off a blorble!" //FermiChem vars: OptimalTempMin = 600 // Lower area of bell curve for determining heat based rate reactions @@ -207,7 +206,7 @@ name = "Astrogen" id = "astral" results = list("astral" = 0.5) - required_reagents = list("eigenstate" = 0.1, "plasma" = 0.1, "synaptizine" = 0.1, "aluminium" = 0.5) + required_reagents = list("eigenstate" = 0.1, "plasma" = 0.3, "synaptizine" = 0.1, "aluminium" = 0.5) //FermiChem vars: OptimalTempMin = 700 OptimalTempMax = 800 From db3369ab4311606d260ef955c83056a43655e97a Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 01:51:07 +0100 Subject: [PATCH 175/608] Scrubbing messages and cleaning code. --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 7 ++----- .../code/modules/reagents/chemistry/recipes/fermi.dm | 6 +++--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 6ff655c8c5..48c728963c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1039,11 +1039,8 @@ If it becomes an issue, I'll make all pets pacifists and apply more weakness eff As stated earlier the biggest concern is the use as a murder aid, which I have ideas for. (weaken the enthraller during the enthrallment process?) And as stated earlier, this chem is hard to make, and is punishing on failure. You fall in love with someone if it's impure, and then your piorities change. -(thats not written yet but thats the idea.) */ -//TODO rewrite code so that the low purity stuff is a seperate chem for clarity. - /datum/reagent/fermi/enthrall name = "MKUltra" id = "enthrall" @@ -1121,7 +1118,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y return var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers for(var/victim in seen) - if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (!M.client)) + if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (!M.client) || (M.stat == DEAD)) seen = seen - victim if(!seen) return @@ -1207,7 +1204,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(!M.has_status_effect(STATUS_EFFECT_INLOVE)) var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers for(var/victim in seen) - if((victim == /mob/living/simple_animal/pet/) || (victim == M)) + if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (M.stat == DEAD)) seen = seen - victim if(seen.len == 0) return diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index a7a69e2025..1f86c613bd 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -290,7 +290,7 @@ //mix_message = "" //FermiChem vars: OptimalTempMin = 500 - OptimalTempMax = 650 + OptimalTempMax = 700 ExplodeTemp = 750 OptimalpHMin = 2 OptimalpHMax = 5 @@ -299,7 +299,7 @@ CurveSharpT = 8 CurveSharppH = 0.5 ThermicConstant = -2 - HIonRelease = -0.05 + HIonRelease = -0.5 RateUpLim = 2 FermiChem = TRUE FermiExplode = TRUE @@ -330,7 +330,7 @@ CurveSharpT = 2 CurveSharppH = 0.5 ThermicConstant = -10 - HIonRelease = -0.1 + HIonRelease = -0.2 RateUpLim = 2 FermiChem = TRUE PurityMin = 0.30 From c1544ffe46a4bbc965fc68abfcdf6b341e737be8 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 01:57:31 +0100 Subject: [PATCH 176/608] Tweak. --- .../reagents/chemistry/reagents/fermi_reagents.dm | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 48c728963c..44b828ac39 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -121,12 +121,6 @@ mob/living/carbon/purgeBody pH = 3.7 -/* -/datum/reagent/fermi/eigenstate/on_new() - location_created = get_turf(loc) //Sets up coordinate of where it was created - message_admins("Attempting to get creation location from init() [location_created]") - //..() -*/ //Main functions /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! switch(current_cycle) @@ -134,8 +128,9 @@ location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") if(purity > 0.75) //Teleports you home if it's pure enough + var/turf/open/creation = location_created do_sparks(5,FALSE,M) - do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg') + do_teleport(M, creation, 0, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,M) if(prob(20)) do_sparks(5,FALSE,M) @@ -1486,7 +1481,6 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y return else holder.remove_reagent("fermiTest", src.volume)//Avoiding recurrsion - message_admins("FermiTest addition!") var/location = get_turf(holder.my_atom) if(purity < 0.34 || purity == 1) var/datum/effect_system/foam_spread/s = new() @@ -1534,7 +1528,6 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y //Consumes self on addition and shifts pH /datum/reagent/fermi/fermiABuffer/on_new(datapH) - message_admins("Adding acid") src.data = datapH if(LAZYLEN(holder.reagent_list) == 1) return @@ -1555,7 +1548,6 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y pH = 11 /datum/reagent/fermi/fermiBBuffer/on_new(datapH) - message_admins("Adding base") src.data = datapH if(LAZYLEN(holder.reagent_list) == 1) return From 336ba8dbad0fed77592a094a31ba465cb496587f Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 02:33:15 +0100 Subject: [PATCH 177/608] Tidying code. --- code/datums/traits/good.dm | 2 +- code/datums/traits/negative.dm | 1 - code/modules/assembly/flash.dm | 1 - .../mob/living/simple_animal/friendly/cat.dm | 8 -- config/admins.txt | 11 ++ .../code/modules/arousal/organs/genitals.dm | 21 +-- .../chemistry/reagents/fermi_reagents.dm | 135 +++++------------- 7 files changed, 50 insertions(+), 129 deletions(-) create mode 100644 config/admins.txt diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 8e666cfeeb..8a7d179172 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -157,7 +157,7 @@ gain_text = "You feel HONGRY." lose_text = "You no longer feel HONGRY." -/datum/quirk/trandening //What does trandening mean? +/datum/quirk/trandening name = "High Luminosity Eyes" desc = "When the next big fancy implant came out you had to buy one on impluse!" value = 1 diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 4851be05b9..6c30a8aa3c 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -348,5 +348,4 @@ else to_chat(H, "[pick(seen)] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") H.apply_status_effect(/datum/status_effect/trance, 200, TRUE) - message_admins("Trance applied") qdel(src) diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 7c7edda742..c723e5fed9 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -360,4 +360,3 @@ M.confused += min(M.confused + 4, 20) M.dizziness += min(M.dizziness + 4, 20) M.drowsyness += min(M.drowsyness + 4, 20) - //M.apply_status_effect(STATUS_EFFECT_PACIFY, 40) for when we port apply_status_effect pacifist (maybe I'll do it) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 74780393b8..c3611b47f1 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -329,12 +329,8 @@ mix_sound = "modular_citadel/sound/voice/merowr.ogg" //FermiChem vars: OptimalTempMin = 650 - //OptimalTempMax = 800 - //ExplodeTemp = 900 OptimalpHMin = 0 - //OptimalpHMax = 8 ReactpHLim = 2 - //CatalystFact = 0 CurveSharpT = 0 CurveSharppH = 0 ThermicConstant = 0 @@ -346,7 +342,6 @@ /datum/chemical_reaction/fermi/secretcatchem/New() //rand doesn't seem to work with n^-e - //message_admins("randomizing reaction") OptimalTempMin += rand(-100, 100) OptimalTempMax = (OptimalTempMin+rand(0, 200)) ExplodeTemp = (OptimalTempMax+rand(0, 200)) @@ -360,9 +355,7 @@ RateUpLim += (rand(1, 1000)/100) PurityMin += (rand(-1, 1)/10) var/additions = list("aluminum", "silver", "gold", "plasma", "silicon", "bluespace", "uranium", "milk") - //var/chosenA = pick(additions) required_reagents[pick(additions)] = rand(1, 5)//weird - //required_catalysts = list("[pick(cataly)]" = 1) /datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. message_admins("Someone found the hidden reaction. Amazing!! Please tell Fermis!!") @@ -384,7 +377,6 @@ /datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H) . = ..() - //origin = H var/current_species = H.dna.species.type var/datum/species/mutation = /datum/species/human/felinid if((mutation != current_species) && (purity >= 0.8))//ONLY if purity is high, and given the stuff is random. It's basically impossible to get this to 1. It already requires felind too, so no new functionality there. diff --git a/config/admins.txt b/config/admins.txt new file mode 100644 index 0000000000..1fdf480dd3 --- /dev/null +++ b/config/admins.txt @@ -0,0 +1,11 @@ +############################################################################################### +# Basically, ckey goes first. Rank goes after the "=" # +# Case is not important for ckey. # +# Case IS important for the rank. # +# All punctuation (spaces etc) EXCEPT '-', '_' and '@' will be stripped from rank names. # +# Ranks can be anything defined in admin_ranks.txt # +# NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn # +# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # +############################################################################################### + +yourckeygoeshere = Host \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index f63adf3962..a9804545d7 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -223,7 +223,6 @@ else B.cached_size = B.size B.prev_size = B.size - message_admins("B.size [B.size], Cache [B.cached_size], prev [B.prev_size]") B.shape = dna.features["breasts_shape"] B.fluid_id = dna.features["breasts_fluid"] B.update() @@ -294,6 +293,7 @@ dna.species.handle_genitals(src)//should work. //dna.species.handle_breasts(src) +//Checks to see if organs are new on the mob, and changes their colours so that they don't get crazy colours. /mob/living/carbon/human/proc/emergent_genital_call() var/organCheck = FALSE for(var/obj/item/organ/O in internal_organs) @@ -378,24 +378,7 @@ genital_overlay.color = "#[H.dna.features["breasts_color"]]" if("vag_color") genital_overlay.color = "#[H.dna.features["vag_color"]]" - //This was removed for some reason, but it breaks my code, so now it's back!! Tadahhh. - /* - if(MUTCOLORS) - if(fixed_mut_color) - genital_overlay.color = "#[fixed_mut_color]" - else - genital_overlay.color = "#[H.dna.features["mcolor"]]" - if(MUTCOLORS2) - if(fixed_mut_color2) - genital_overlay.color = "#[fixed_mut_color2]" - else - genital_overlay.color = "#[H.dna.features["mcolor2"]]" - if(MUTCOLORS3) - if(fixed_mut_color3) - genital_overlay.color = "#[fixed_mut_color3]" - else - genital_overlay.color = "#[H.dna.features["mcolor3"]]" - */ + standing += genital_overlay if(LAZYLEN(standing)) H.overlays_standing[layer] = standing.Copy() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 44b828ac39..8a235bb6bb 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1,14 +1,6 @@ //Fermichem!! //Fun chems for all the family -//MCchem -//BE PE chemical -//Angel/astral chemical -//And tips their hat -//Naninte chem - - - /datum/reagent/fermi name = "Fermi" //Why did I putthis here? id = "fermi" //It's meeee @@ -18,17 +10,10 @@ var/InverseChem = "fermiTox" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. var/DoNotSplit = FALSE // If impurity is handled within the main chem itself var/OnMobMergeCheck = FALSE - //var/addProc = FALSE //When this reagent is added to a new beaker, it does something. - -///datum/reagent/fermi/on_mob_life(mob/living/carbon/M) - //current_cycle++ - //M.reagents.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism - //return ..() - -//Called when reaction stops. #STOP_PROCESSING + //var/addProc = FALSE //When this reagent is added to a new beaker, it does something. Implemented but unused. //Called when added to a beaker without any of the reagent present. #add_reagent -/datum/reagent/fermi/proc/FermiNew(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? +/datum/reagent/fermi/proc/FermiNew(holder) return //This should process fermichems to find out how pure they are and what effect to do. @@ -238,12 +223,6 @@ src.addictCyc4++ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[src.id]_overdose")//holdover until above fix works ..() - //. = 1 - -//TODO -///datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) -// return - //eigenstate END @@ -306,11 +285,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING InverseChemVal = 0.5 InverseChem = "SDZF" - //var/fClone_current_controller = OWNER - //var/mob/living/split_personality/clone//there's two so they can swap without overwriting - //var/mob/living/split_personality/owner - //var/mob/living/carbon/SM - //Main SDGF chemical /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone @@ -360,22 +334,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Really hacky way to deal with this stupid problem I have, and heal the clone. I think around 30u will make a healthy clone. SM.reagents.add_reagent("SDGFheal", volume) M.reagents.remove_reagent(src.id, src.volume) - - //Give the new clone an idea of their character - //SHOULD print last 5 messages said by the original to the clones chatbox - //I don't think it works however. - var/list/say_log = M.logging[LOG_SAY] - var/recent_speech - if(LAZYLEN(say_log) > 5) - recent_speech = say_log.Copy(say_log.len+5,0) //0 so len-LING_ARS+1 to end of list - else - recent_speech = say_log - for(var/spoken_memory in recent_speech) - to_chat(SM, spoken_memory) - - return - //BALANCE: should I make them a pacifist, or give them some cellular damage or weaknesses? else if(src.playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). src.unitCheck = TRUE @@ -551,14 +510,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //If you keep going, it makes you slower, in speed and action. //decreasing your size will return you to normal. //(see the status effect in chem.dm) -//Need to add something that checks to see if the breasts are gone to remove negative debuffs, as well as improve how they're added instead of a flat +/- -//I think most of the layering stuff Works -//but by god does it make me mad, never again. //Overdosing on (what is essentially space estrogen) makes you female, removes balls and shrinks your dick. //OD is low for a reason. I'd like fermichems to have low ODs, and dangerous ODs, and since this is a meme chem that everyone will rush to make, it'll be a lesson learnt early. -//Bug status: Maybe a bit buggy with the spritecode, and the sprites themselves need touching up. -//TODO - fail reaction explosion makes breasts and baps you with them. /datum/reagent/fermi/BElarger name = "Sucubus milk" id = "BElarger" @@ -605,8 +559,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) //If they don't have breasts, give them breasts. var/obj/item/organ/genital/breasts/nB = new - nB.Insert(M) H.emergent_genital_call() + nB.Insert(M) if(nB) if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) nB.color = skintone2hex(H.skin_tone) @@ -678,10 +632,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING // PENIS ENLARGE /////////////////////////////////////////////////////////////////////////////////////////////////// //See breast explanation, it's the same but with taliwhackers -//Oh and I refuse to draw dicks. Someone else can or I'll replace large sprites with a redtail. -//Since someone else made this in the time it took me to PR it, I merged the two ideas. -//Which basically means I took the description. -//TODO: failing the reaction creates a penis instead. +//instead of slower movement and attacks, it slows you and increases the total blood you need in your system. +//Since someone else made this in the time it took me to PR it, I merged them. /datum/reagent/fermi/PElarger // Due to popular demand...! name = "Incubus draft" id = "PElarger" @@ -692,7 +644,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING metabolization_rate = 0.5 ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth InverseChemVal = 0.3 - InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse + InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse and shrinks instead. /datum/reagent/fermi/PElarger/on_mob_add(mob/living/carbon/M) . = ..() @@ -729,14 +681,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING H.emergent_genital_call() if(nP) nP.length = 1 - to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.")//OwO + to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.") nP.cached_length = 1 nP.prev_size = 1 M.reagents.remove_reagent(src.id, 5) P = nP P.cached_length = P.cached_length + 0.1 - if (P.cached_length >= 20.5 && P.cached_length < 21) //too low? Yes, 20 is the max + if (P.cached_length >= 20.5 && P.cached_length < 21) if(H.w_uniform || H.wear_suit) var/target = M.get_bodypart(BODY_ZONE_CHEST) to_chat(M, "Your cock begin to strain against your clothes tightly!") @@ -789,10 +741,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING // ASTROGEN /////////////////////////////////////////////////////////////////////////////////////////////////// More fun chems! -When you take it, it spawns a ghost that shouldn't be able to interact with the world, it can talk cause eh, it's space whattya gonna do +When you take it, it spawns a ghost that the player controls. (No access to deadchat) This ghost moves pretty quickly and is mostly invisible, but is still visible for people with eyes. When it's out of your system, you return back to yourself. It doesn't last long and metabolism of the chem is exponential. -ODing doesn't seem to work, I dunno why, I'd like it to frustrate your attempts to move around and make you fall aleep after. Addiction is particularlly brutal, it slowly turns you invisible with flavour text, then kills you at a low enough alpha. (i've also added something to prevent geneticists speeding this up) There's afairly major catch regarding the death though. I'm not gonna say here, go read the code, it explains it and puts my comments on it in context. I know that anyone reading it without understanding it is going to freak out so, this is my attempt to get you to read it and understand it. I'd like to point out from my calculations it'll take about 60-80 minutes to die this way too. Plenty of time to visit me and ask for some pills to quench your addiction. @@ -813,12 +764,12 @@ Buginess level: works as intended - except teleport makes sparks for some reason var/mob/living/carbon/origin var/mob/living/simple_animal/hostile/retaliate/ghost/G = null var/antiGenetics = 255 + var/resetAddiction = FALSE //to get around this weird problem I'm having. var/sleepytime = 0 InverseChemVal = 0.25 /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! - M.alpha = 255//Reset addiction - antiGenetics = 255// DOesn't work for some reason? + resetAddiction = TRUE switch(current_cycle) if(0)//Require a minimum origin = M @@ -842,7 +793,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason if(prob(50)) to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") do_teleport(G, M.loc) - M.reagents.remove_reagent(src.id, current_cycle-1, FALSE) + M.reagents.remove_reagent(src.id, current_cycle/2, FALSE) ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) @@ -851,13 +802,15 @@ Buginess level: works as intended - except teleport makes sparks for some reason if(overdosed) to_chat(M, "The high volume of Astrogren you just took causes you to black out momentarily as your mind snaps back to your body.") M.Sleeping(sleepytime, 0) + antiGenetics = 255 ..() //Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. /datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) - if(M.reagents.has_reagent("astral")) + if(resetAddiction == TRUE) antiGenetics = 255//Doesn't reset when you take more, which is weird for me, it should. M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them. + resetAddiction = FALSE if(prob(65)) M.alpha-- antiGenetics-- @@ -908,7 +861,6 @@ The magnum opus of FermiChem - Long and complicated, I highly recomend you look at the two other files heavily involved in this modular_citadel/code/datums/status_effects/chems.dm - handles the subject's reactions code/modules/surgery/organs/vocal_cords.dm - handles the enchanter speaking -What started as a chem for bhijin became way too ambitious, because I live in the sky with pie. HOW IT WORKS Fermis_Reagent.dm @@ -917,7 +869,7 @@ Upon reacting with blood as a catalyst, the blood is used to define who the enth This uses the fermichem only proc; FermiCreate, which is basically the same as On_new, except it doesn't require "data" which is something to do with blood and breaks everything so I said bugger it and made my own proc. It basically sets up vars. When it's first made, the creator has to drink some of it, in order to give them the vocal chords needed. When it's given to someone, it gives them the status effect and kicks off that side of things. For every metabolism tick, it increases the enthrall tally. -Finally, if you manage to pump 150u into some poor soul, you overload them, and mindbreak them. Making them your willing, but broken slave. Which can only be reversed by; fixing their brain with mannitol and neurine (100 / 50u respectively) (or less with both), +Finally, if you manage to pump 100u into some poor soul, you overload them, and mindbreak them. Making them your willing, but broken slave. Which can only be reversed by; fixing their brain with mannitol and neurine (100 / 50u respectively) (or less with both), vocal_cords.dm This handles when the enchanter speaks - basically uses code from voice of god, but only for people with the staus effect. Most of the words are self explainitory, and has a smaller range of commands. If you're not sure what one does, it likely affects the enthrall tally, or the resist tally. @@ -1026,14 +978,10 @@ This is only state 3 pets, state 4 pets cannot get custom triggers, you broke th If you give your pet a collar then their resistance reduced too. (I think thats everything?) -BALANCE ISSUES: -There are none, but I'm glad you asked. +Failstates: +Blowing up the reaction produces a gas that causes everyone to fall in love with one another. -Okay, seriously, unless you're an antag, it will be difficult to enthrall people, you'll need to put a lot of work into it, and really it's supposed to be a mix of rp and combat(?) use. If you get a small army of pets then it can be useful, but equally, they can revered with a ananphro + mannitol grenade. -If it becomes an issue, I'll make all pets pacifists and apply more weakness effects based on mood and state. I'll probably do this anyways as I want the bond between the two to be imperative. -As stated earlier the biggest concern is the use as a murder aid, which I have ideas for. (weaken the enthraller during the enthrallment process?) - -And as stated earlier, this chem is hard to make, and is punishing on failure. You fall in love with someone if it's impure, and then your piorities change. +Creating a chem with a low purity will make you permanently fall in love with someone, and tasked with keeping them safe. If someone else drinks it, you fall for them. */ /datum/reagent/fermi/enthrall @@ -1058,9 +1006,6 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y id = "enthrallTest" description = "A forbidden deep red mixture that overwhelms a foreign body with waves of joy, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." color = "#2C051A" // rgb: , 0, 255 - //ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth - //InverseChemVal = 0.5 - //InverseChem = "enthrall" //At really impure vols, it just becomes 100% inverse data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Fermis Yakumo") creatorID = "honkatonkbramblesnatch"//ckey creatorGender = "Mistress" @@ -1079,13 +1024,12 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y creatorName = data.["creatorName"] creator = get_mob_by_key(creatorID) -//FERMICHEM2 split into different chems /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) . = ..() if(!ishuman(M))//Just to make sure screwy stuff doesn't happen. return if(!creatorID) - CRASH("Something went wrong in enthral creation THIS SHOULD NOT APPEAR") //nervermind this appears when you blow up the reaction. I dunno how + //This happens when the reaction explodes. return var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) //Somehow a beaker got here? (what) if(E) @@ -1093,8 +1037,9 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(purity < 0.5)//Impure chems don't function as you expect return if((M.ckey == creatorID) && (creatorName == M.real_name)) //same name AND same player - same instance of the player. (should work for clones?) - //if(M.has_status_effect(STATUS_EFFECT_INLOVE) Not sure if I need/want this. - // to_chat(M, "You are too busy being in love for this to work!") + /*if(M.has_status_effect(STATUS_EFFECT_INLOVE) //Not sure if I need/want this. + to_chat(M, "You are too captivated by your love to think about anything else") + return*/ var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet if(Vc) @@ -1111,7 +1056,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. if(M.has_status_effect(STATUS_EFFECT_INLOVE)) return - var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers + var/list/seen = viewers(7, get_turf(M)) for(var/victim in seen) if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (!M.client) || (M.stat == DEAD)) seen = seen - victim @@ -1133,7 +1078,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it does nothing. return if(!M.client) - metabolization_rate = 0 //Stops powergamers from quitting to avoid affects. + metabolization_rate = 0 //Stops powergamers from quitting to avoid affects. but prevents affects on players that don't exist for performance. return if(metabolization_rate == 0) metabolization_rate = 0.5 @@ -1142,11 +1087,11 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y return else E.enthrallTally += 1 - if(prob(25)) - M.adjustBrainLoss(0.1)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it. + if(prob(1)) + M.adjustBrainLoss(1)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it. ..() -/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I have no idea what happens if you OD yourself honestly. I made it so the creator is set to gain the status for someone random. +/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I made it so the creator is set to gain the status for someone random. . = ..() if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 100u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.) var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers @@ -1243,20 +1188,16 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y forge_valentines_objective(Lover, Love, TRUE) return -//Requires player to be within vicinity of creator -//bonuses to mood -//gives creator a silver(velvet?) tongue -//Addiction is applied when creator is out of viewer -// +//For addiction see chem.dm //////////////////////////////////////////////////////////////////////////////////////////////////// // HATIMUIM /////////////////////////////////////////////////////////////////////////////////////////////////// -//Fun chem, simply adds a heat upon your head, and tips their hat +//Adds a heat upon your head, and tips their hat //Also has a speech alteration effect when the hat is there -//Should, but doesn't currently, increase armour; 1 armour per 10u +//Increase armour; 1 armour per 10u //but if you OD it becomes negative. -//please help fix that + /datum/reagent/fermi/hatmium //for hatterhat @@ -1297,10 +1238,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y // FURRANIUM /////////////////////////////////////////////////////////////////////////////////////////////////// //OwO whats this? -//Works as intended!! //Makes you nya and awoo -//At a certain amount of time in your system it gives you a fluffy tongue owo! -//STATUS: ready +//At a certain amount of time in your system it gives you a fluffy tongue, if pure enough, it's permanent. /datum/reagent/fermi/furranium name = "Furranium" @@ -1367,10 +1306,9 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y M.say("Pleh!") /////////////////////////////////////////////////////////////////////////////////////////////// - //Nanite removal -//Writen by Trilby!! -//Status: Done - needs bug test +//Writen by Trilby!! Embellsished a little by me. + /datum/reagent/fermi/naninte_b_gone name = "Naninte bain" id = "naninte_b_gone" @@ -1472,7 +1410,6 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y name = "Fermis Test Reagent" id = "fermiTest" description = "You should be really careful with this...! Also, how did you get this?" - //data = list("Big bang" = 1, "please work" = 2) addProc = TRUE /datum/reagent/fermi/fermiTest/on_new(datum/reagents/holder) @@ -1504,7 +1441,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y holder.clear_reagents() /datum/reagent/fermi/fermiTox - name = "FermiTox"//defined on setup + name = "FermiTox" id = "fermiTox" description = "You should be really careful with this...! Also, how did you get this? You shouldn't have this!" data = "merge" From 91cfd8e05252d46afc505abd5aadad2a939cda12 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 03:01:47 +0100 Subject: [PATCH 178/608] Before say component remove. --- .../effects/effect_system/effects_smoke.dm | 2 +- .../code/datums/status_effects/chems.dm | 2 +- .../code/modules/arousal/organs/genitals.dm | 8 +++-- .../chemistry/reagents/fermi_reagents.dm | 7 ++--- .../reagents/chemistry/recipes/fermi.dm | 30 ++++++++----------- .../modules/reagents/objects/fermiclothes.dm | 6 ---- 6 files changed, 24 insertions(+), 31 deletions(-) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index e8e833890b..c4f8290845 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -273,7 +273,7 @@ chemholder = null return ..() -/datum/effect_system/smoke_spread/chem/set_up(datum/reagents/carry = null, radius = 1, loca, silent = FALSE) +/datum/effect_system/smoke_spread/chem/set_up(datum/reagents/carry = null, radius = 1, loca, silent = FALSE, skip_finger = FALSE) if(isturf(loca)) location = loca else diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 6b0e4fb318..5afeb22c1c 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -298,7 +298,7 @@ phase = -1 to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") if(DistApart < 10) - to_chat(master, "[(H.lewd?"Your pet":"Your thrall")] seems to have broken free of your enthrallment!") + to_chat(master, "[(master.lewd?"Your pet":"Your thrall")] seems to have broken free of your enthrallment!") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) if(owner.lewd) diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index a9804545d7..4a332a72c3 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -295,14 +295,18 @@ //Checks to see if organs are new on the mob, and changes their colours so that they don't get crazy colours. /mob/living/carbon/human/proc/emergent_genital_call() + if((dna.features["has_breasts"]) && (dna.features["has_breasts"])) + return var/organCheck = FALSE for(var/obj/item/organ/O in internal_organs) if(istype(O, /obj/item/organ/genital)) organCheck = TRUE if(/obj/item/organ/genital/penis) - dna.features["has_cock"] = TRUE + if(!dna.features["has_cock"]) + dna.features["has_cock"] = TRUE if(/obj/item/organ/genital/breasts) - dna.features["has_breasts"] = TRUE//Goddamnit get in there. + if(!dna.features["has_breasts"]) + dna.features["has_breasts"] = TRUE//Goddamnit get in there. if (organCheck == FALSE) if(ishuman(src) && dna.species.id == "human") dna.features["genitals_use_skintone"] = TRUE diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 8a235bb6bb..4aa2771cef 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -759,12 +759,11 @@ Buginess level: works as intended - except teleport makes sparks for some reason taste_description = "velvety brambles" metabolization_rate = 0//Removal is exponential, see code overdose_threshold = 20 - addiction_threshold = 25 + addiction_threshold = 24.5 addiction_stage1_end = 9999//Should never end. There is no escape make your time var/mob/living/carbon/origin var/mob/living/simple_animal/hostile/retaliate/ghost/G = null var/antiGenetics = 255 - var/resetAddiction = FALSE //to get around this weird problem I'm having. var/sleepytime = 0 InverseChemVal = 0.25 @@ -807,10 +806,9 @@ Buginess level: works as intended - except teleport makes sparks for some reason //Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. /datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) - if(resetAddiction == TRUE) + if(addiction_stage < 0) antiGenetics = 255//Doesn't reset when you take more, which is weird for me, it should. M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them. - resetAddiction = FALSE if(prob(65)) M.alpha-- antiGenetics-- @@ -1048,6 +1046,7 @@ Creating a chem with a low purity will make you permanently fall in love with so qdel(Vc) to_chat(M, "You feel your vocal chords tingle as your voice comes out in a more sultry tone.") else + message_admins("MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]") M.apply_status_effect(/datum/status_effect/chem/enthrall) /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 1f86c613bd..24820b7db8 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -12,7 +12,6 @@ return //Called when temperature is above a certain threshold -//....Is this too much? /datum/chemical_reaction/fermi/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? if (Exploding == TRUE) return @@ -40,7 +39,7 @@ message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].") var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case. var/datum/effect_system/smoke_spread/chem/s = new() - //Endless loop hell? + for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents if (istype(reagent, /datum/reagent/fermi)) R.add_reagent(reagent.id, reagent.volume) @@ -93,12 +92,11 @@ FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way -//I can never get this to work, please pitch in if you can figure it out. Runtime: Cannot modify null.location_created. /datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. var/turf/open/location = get_turf(my_atom) var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list E.location_created = location - //add on_new() handling of vars + //serum /datum/chemical_reaction/fermi/SDGF //DONE @@ -126,10 +124,10 @@ /datum/chemical_reaction/fermi/SDGF/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies var/turf/T = get_turf(my_atom) - var/mob/living/simple_animal/slime/S = new(T,"grey")//should work, in theory - S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)//I dunno how slimes work cause fire is burny + var/mob/living/simple_animal/slime/S = new(T,"grey") + S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) S.name = "Living teratoma" - S.real_name = "Living teratoma"//horrifying!! + S.real_name = "Living teratoma" S.rabid = 1//Make them an angery boi, grr grr S.color = "#810010" my_atom.reagents.clear_reagents() @@ -137,7 +135,7 @@ for(var/mob/M in seen) to_chat(M, "The cells clump up into a horrifying tumour!") -/datum/chemical_reaction/fermi/BElarger //done +/datum/chemical_reaction/fermi/BElarger name = "Sucubus milk" id = "BElarger" results = list("BElarger" = 0.6) @@ -169,12 +167,12 @@ B.size = ((BE.volume * BE.purity) / 10) //half as effective. my_atom.reagents.clear_reagents() -/datum/chemical_reaction/fermi/PElarger //done +/datum/chemical_reaction/fermi/PElarger name = "Incubus draft" id = "PElarger" results = list("PElarger" = 0.3) required_reagents = list("blood" = 0.5, "synthflesh" = 0.2, "carbon" = 0.2, "aphro" = 0.2, "salglu_solution" = 0.1,) - mix_message = "" + mix_message = "the reaction gives off a spicy mist." //FermiChem vars: OptimalTempMin = 200 OptimalTempMax = 800 @@ -200,9 +198,8 @@ var/datum/reagent/fermi/PElarger/PE = locate(/datum/reagent/fermi/PElarger) in my_atom.reagents.reagent_list P.length = ((PE.volume * PE.purity) / 10)//half as effective. my_atom.reagents.clear_reagents() - //..() -/datum/chemical_reaction/fermi/astral //done //BORKEN +/datum/chemical_reaction/fermi/astral name = "Astrogen" id = "astral" results = list("astral" = 0.5) @@ -222,10 +219,10 @@ RateUpLim = 15 FermiChem = TRUE FermiExplode = TRUE - PurityMin = 0.25 // explode purity! + PurityMin = 0.25 -/datum/chemical_reaction/fermi/enthrall//done +/datum/chemical_reaction/fermi/enthrall/ name = "MKUltra" id = "enthrall" results = list("enthrall" = 0.5) @@ -271,7 +268,6 @@ E.creatorName = B.data.["real_name"] E.data.["creatorID"] = B.data.["ckey"] E.creatorID = B.data.["ckey"] - message_admins("MKUltra made name: [E.creatorName], ID: [E.creatorID], gender: [E.creatorGender]") /datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) var/turf/T = get_turf(my_atom) @@ -313,12 +309,12 @@ to_chat(M, "The makes an off sounding pop, as a hat suddenly climbs out of the beaker!") my_atom.reagents.clear_reagents() -/datum/chemical_reaction/fermi/furranium //low temp and medium pH - done +/datum/chemical_reaction/fermi/furranium name = "Furranium" id = "furranium" results = list("furranium" = 0.5) required_reagents = list("aphro" = 0.1, "moonsugar" = 0.1, "silver" = 0.2, "salglu_solution" = 0.1) - //mix_message = "" + mix_message = "You think you can hear a howl come from the beaker." //FermiChem vars: OptimalTempMin = 350 OptimalTempMax = 600 diff --git a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm b/modular_citadel/code/modules/reagents/objects/fermiclothes.dm index 9e3852eff3..4a601d4d67 100644 --- a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm +++ b/modular_citadel/code/modules/reagents/objects/fermiclothes.dm @@ -9,11 +9,6 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) //item_flags = NODROP //Tips their hat! -/* -/obj/item/clothing/head/hattip/equipped(mob/living/carbon/human/user, slot) - C = user //grumble grumble loc -*/ - /obj/item/clothing/head/hattip/attack_hand(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user @@ -27,7 +22,6 @@ /obj/item/clothing/head/hattip/speechModification(message, /mob/living/carbon/C) ..() var/mob/living/carbon/C = get_wearer()//user - //if(istype(C, /mob/living/carbon/C)) var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE) if (T.name == "fluffy tongue") if(prob(0.01)) From 01a38479fadd4a0cb60f3af1b36a3f8b4ad4637e Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 03:16:11 +0100 Subject: [PATCH 179/608] Why did I fiddle with things I shouldn't have. --- code/__DEFINES/components.dm | 4 -- .../code/datums/status_effects/chems.dm | 63 +++++-------------- .../code/modules/arousal/organs/genitals.dm | 8 +-- .../chemistry/reagents/fermi_reagents.dm | 5 +- 4 files changed, 18 insertions(+), 62 deletions(-) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 3d9e81e6c1..8e95f8f79a 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -137,10 +137,6 @@ #define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) #define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage) #define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () -//#define COMSIG_LIVING_SAY "say" //mob/living/say() - return COMSIG_I_FORGET_WHAT_TO_CALL_IT to interrupt before message sent. -// #define COMPONENT_NO_SAY 1 // Here I am pretending to know what I'm doing. -//#define - // /mob/living/carbon signals #define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 5afeb22c1c..5c2ff08342 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -3,13 +3,6 @@ var/mob/living/fermi_Clone alert_type = null -/* -/obj/screen/alert/status_effect/SDGF - name = "SDGF" - desc = "You've cloned yourself! How cute." - icon_state = "SDGF" -*/ - /datum/status_effect/chem/SGDF/on_apply() message_admins("SGDF status appied") var/typepath = owner.type @@ -17,10 +10,6 @@ var/mob/living/carbon/M = owner var/mob/living/carbon/C = fermi_Clone - //fermi_Clone = new typepath(get_turf(M)) - //var/mob/living/carbon/C = fermi_Clone - //var/mob/living/carbon/SM = fermi_Gclone - if(istype(C) && istype(M)) C.real_name = M.real_name M.dna.transfer_identity(C, transfer_SE=1) @@ -28,9 +17,7 @@ return ..() /datum/status_effect/chem/SGDF/tick() - //message_admins("SDGF ticking") if(owner.stat == DEAD) - //message_admins("SGDF status swapping") if((fermi_Clone && fermi_Clone.stat != DEAD) || (fermi_Clone == null)) if(owner.mind) owner.mind.transfer_to(fermi_Clone) @@ -38,20 +25,16 @@ to_chat(fermi_Clone, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") fermi_Clone = null owner.remove_status_effect(src) - // to_chat(owner, "[linked_extract] desperately tries to move your soul to a living body, but can't find one!") ..() +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /datum/status_effect/chem/BElarger id = "BElarger" alert_type = null var/moveCalc = 1 var/cachedmoveCalc = 1 - //var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0) - //var/list/items = list() - //var/items = o.get_contents() -//mob/living/carbon/M = M tried, no dice -//owner, tried, no dice /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. var/mob/living/carbon/human/o = owner var/items = o.get_contents() @@ -118,6 +101,7 @@ owner.next_move_modifier *= value cachedmoveCalc = value +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /datum/status_effect/chem/PElarger id = "PElarger" @@ -179,7 +163,7 @@ //Preamble /mob/living - var/lewd = TRUE //Maybe false? + var/lewd = TRUE /mob/living/verb/toggle_lewd() set category = "IC" @@ -206,41 +190,33 @@ var/mental_capacity //Higher it is, lower the cooldown on commands, capacity reduces with resistance. var/datum/weakref/redirect_component //resistance - //var/datum/weakref/redirect_component2 //say - //var/datum/weakref/redirect_component3 //hear var/distancelist = list(2,1.5,1,0.8,0.6,0.5,0.4,0.3,0.2) //Distance multipliers var/withdrawal = FALSE //withdrawl var/withdrawalTick = 0 //counts how long withdrawl is going on for - var/list/customTriggers = list() //the list of custom triggers (maybe have to split into two) + var/list/customTriggers = list() //the list of custom triggers - var/cooldown = 0 - var/cooldownMsg = TRUE - var/cTriggered = FALSE - var/resistGrowth = 0 - var/DistApart = 1 - var/tranceTime = 0 + var/cooldown = 0 //cooldown on commands + var/cooldownMsg = TRUE //If cooldown message has been sent + var/cTriggered = FALSE //If someone is triggered (so they can't trigger themselves with what they say for infinite loops) + var/resistGrowth = 0 //Resistance accrues over time + var/DistApart = 1 //Distance between master and owner + var/tranceTime = 0 //how long trance effects apply on trance status /datum/status_effect/chem/enthrall/on_apply() var/mob/living/carbon/M = owner var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list if(!E) - message_admins("WARNING: FermiChem: No chem found in thrall, did you bus in the chem? Someone set up the reaction incorrectly if not. Console them with a fermiplush please.") + message_admins("WARNING: FermiChem: No master found in thrall, did you bus in the chem? You need to set up the vars manually if it's not reacted. Someone set up the reaction incorrectly if not. Console them with a fermiplush please.") enthrallID = E.creatorID enthrallGender = E.creatorGender master = get_mob_by_key(enthrallID) - if(!master) - message_admins("WARNING: FermiChem: No master found in thrall, did you bus in the chem? Someone set up the reaction incorrectly if not. Console them with a fermiplush please.") if(M.ckey == enthrallID) owner.remove_status_effect(src)//This shouldn't happen, but just in case redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# - //redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed - //redirect_component3 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_HEAR = CALLBACK(src, .proc/owner_hear)))) //Do resistance calc if resist is pressed - //RegisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL, .proc/owner_say) //to add, maybe. RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear) - //Might need to add redirect component for listening too. var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! mental_capacity = 500 - B.get_brain_damage() var/message = "[(owner.lewd?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]" @@ -249,7 +225,6 @@ return ..() /datum/status_effect/chem/enthrall/tick() - //. = ..() //loop Please var/mob/living/carbon/M = owner //chem calculations @@ -535,13 +510,7 @@ to_chat(owner, "You're now free of [master]'s influence, and fully independant oncemore!'") //UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) //Should still make custom commands work after freedom, need to check. -/* -/datum/status_effect/chem/enthrall/mob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) - if(master in message || master in message) - return - else - . = ..() -*/ + //WORKS!! AAAAA /datum/status_effect/chem/enthrall/proc/owner_hear(var/hearer, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) @@ -610,14 +579,10 @@ o.apply_status_effect(/datum/status_effect/trance, 200, TRUE) tranceTime = 50 - //add more fun stuff! cTriggered = FALSE return -/* -/datum/status_effect/chem/enthrall/proc/owner_withdrawal(mob/living/carbon/M) - //3 stages, each getting worse -*/ + /datum/status_effect/chem/enthrall/proc/owner_resist() var/mob/living/carbon/M = owner to_chat(owner, "You attempt to fight against against [(owner.lewd?"[enthrallGender]":"[master]")]'s influence!'") diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 4a332a72c3..a9804545d7 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -295,18 +295,14 @@ //Checks to see if organs are new on the mob, and changes their colours so that they don't get crazy colours. /mob/living/carbon/human/proc/emergent_genital_call() - if((dna.features["has_breasts"]) && (dna.features["has_breasts"])) - return var/organCheck = FALSE for(var/obj/item/organ/O in internal_organs) if(istype(O, /obj/item/organ/genital)) organCheck = TRUE if(/obj/item/organ/genital/penis) - if(!dna.features["has_cock"]) - dna.features["has_cock"] = TRUE + dna.features["has_cock"] = TRUE if(/obj/item/organ/genital/breasts) - if(!dna.features["has_breasts"]) - dna.features["has_breasts"] = TRUE//Goddamnit get in there. + dna.features["has_breasts"] = TRUE//Goddamnit get in there. if (organCheck == FALSE) if(ishuman(src) && dna.species.id == "human") dna.features["genitals_use_skintone"] = TRUE diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 4aa2771cef..7ab33207e5 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -666,6 +666,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING H.genital_override = TRUE var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) + H.emergent_genital_call() return P.prev_size = P.length P.cached_length = P.length @@ -678,7 +679,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(!P)//They do have a preponderance for escapism, or so I've heard. var/obj/item/organ/genital/penis/nP = new nP.Insert(M) - H.emergent_genital_call() if(nP) nP.length = 1 to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.") @@ -768,7 +768,6 @@ Buginess level: works as intended - except teleport makes sparks for some reason InverseChemVal = 0.25 /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! - resetAddiction = TRUE switch(current_cycle) if(0)//Require a minimum origin = M @@ -806,7 +805,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason //Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. /datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) - if(addiction_stage < 0) + if(addiction_stage < 2) antiGenetics = 255//Doesn't reset when you take more, which is weird for me, it should. M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them. if(prob(65)) From d4d955b138cc2b2161cacc99d879c76ad4fd9fb1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 03:29:17 +0100 Subject: [PATCH 180/608] Finished. --- .../code/modules/arousal/organs/genitals.dm | 11 ++++++++++- .../reagents/chemistry/reagents/fermi_reagents.dm | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index a9804545d7..8c6d9df54a 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -296,14 +296,18 @@ //Checks to see if organs are new on the mob, and changes their colours so that they don't get crazy colours. /mob/living/carbon/human/proc/emergent_genital_call() var/organCheck = FALSE + var/breastCheck = FALSE + var/willyCheck = FALSE for(var/obj/item/organ/O in internal_organs) if(istype(O, /obj/item/organ/genital)) organCheck = TRUE if(/obj/item/organ/genital/penis) dna.features["has_cock"] = TRUE + willyCheck = TRUE if(/obj/item/organ/genital/breasts) dna.features["has_breasts"] = TRUE//Goddamnit get in there. - if (organCheck == FALSE) + breastCheck = TRUE + if(organCheck == FALSE) if(ishuman(src) && dna.species.id == "human") dna.features["genitals_use_skintone"] = TRUE dna.species.use_skintones = TRUE @@ -315,6 +319,11 @@ //So people who haven't set stuff up don't get rainbow surprises. dna.features["cock_color"] = "[dna.features["mcolor"]]" dna.features["breasts_color"] = "[dna.features["mcolor"]]" + else //If there's a new organ, make it the same colour. + if(breastCheck == FALSE) + dna.features["breasts_color"] = dna.features["cock_color"] + else if (willyCheck == FALSE) + dna.features["cock_color"] = dna.features["breasts_color"] return /datum/species/proc/handle_genitals(mob/living/carbon/human/H)//more like handle sadness diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 7ab33207e5..7f477d7496 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -546,6 +546,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING H.genital_override = TRUE var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") if(!B) + H.emergent_genital_call() return if(!B.size == "huge") var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) @@ -559,7 +560,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) //If they don't have breasts, give them breasts. var/obj/item/organ/genital/breasts/nB = new - H.emergent_genital_call() nB.Insert(M) if(nB) if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) @@ -768,6 +768,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason InverseChemVal = 0.25 /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! + M.alpha = 255 switch(current_cycle) if(0)//Require a minimum origin = M From 42513fda9b6025abd45f87134e7a8bfd01219f8d Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 03:49:14 +0100 Subject: [PATCH 181/608] Pre extra file culling. --- code/modules/reagents/chemistry/holder.dm | 136 ++++++++---------- .../reagents/chemistry/recipes/fermi.dm | 14 +- 2 files changed, 63 insertions(+), 87 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 0e3d10850b..16999deea1 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -190,9 +190,9 @@ im if(preserve_data) trans_data = copy_data(T) - //fermichem Added ph TODO: add T.purity + R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, T.purity, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. - //R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + remove_reagent(T.id, transfer_amount) update_total() @@ -252,8 +252,8 @@ im if(current_reagent.id == reagent) if(preserve_data) trans_data = current_reagent.data - R.add_reagent(current_reagent.id, amount, trans_data, chem_temp, current_reagent.purity, pH, no_react = TRUE) //Fermichem edit TODO: add purity - //R.add_reagent(current_reagent.id, amount, trans_data, src.chem_temp, pH, current_reagent.purity, no_react = TRUE) //Fermichem edit + R.add_reagent(current_reagent.id, amount, trans_data, chem_temp, current_reagent.purity, pH, no_react = TRUE) + remove_reagent(current_reagent.id, amount, 1) break @@ -357,7 +357,7 @@ im qdel(A) return - else if(istype(A, /obj/item/reagent_containers/glass) && ((pH < 0.5) || (pH > 13.5)))//maybe make it higher? Though..Hmm! + else if(istype(A, /obj/item/reagent_containers/glass) && ((pH < 0.5) || (pH > 13.5)))//maybe make it higher? var/list/seen = viewers(5, get_turf(A)) var/iconhtml = icon2html(A, seen) for(var/mob/M in seen) @@ -368,15 +368,15 @@ im -/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar +/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION if(fermiIsReacting == TRUE) //reagents_holder_flags |= REAGENT_NOREACT unsure if this is needed return - var/list/cached_reagents = reagent_list //a list of the reagents? - var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? - var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! - if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. - return //Yup, no reactions here. No siree. + var/list/cached_reagents = reagent_list + var/list/cached_reactions = GLOB.chemical_reactions_list + var/datum/cached_my_atom = my_atom + if(reagents_holder_flags & REAGENT_NOREACT) + return //QPlasticCheck - this is done to reduce calculations if (istype(my_atom, /obj/item/reagent_containers/glass/beaker/plastic)) @@ -385,11 +385,11 @@ im var/reaction_occurred = 0 // checks if reaction, binary variable var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. - do //What does do do in byond? It sounds very redundant? is it a while loop? - var/list/possible_reactions = list() //init list - reaction_occurred = 0 // sets it back to 0? - for(var/reagent in cached_reagents) //for reagent in beaker/holder - var/datum/reagent/R = reagent //check to make sure that reagent is there for the reaction list + do + var/list/possible_reactions = list() / + reaction_occurred = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id if(!reaction) continue @@ -423,26 +423,26 @@ im matching_container = 1 else - if(cached_my_atom.type == C.required_container)//if the suspected container is a container + if(cached_my_atom.type == C.required_container) matching_container = 1 if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs return - if(!C.required_other)//Checks for other things required - matching_other = 1//binary check passes + if(!C.required_other) + matching_other = 1 - else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem + else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. var/obj/item/slime_extract/M = cached_my_atom if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this matching_other = 1 else - if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? Oh, cyro. + if(!C.required_container) matching_container = 1 if(!C.required_other) matching_other = 1 if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! - meets_temp_requirement = 1//binary pass + meets_temp_requirement = 1 if(!has_special_react || C.check_special_react(src)) can_special_react = 1 @@ -450,13 +450,13 @@ im if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react) possible_reactions += C - if(possible_reactions.len)//does list exist? + if(possible_reactions.len) var/datum/chemical_reaction/selected_reaction = possible_reactions[1] //select the reaction with the most extreme temperature requirements - for(var/V in possible_reactions)//why V, surely that would indicate volume? V is the reaction potential. - var/datum/chemical_reaction/competitor = V //competitor? I think this is theres two of them. Troubling..! - if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. - if(competitor.required_temp <= selected_reaction.required_temp)//only returns with lower if reaction "is cold" var. + for(var/V in possible_reactions) + var/datum/chemical_reaction/competitor = V + if(selected_reaction.is_cold_recipe) / + if(competitor.required_temp <= selected_reaction.required_temp) selected_reaction = competitor else if(competitor.required_temp >= selected_reaction.required_temp) //will return with the hotter reacting first. @@ -464,13 +464,11 @@ im var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list var/list/cached_results = selected_reaction.results//resultant chemical list var/special_react_result = selected_reaction.check_special_react(src) - var/list/multiplier = INFINITY //Wat + var/list/multiplier = INFINITY //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. //FermiChem relies on two additional properties; pH and impurity //Temperature plays into a larger role too. - //BRANCH HERE - //if(selected_reaction) var/datum/chemical_reaction/C = selected_reaction if (C.FermiChem == TRUE && !continue_reacting) @@ -481,7 +479,7 @@ im if( (chem_temp <= C.ExplodeTemp) && (chem_temp >= C.OptimalTempMin)) if( (pH >= (C.OptimalpHMin - C.ReactpHLim)) && (pH <= (C.OptimalpHMax + C.ReactpHLim)) )//To prevent pointless reactions - //if (reactedVol < targetVol) + if (fermiIsReacting == TRUE) return 0 else @@ -490,6 +488,7 @@ im fermiIsReacting = TRUE fermiReactID = selected_reaction reaction_occurred = 1 + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log if (chem_temp > C.ExplodeTemp) var/datum/chemical_reaction/fermi/Ferm = selected_reaction fermiIsReacting = FALSE @@ -498,22 +497,19 @@ im else return 0 - - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log - //Standard reaction mechanics: else for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01)) for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1) - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + for(var/P in selected_reaction.results) multiplier = max(multiplier, 1) //this shouldnt happen ... SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log - add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: + add_reagent(P, cached_results[P]*multiplier, null, chem_temp) var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers @@ -539,9 +535,9 @@ im reaction_occurred = 1 continue_reacting = TRUE - while(reaction_occurred)//while do nothing? - update_total()//Don't know waht this does. - return 0//end! + while(reaction_occurred) + update_total() + return 0 /datum/reagents/process() var/datum/chemical_reaction/fermi/C = fermiReactID @@ -562,7 +558,7 @@ im update_total() //Reaction sounds and words playsound(get_turf(my_atom), C.mix_sound, 80, 1) - var/list/seen = viewers(5, get_turf(my_atom))//Sound and sight checkers + var/list/seen = viewers(5, get_turf(my_atom)) var/iconhtml = icon2html(my_atom, seen) for(var/mob/M in seen) to_chat(M, "[iconhtml] [C.mix_message]") @@ -587,7 +583,7 @@ im update_total() //Reaction sounds and words playsound(get_turf(my_atom), C.mix_sound, 80, 1) - var/list/seen = viewers(5, get_turf(my_atom))//Sound and sight checkers + var/list/seen = viewers(5, get_turf(my_atom)) var/iconhtml = icon2html(my_atom, seen) for(var/mob/M in seen) to_chat(M, "[iconhtml] [C.mix_message]") @@ -602,13 +598,12 @@ im update_total() //Reaction sounds and words playsound(get_turf(my_atom), C.mix_sound, 80, 1) - var/list/seen = viewers(5, get_turf(my_atom))//Sound and sight checkers + var/list/seen = viewers(5, get_turf(my_atom)) var/iconhtml = icon2html(my_atom, seen) for(var/mob/M in seen) to_chat(M, "[iconhtml] [C.mix_message]") return - //handle_reactions() /datum/reagents/proc/FermiReact(selected_reaction, cached_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) var/datum/chemical_reaction/fermi/C = selected_reaction @@ -619,7 +614,7 @@ im //get purity from combined beaker reactant purities HERE. var/purity = 1 - //Begin Parse + //Begin checks //Check extremes first if (cached_temp > C.ExplodeTemp) @@ -634,10 +629,9 @@ im pH = 14 else if (pH < 0) pH = 0 - //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //some beakers melt at extremes. - - //For now, purity is handled elsewhere + //For now, purity is handled elsewhere (on add) //Calculate DeltapH (Deviation of pH from optimal) //Lower range if (pH < C.OptimalpHMin) @@ -659,7 +653,6 @@ im //This should never proc: else WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") - //TODO Add CatalystFact - though, might be pointless. //Calculate DeltaT (Deviation of T from optimal) if (cached_temp < C.OptimalTempMax && cached_temp >= C.OptimalTempMin) @@ -668,32 +661,16 @@ im deltaT = 1 else deltaT = 0 - /* - stepChemAmmount = CLAMP(((deltaT * cached_results[P]) * multipler), 0, (targetVol - reactedVol)) //used to have multipler, now it does - if (stepChemAmmount * cached_results[P] > C.RateUpLim) - stepChemAmmount = C.RateUpLim - else if (stepChemAmmount <= 0.01) - stepChemAmmount = 0.01 - */ - - if ((reactedVol + stepChemAmmount) > targetVol) - stepChemAmmount = targetVol - reactedVol purity = (deltapH)//set purity equal to pH offset //Then adjust purity of result with reagent purity. purity *= reactant_purity(C) - /*old - stepChemAmmount = CLAMP(((deltaT * cached_results[P]) * multiplier), 0, (targetVol - reactedVol)) //used to have multipler, now it does - if (stepChemAmmount * cached_results[P] > C.RateUpLim) - stepChemAmmount = C.RateUpLim - else if (stepChemAmmount <= 0.01) - stepChemAmmount = 0.01 - */ - var/removeChemAmmount - var/addChemAmmount + var/removeChemAmmount //remove factor + var/addChemAmmount //add factor //ONLY WORKS FOR ONE PRODUCT AT THE MOMENT + //Calculate how much product to make and how much reactant to remove factors.. for(var/P in cached_results) //stepChemAmmount = CLAMP(((deltaT * multiplier), 0, ((targetVol - reactedVol)/cached_results[P])) //used to have multipler, now it does stepChemAmmount = (multiplier*cached_results[P]) @@ -705,31 +682,34 @@ im if (addChemAmmount < 0.01) addChemAmmount = 0.01 removeChemAmmount = (addChemAmmount/cached_results[P]) - message_admins("Reaction vars: PreReacted: [reactedVol] of [targetVol]. deltaT [deltaT], multiplier [multiplier], Step [stepChemAmmount], uncapped Step [deltaT*(multiplier*cached_results[P])], addChemAmmount [addChemAmmount], removeFactor [removeChemAmmount] Pfactor [cached_results[P]], adding [addChemAmmount]") + //This is kept for future bugtesters. + //message_admins("Reaction vars: PreReacted: [reactedVol] of [targetVol]. deltaT [deltaT], multiplier [multiplier], Step [stepChemAmmount], uncapped Step [deltaT*(multiplier*cached_results[P])], addChemAmmount [addChemAmmount], removeFactor [removeChemAmmount] Pfactor [cached_results[P]], adding [addChemAmmount]") + //remove reactants for(var/B in cached_required_reagents) - remove_reagent(B, (removeChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + remove_reagent(B, (removeChemAmmount * cached_required_reagents[B]), safety = 1) + //add product var/TotalStep = 0 - for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? + for(var/P in cached_results) SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log add_reagent(P, (addChemAmmount), null, cached_temp, purity)//add reagent function!! I THINK I can do this: TotalStep += addChemAmmount//for multiple products - //Above should reduce yeild based on holder purity. - //Purity Check - //NOT MULTIPROD SAFE. TODO: Add multiproduct support + //Above should reduce yeild based on holder purity. + //Purity Check for(var/datum/reagent/R in my_atom.reagents.reagent_list) if(P == R.id) if (R.purity < C.PurityMin)//If purity is below the min, blow it up. fermiIsReacting = FALSE C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) + STOP_PROCESSING(SSprocessing, src) return 0 C.FermiCreate(src)//proc that calls when step is done //Apply pH changes and thermal output of reaction to beaker - chem_temp = round(cached_temp + (C.ThermicConstant * addChemAmmount)) //Why won't you update!!! Because I'm silly. - pH += (C.HIonRelease * addChemAmmount)//honestly pH shifting is so confusing + chem_temp = round(cached_temp + (C.ThermicConstant * addChemAmmount)) + pH += (C.HIonRelease * addChemAmmount) //keep track of the current reacted amount reactedVol = reactedVol + addChemAmmount //return said amount to compare for next step. @@ -740,12 +720,10 @@ im var/list/cached_reagents = reagent_list var/i = 0 var/cachedPurity - //var/fermiChem for(var/datum/reagent/R in my_atom.reagents.reagent_list) if (R in cached_reagents) cachedPurity += R.purity i++ - //message_admins("total reactant purity = [cachedPurity/i]") return cachedPurity/i /datum/reagents/proc/isolate_reagent(reagent) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 24820b7db8..2771d014ec 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -11,7 +11,7 @@ /datum/chemical_reaction/fermi/proc/FermiFinish(datum/reagents/holder, multipler) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? return -//Called when temperature is above a certain threshold +//Called when temperature is above a certain threshold, or if purity is too low. /datum/chemical_reaction/fermi/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? if (Exploding == TRUE) return @@ -26,15 +26,15 @@ if (500 to 750) for(var/turf/turf in range(1,T)) new /obj/effect/hotspot(turf) - //volume /= 3 + if (751 to 1100) for(var/turf/turf in range(2,T)) new /obj/effect/hotspot(turf) - //volume /= 4 + if (1101 to INFINITY) //If you're crafty for(var/turf/turf in range(3,T)) new /obj/effect/hotspot(turf) - //volume /= 5 + message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].") var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case. @@ -50,9 +50,8 @@ ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 if(pH < 4) //if acidic, make acid spray - //s.set_up(/datum/reagent/fermi/fermiAcid, (volume/3), pH*10, T) R.add_reagent("fermiAcid", ((volume/3)/pH)) - //pHmod = 2 + if(R.reagent_list) s.set_up(R, (volume/10), 10, T) s.start() @@ -61,13 +60,12 @@ var/datum/effect_system/reagents_explosion/e = new() e.set_up(round((volume/30)*(pH-9)), T, 0, 0) e.start() - //pHmod = 1.5 if(!ImpureTot == 0) //If impure, v.small emp ImpureTot *= volume empulse(T, volume/10, ImpureTot/10, 1) - my_atom.reagents.clear_reagents() + my_atom.reagents.clear_reagents() //just in case return /datum/chemical_reaction/fermi/eigenstate//done From 67860a9fffe5e75920b0f1b49dd813bc26a53f70 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 03:49:51 +0100 Subject: [PATCH 182/608] Removed Kev File, sorry Kev. --- .../chemistry/Fermi_Chemistry_notes.txt | 94 -- code/modules/reagents/chemistry/holderKev.dm | 900 ------------------ 2 files changed, 994 deletions(-) delete mode 100644 code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt delete mode 100644 code/modules/reagents/chemistry/holderKev.dm diff --git a/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt b/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt deleted file mode 100644 index 3005b81640..0000000000 --- a/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt +++ /dev/null @@ -1,94 +0,0 @@ -Cit/main/Chemistry notes - -SEE README.MD FOR FUNCTIONS - -~Main folder: \ss13\Citadel-Station-13\code\modules\reagents\chemistry~ -~ADD NEW FILES TO tgstation.dme~ - -~Recipies: \ss13\Citadel-Station-13\code\modules\reagents\chemistry\recipes~ -This contains the reaction recipies and thats it. -name, id, results, required_reagents, required_catalysts, mix_message, required_temp -To add: a lot - -eg:{ - /datum/chemical_reaction/charcoal - name = "Charcoal" - id = "charcoal" - results = list("charcoal" = 2) - required_reagents = list("ash" = 1, "sodiumchloride" = 1) - mix_message = "The mixture yields a fine black powder." - required_temp = 380 - required_catalysts = list("plasma" = 5) - } - -How the end state should look:{ - /datum/chemical_reaction/bicaridine - name = "Bicaridine" - id = "bicaridine" - results = list("bicaridine" = 3) - required_reagents = list("carbon" = 1, "oxygen" = 1, "sugar" = 1) - OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reations - OptimalTempMax = 500 // Upper end for above - ExplodeTemp = 550 //Temperature at which reaction explodes - OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reations (Plateu phase) - OptimalpHMax = 9.5 // Higest value for above - ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) - //CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharp = 4 // How sharp the exponential curve is (to the power of value) - ThermicConstant = -2.5 //Temperature change per 1u produced - HIonRelease = 0.01 //pH change per 1u reaction - RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect - //optional: - mix_message = "The mixture yields a fine black powder." - required_catalysts = list("plasma" = 5) - - edit: - required_temp = 380 -} - -~\ss13\Citadel-Station-13\code/modules/reagents/chemistry/holder.dm~ -Where the actual reaction takes place, main edit location. -About half way where I've commented (WHY IS THERE NO LINE NUMBERS?!) - -~\ss13\Citadel-Station-13\code/modules/reagents/chemistry/reagents~ -Where what the reactions do, the code that sets what they do. - - -~\ss13\Citadel-Station-13\tgui\src\interfaces~ -This contains the 4 scripts for generation of the UI for operation of the various chemical equipments. - -//Mixables -var/static/regex/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara") //enthral_words works -var/static/regex/reward_words = regex("good boy|good girl|good pet") //reward_words works -var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") ////punish_words works -//phase 0 -var/static/regex/saymyname_words = regex("say my name|who am i|whoami") //works I think -var/static/regex/wakeup_words = regex("revert|awaken|snap") //works -//phase1 -var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") //works -var/static/regex/antiresist_words = regex("unable to resist|give in")//useful if you think your target is resisting a lot -var/static/regex/resist_words = regex("resist|snap out of it|fight")//useful if two enthrallers are fighting -var/static/regex/forget_words = regex("forget|muddled|awake and forget") -var/static/regex/attract_words = regex("come here|come to me|get over here|attract") -//phase 2 -var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //wah, lewd -var/static/regex/awoo_words = regex("howl|awoo|bark") -var/static/regex/nya_words = regex("nya|meow|mewl") -var/static/regex/sleep_words = regex("sleep|slumber|rest") -var/static/regex/strip_words = regex("strip|derobe|nude") -var/static/regex/walk_words = regex("slow down") -var/static/regex/run_words = regex("run") -var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown|kneel") -//phase 3 -var/static/regex/statecustom_words = regex("state triggers|state your triggers") -var/static/regex/custom_words = regex("new trigger|listen to me") -var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|trance")//What a descriptive name! -var/static/regex/objective_words = regex("new objective|obey this command|unable to resist|compulsed") -var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die") -var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") -var/static/regex/hallucinate_words = regex("trip balls|hallucinate") -var/static/regex/hot_words = regex("heat|hot|hell") -var/static/regex/cold_words = regex("cold|cool down|chill|freeze") -var/static/regex/getup_words = regex("get up") -var/static/regex/pacify_words = regex("more and more docile|complaisant|friendly|pacifist") -var/static/regex/charge_words = regex("charge|oorah|attack") diff --git a/code/modules/reagents/chemistry/holderKev.dm b/code/modules/reagents/chemistry/holderKev.dm deleted file mode 100644 index c51c318e3e..0000000000 --- a/code/modules/reagents/chemistry/holderKev.dm +++ /dev/null @@ -1,900 +0,0 @@ - -/proc/build_chemical_reagent_list() - //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id - - if(GLOB.chemical_reagents_list) - return - - var/paths = subtypesof(/datum/reagent) - GLOB.chemical_reagents_list = list() - - for(var/path in paths) - var/datum/reagent/D = new path() - GLOB.chemical_reagents_list[D.id] = D - -/proc/build_chemical_reactions_list() - //Chemical Reactions - Initialises all /datum/chemical_reaction into a list - // It is filtered into multiple lists within a list. - // For example: - // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma - - if(GLOB.chemical_reactions_list) - return - - var/paths = subtypesof(/datum/chemical_reaction) - GLOB.chemical_reactions_list = list() - - for(var/path in paths) - - var/datum/chemical_reaction/D = new path() - var/list/reaction_ids = list() - - if(D.required_reagents && D.required_reagents.len) - for(var/reaction in D.required_reagents) - reaction_ids += reaction - - // Create filters based on each reagent id in the required reagents list - for(var/id in reaction_ids) - if(!GLOB.chemical_reactions_list[id]) - GLOB.chemical_reactions_list[id] = list() - GLOB.chemical_reactions_list[id] += D - break // Don't bother adding ourselves to other reagent ids, it is redundant - -/////////////////////////////////////////////////////////////////////////////////// - -/datum/reagents - var/list/datum/reagent/reagent_list = new/list() - var/total_volume = 0 - var/maximum_volume = 100 - var/atom/my_atom = null - var/chem_temp = 150 - var/pH = REAGENT_NORMAL_PH - var/last_tick = 1 - var/addiction_tick = 1 - var/list/datum/reagent/addiction_list = new/list() - var/reagents_holder_flags - -/datum/reagents/New(maximum=100) - maximum_volume = maximum - - //I dislike having these here but map-objects are initialised before world/New() is called. >_> - if(!GLOB.chemical_reagents_list) - build_chemical_reagent_list() - if(!GLOB.chemical_reactions_list) - build_chemical_reactions_list() - -/datum/reagents/Destroy() - . = ..() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - qdel(R) - cached_reagents.Cut() - cached_reagents = null - if(my_atom && my_atom.reagents == src) - my_atom.reagents = null - my_atom = null - -// Used in attack logs for reagents in pills and such -/datum/reagents/proc/log_list() - if(!length(reagent_list)) - return "no reagents" - - var/list/data = list() - for(var/r in reagent_list) //no reagents will be left behind - var/datum/reagent/R = r - data += "[R.id] ([round(R.volume, 0.1)]u)" - //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. - return english_list(data) - -/datum/reagents/proc/remove_any(amount = 1) - var/list/cached_reagents = reagent_list - var/total_transfered = 0 - var/current_list_element = 1 - - current_list_element = rand(1, cached_reagents.len) - - while(total_transfered != amount) - if(total_transfered >= amount) - break - if(total_volume <= 0 || !cached_reagents.len) - break - - if(current_list_element > cached_reagents.len) - current_list_element = 1 - - var/datum/reagent/R = cached_reagents[current_list_element] - remove_reagent(R.id, 1) - - current_list_element++ - total_transfered++ - update_total() - - handle_reactions() - return total_transfered - -/datum/reagents/proc/remove_all(amount = 1) - var/list/cached_reagents = reagent_list - if(total_volume > 0) - var/part = amount / total_volume - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - remove_reagent(R.id, R.volume * part) - - update_total() - handle_reactions() - return amount - -/datum/reagents/proc/get_master_reagent_name() - var/list/cached_reagents = reagent_list - var/name - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - name = R.name - - return name - -/datum/reagents/proc/get_master_reagent_id() - var/list/cached_reagents = reagent_list - var/id - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - id = R.id - - return id - -/datum/reagents/proc/get_master_reagent() - var/list/cached_reagents = reagent_list - var/datum/reagent/master - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - master = R - - return master - -/datum/reagents/proc/trans_to(obj/target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. - var/list/cached_reagents = reagent_list - if(!target || !total_volume) - return - if(amount < 0) - return - - var/datum/reagents/R - if(istype(target, /datum/reagents)) - R = target - else - if(!target.reagents) - return - R = target.reagents - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - var/part = amount / src.total_volume - var/trans_data = null - for(var/reagent in cached_reagents) - var/datum/reagent/T = reagent - var/transfer_amount = T.volume * part - if(preserve_data) - trans_data = copy_data(T) - - //fermichem Added ph TODO: add T.purity - R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. - //R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. - remove_reagent(T.id, transfer_amount) - - update_total() - R.update_total() - if(!no_react) - R.handle_reactions() - src.handle_reactions() - return amount - -/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1) - var/list/cached_reagents = reagent_list - if(!target || !total_volume) - return - - var/datum/reagents/R - if(istype(target, /datum/reagents)) - R = target - else - if(!target.reagents) - return - R = target.reagents - - if(amount < 0) - return - amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) - var/part = amount / total_volume - var/trans_data = null - for(var/reagent in cached_reagents) - var/datum/reagent/T = reagent - var/copy_amount = T.volume * part - if(preserve_data) - trans_data = T.data - R.add_reagent(T.id, copy_amount * multiplier, trans_data) - - src.update_total() - R.update_total() - R.handle_reactions() - src.handle_reactions() - return amount - -/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N - var/list/cached_reagents = reagent_list - if (!target) - return - if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) - return - if(amount < 0) - return - - var/datum/reagents/R = target.reagents - if(src.get_reagent_amount(reagent)= R.overdose_threshold && !R.overdosed) - R.overdosed = 1 - need_mob_update += R.overdose_start(C) - if(R.addiction_threshold) - if(R.volume >= R.addiction_threshold && !is_type_in_list(R, cached_addictions)) - var/datum/reagent/new_reagent = new R.type() - cached_addictions.Add(new_reagent) - if(R.overdosed) - need_mob_update += R.overdose_process(C) - if(is_type_in_list(R,cached_addictions)) - for(var/addiction in cached_addictions) - var/datum/reagent/A = addiction - if(istype(R, A)) - A.addiction_stage = -15 // you're satisfied for a good while. - need_mob_update += R.on_mob_life(C) - - if(can_overdose) - if(addiction_tick == 6) - addiction_tick = 1 - for(var/addiction in cached_addictions) - var/datum/reagent/R = addiction - if(C && R) - R.addiction_stage++ - if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end) - need_mob_update += R.addiction_act_stage1(C) - else if(R.addiction_stage1_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end) - need_mob_update += R.addiction_act_stage2(C) - else if(R.addiction_stage2_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end) - need_mob_update += R.addiction_act_stage3(C) - else if(R.addiction_stage3_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end) - need_mob_update += R.addiction_act_stage4(C) - else if(R.addiction_stage4_end <= R.addiction_stage) - to_chat(C, "You feel like you've gotten over your need for [R.name].") - SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.id]_addiction") - cached_addictions.Remove(R) - addiction_tick++ - if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. - C.updatehealth() - C.update_canmove() - C.update_stamina() - update_total() - - -/datum/reagents/proc/set_reacting(react = TRUE) - if(react) - reagents_holder_flags &= ~(REAGENT_NOREACT) - else - reagents_holder_flags |= REAGENT_NOREACT - -/datum/reagents/proc/conditional_update_move(atom/A, Running = 0) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - R.on_move (A, Running) - update_total() - -/datum/reagents/proc/conditional_update(atom/A) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - R.on_update (A) - update_total() - -/datum/reagents/process() - var/occured = handle_reactions(TRUE) - if(!occured) - return PROCESS_KILL - -/datum/reagents/proc/handle_reactions(fermi_chem_react = FALSE)//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar - return - if(reagents_holder_flags & REAGENT_NOREACT) - return //don't react - //cache things for performance - var/list/cached_reagents = reagent_list - var/list/cached_reactions = GLOB.chemical_reactions_list - var/datum/cached_my_atom = my_atom - var/reaction_occurred //if a reaction happened - var/list/fermichem_reacted //keeps track of fermichem reactions that already reacted to prevent it from being instant - do - var/list/possible_reactions - reaction_occurred = FALSE - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - for(var/reaction in cached_reactions[R.id]) - if(!reaction) - continue - var/datum/chemical_reaction/C = reaction - var/list/cached_required_reagents = C.required_reagents - var/list/cached_required_catalysts = C.required_catalysts - var/required_temp = C.required_temp - var/is_cold_recipe = C.is_cold_recipe - var/has_special_react = C.special_react - var/fail = FALSE - for(var/B in cached_required_reagents) - if(!has_reagent(B, cached_required_reagents[B])) - fail = TRUE - break - if(fail) - continue - for(var/B in cached_required_catalysts) - if(!has_reagent(B, cached_required_catalysts[B])) - fail = TRUE - break - if(fail) - continue - if(cached_my_atom) - if(C.required_container && C.required_container != cached_my_atom.type) - continue - if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs - continue - if(C.required_other) //Checks for other things required - if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem - var/obj/item/slime_extract/M = cached_my_atom - if(M.Uses <= 0) // added a limit to slime cores -- Muskets requested this - continue - else - if(C.required_container || C.required_other) - continue - if(required_temp && (is_cold_recipe? (chem_temp > required_temp) : (chem_temp < required_temp))) - continue - if(has_special_react && !C.check_special_react(src)) - continue - if(C.FermiChem) //fermichem checks - if(chem_temp < C.OptimalTempMin) //too low temperature - continue - if(LAZYACCESS(fermichem_reacted, C)) //fermichems don't keep reacting instantly - continue - START_PROCESSING(SSchemistry, src) //start processing - if(!fermi_chem_react) //only react fermichems on process icks - continue - LAZYADD(possible_reactions, C) - if(length(possible_reactions)) //does list exist? - var/datum/chemical_reaction/selected_reaction = possible_reactions[1] - for(var/I in possible_reactions) - var/datum/chemical_reaction/competitor = I - if(selected_reaction.is_cold_recipe? competitor.required_temp < selected_reaction.required_temp : competitor.required_temp > selected_reaction.required_temp) - selected_reaction = competitor - var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list - var/list/cached_results = selected_reaction.results//resultant chemical list - var/special_react_result = selected_reaction.special_react - //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. - //FermiChem relies on two additional properties; pH and impurity - //Temperature plays into a larger role too. - //BRANCH HERE - var/multiplier = INFINITY //the multiplier of the stnadard "1 reaction" we managed to do this cycle - if(!selected_reaction.FermiChem) //it's a normal ss13 chem reaction, instant reactions. - for(var/B in cached_required_reagents) - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) //cap by the multiplier of the required you can get out of this - //remove reactants - for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = TRUE) - //add products - for(var/P in cached_results) - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P] * multiplier, P) - add_reagent(P, cached_results[P]*multiplier, null, chem_temp) - else //FermiiiCheeeem! - //FERMICHEM BEGIN - //--CHECKS - message_admins("FermiChem Proc'd") - var/target_volume = 0 - for(var/result_id in cached_results) - target_volume += multiplier * cached_results[result_id] - message_admins("FermiChem target volume: [target_volume]") - //--PROCESS - message_admins("FermiChem processing started") - //--REACTION - //set up fermichem variables - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmount = 0 - var/purity = 1 - //For now, purity is handled elsewhere - //check extremes first - if(chem_temp > selected_reaction.ExplodeTemp) - FermiExplode(selected_reaction) - else if(!ISINRANGE(pH, 0, 14)) - //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - FermiExplode() - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < selected_reaction.OptimalTempMax && chem_temp >= selected_reaction.OptimalTempMin) - deltaT = (((selected_reaction.OptimalTempMin - chem_temp)**selected_reaction.CurveSharpT)/((selected_reaction.OptimalTempMax - selected_reaction.OptimalTempMin)**selected_reaction.CurveSharpT)) - else if (chem_temp >= selected_reaction.OptimalTempMax) - deltaT = 1 - else - deltaT = 0 - message_admins("calculating temperature factor, min: [selected_reaction.OptimalTempMin], max: [selected_reaction.OptimalTempMax], Exponential: [selected_reaction.CurveSharpT], deltaT: [deltaT]") - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < selected_reaction.OptimalpHMin) - if (pH < (selected_reaction.OptimalpHMin - selected_reaction.ReactpHLim)) - deltapH = 0 - else - deltapH = (((pH - (selected_reaction.OptimalpHMin - selected_reaction.ReactpHLim))**selected_reaction.CurveSharppH)/(selected_reaction.ReactpHLim**selected_reaction.CurveSharppH)) - //Upper range - else if (pH > selected_reaction.OptimalpHMin) - if (pH > (selected_reaction.OptimalpHMin + selected_reaction.ReactpHLim)) - deltapH = 0 - else - deltapH = ((selected_reaction.ReactpHLim -(pH - (selected_reaction.OptimalpHMax + selected_reaction.ReactpHLim))+selected_reaction.ReactpHLim)/(selected_reaction.ReactpHLim**selected_reaction.CurveSharppH)) - //Within mid range - else if (pH >= selected_reaction.OptimalpHMin && pH <= selected_reaction.OptimalpHMax) - deltapH = 1 - //This should never proc: - else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") - WARNING("[my_atom] attempted to determine FermiChem pH for '[selected_reaction.id]' which broke for some reason! ([usr])") - //TODO Add CatalystFact - message_admins("calculating pH factor(purity), pH: [pH], min: [selected_reaction.OptimalpHMin]-[selected_reaction.ReactpHLim], max: [selected_reaction.OptimalpHMax]+[selected_reaction.ReactpHLim], deltapH: [deltapH]") - stepChemAmount = target_volume * deltaT - if (stepChemAmount > selected_reaction.RateUpLim) - stepChemAmount = selected_reaction.RateUpLim - else if (stepChemAmount <= 0.01) - message_admins("stepChem underflow [stepChemAmount]") - stepChemAmount = 0.02 - purity = deltapH - message_admins("cached_results: [cached_results], stepChemAmount [stepChemAmount]") - if(stepChemAmount > multiplier) //too much - message_admins("stepChemAmount was over multiplier for some reason..?") - for(var/B in cached_required_reagents) - message_admins("cached_required_reagents(B): [cached_required_reagents[B]], base stepChemAmount [stepChemAmount]") - remove_reagent(B, (stepChemAmount * cached_required_reagents[B]), safety = TRUE)//safety? removes reagents from beaker using remove function. - - for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? - //reactedVol = max(reactedVol, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmount, P)//log - add_reagent(P, cached_results[P] * stepChemAmount, null, chem_temp)//add reagent function!! I THINK I can do this: - message_admins("purity: [purity], purity of beaker") - message_admins("Temp before change: [chem_temp], pH after change: [pH]") - //Apply pH changes and thermal output of reaction to beaker - chem_temp += (selected_reaction.ThermicConstant * stepChemAmount) - pH += (selected_reaction.HIonRelease * stepChemAmount) - message_admins("Temp after change: [chem_temp], pH after change: [pH]") - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", multiplier, selected_reaction.id)//log - //ensure the same thing doesn't happen in the same tick - LAZYSET(fermichem_reacted, selected_reaction, TRUE) - //FERMICHEM END - //reaction is done, do the effects. - var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers - var/iconhtml = icon2html(cached_my_atom, seen) - if(cached_my_atom) - if(!ismob(cached_my_atom)) // No bubbling mobs - if(selected_reaction.mix_sound) - playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) - - for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") - - if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." - selected_reaction.on_reaction(src, multiplier, special_react_result) - reaction_occurred = TRUE - while(reaction_occurred) - update_total() - return reaction_occurred - -/datum/reagents/proc/isolate_reagent(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if(R.id != reagent) - del_reagent(R.id) - update_total() - -/datum/reagents/proc/del_reagent(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if(R.id == reagent) - if(my_atom && isliving(my_atom)) - var/mob/living/M = my_atom - R.on_mob_delete(M) - qdel(R) - reagent_list -= R - update_total() - if(my_atom) - my_atom.on_reagent_change(DEL_REAGENT) - return 1 - -/datum/reagents/proc/update_total() - var/list/cached_reagents = reagent_list - total_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume < 0.1) - del_reagent(R.id) - else - total_volume += R.volume - - return 0 - -/datum/reagents/proc/clear_reagents() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - del_reagent(R.id) - return 0 - -/datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1) - var/react_type - if(isliving(A)) - react_type = "LIVING" - if(method == INGEST) - var/mob/living/L = A - L.taste(src) - else if(isturf(A)) - react_type = "TURF" - else if(isobj(A)) - react_type = "OBJ" - else - return - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - switch(react_type) - if("LIVING") - var/touch_protection = 0 - if(method == VAPOR) - var/mob/living/L = A - touch_protection = L.get_permeability_protection() - R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection) - if("TURF") - R.reaction_turf(A, R.volume * volume_modifier, show_message) - if("OBJ") - R.reaction_obj(A, R.volume * volume_modifier, show_message) - -/datum/reagents/proc/holder_full() - if(total_volume >= maximum_volume) - return TRUE - return FALSE - -//Returns the average specific heat for all reagents currently in this holder. -/datum/reagents/proc/specific_heat() - . = 0 - var/cached_amount = total_volume //cache amount - var/list/cached_reagents = reagent_list //cache reagents - for(var/I in cached_reagents) - var/datum/reagent/R = I - . += R.specific_heat * (R.volume / cached_amount) - -/datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) - var/S = specific_heat() - chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) - -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, pH = 7, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ - if(!isnum(amount) || !amount) - return FALSE - - if(amount <= 0) - return FALSE - - var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] - if(!D) - WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") - return FALSE - - update_total() - var/cached_total = total_volume - if(cached_total + amount > maximum_volume) - amount = (maximum_volume - cached_total) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. - if(amount <= 0) - return FALSE - var/new_total = cached_total + amount - var/cached_temp = chem_temp - var/list/cached_reagents = reagent_list - - //Equalize temperature - Not using specific_heat() because the new chemical isn't in yet. - var/specific_heat = 0 - var/thermal_energy = 0 - for(var/i in cached_reagents) - var/datum/reagent/R = i - specific_heat += R.specific_heat * (R.volume / new_total) - thermal_energy += R.specific_heat * R.volume * cached_temp - specific_heat += D.specific_heat * (amount / new_total) - thermal_energy += D.specific_heat * amount * reagtemp - chem_temp = thermal_energy / (specific_heat * new_total) - //// - - //add the reagent to the existing if it exists - for(var/A in cached_reagents) - var/datum/reagent/R = A - if (R.id == reagent) - R.volume += amount - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - R.on_merge(data, amount) - if(!no_react) - handle_reactions() - return TRUE - - //otherwise make a new one - var/datum/reagent/R = new D.type(data) - cached_reagents += R - R.holder = src - R.volume = amount - R.loc = get_turf(my_atom) - if(data) - R.data = data - R.on_new(data) - - - if(isliving(my_atom)) - R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - if(!no_react) - handle_reactions() - return TRUE - -/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) - for(var/r_id in list_reagents) - var/amt = list_reagents[r_id] - add_reagent(r_id, amt, data) - -/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to - - if(isnull(amount)) - amount = 0 - CRASH("null amount passed to reagent code") - return FALSE - - if(!isnum(amount)) - return FALSE - - if(amount < 0) - return FALSE - - var/list/cached_reagents = reagent_list - - for(var/A in cached_reagents) - var/datum/reagent/R = A - if (R.id == reagent) - //clamp the removal amount to be between current reagent amount - //and zero, to prevent removing more than the holder has stored - amount = CLAMP(amount, 0, R.volume) - R.volume -= amount - update_total() - if(!safety)//So it does not handle reactions when it need not to - handle_reactions() - if(my_atom) - my_atom.on_reagent_change(REM_REAGENT) - return TRUE - - return FALSE - -/datum/reagents/proc/has_reagent(reagent, amount = -1) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if (R.id == reagent) - if(!amount) - return R - else - if(R.volume >= amount) - return R - else - return 0 - - return 0 - -/datum/reagents/proc/get_reagent_amount(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if (R.id == reagent) - return R.volume - - return 0 - -/datum/reagents/proc/get_reagents() - var/list/names = list() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - names += R.name - - return jointext(names, ",") - -/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. - if(!isnum(amount)) - return 1 - var/list/cached_reagents = reagent_list - var/has_removed_reagent = 0 - - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - var/matches = 0 - // Switch between how we check the reagent type - if(strict) - if(R.type == reagent_type) - matches = 1 - else - if(istype(R, reagent_type)) - matches = 1 - // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. - if(matches) - // Have our other proc handle removement - has_removed_reagent = remove_reagent(R.id, amount, safety) - - return has_removed_reagent - -//two helper functions to preserve data across reactions (needed for xenoarch) -/datum/reagents/proc/get_data(reagent_id) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.id == reagent_id) - return R.data - -/datum/reagents/proc/set_data(reagent_id, new_data) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.id == reagent_id) - R.data = new_data - -/datum/reagents/proc/copy_data(datum/reagent/current_reagent) - if(!current_reagent || !current_reagent.data) - return null - if(!istype(current_reagent.data, /list)) - return current_reagent.data - - var/list/trans_data = current_reagent.data.Copy() - - // We do this so that introducing a virus to a blood sample - // doesn't automagically infect all other blood samples from - // the same donor. - // - // Technically we should probably copy all data lists, but - // that could possibly eat up a lot of memory needlessly - // if most data lists are read-only. - if(trans_data["viruses"]) - var/list/v = trans_data["viruses"] - trans_data["viruses"] = v.Copy() - - return trans_data - -/datum/reagents/proc/get_reagent(type) - var/list/cached_reagents = reagent_list - . = locate(type) in cached_reagents - -/datum/reagents/proc/generate_taste_message(minimum_percent=15) - // the lower the minimum percent, the more sensitive the message is. - var/list/out = list() - var/list/tastes = list() //descriptor = strength - if(minimum_percent <= 100) - for(var/datum/reagent/R in reagent_list) - if(!R.taste_mult) - continue - - if(istype(R, /datum/reagent/consumable/nutriment)) - var/list/taste_data = R.data - for(var/taste in taste_data) - var/ratio = taste_data[taste] - var/amount = ratio * R.taste_mult * R.volume - if(taste in tastes) - tastes[taste] += amount - else - tastes[taste] = amount - else - var/taste_desc = R.taste_description - var/taste_amount = R.volume * R.taste_mult - if(taste_desc in tastes) - tastes[taste_desc] += taste_amount - else - tastes[taste_desc] = taste_amount - //deal with percentages - // TODO it would be great if we could sort these from strong to weak - var/total_taste = counterlist_sum(tastes) - if(total_taste > 0) - for(var/taste_desc in tastes) - var/percent = tastes[taste_desc]/total_taste * 100 - if(percent < minimum_percent) - continue - var/intensity_desc = "a hint of" - if(percent > minimum_percent * 2 || percent == 100) - intensity_desc = "" - else if(percent > minimum_percent * 3) - intensity_desc = "the strong flavor of" - if(intensity_desc != "") - out += "[intensity_desc] [taste_desc]" - else - out += "[taste_desc]" - - return english_list(out, "something indescribable") - -/datum/reagents/proc/expose_temperature(var/temperature, var/coeff=0.02) - var/temp_delta = (temperature - chem_temp) * coeff - if(temp_delta > 0) - chem_temp = min(chem_temp + max(temp_delta, 1), temperature) - else - chem_temp = max(chem_temp + min(temp_delta, -1), temperature) - chem_temp = round(chem_temp) - handle_reactions() - -/////////////////////////////////////////////////////////////////////////////////// - - -// Convenience proc to create a reagents holder for an atom -// Max vol is maximum volume of holder -/atom/proc/create_reagents(max_vol) - if(reagents) - qdel(reagents) - reagents = new/datum/reagents(max_vol) - reagents.my_atom = src - -/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents - var/static/list/random_reagents = list() - if(!random_reagents.len) - for(var/thing in subtypesof(/datum/reagent)) - var/datum/reagent/R = thing - if(initial(R.can_synth)) - random_reagents += initial(R.id) - var/picked_reagent = pick(random_reagents) - return picked_reagent From 51b4bdb8ea0a48923723c92c954f44eef77e74e7 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 03:57:43 +0100 Subject: [PATCH 183/608] Removed wizard edit (oops) --- code/modules/spells/spell_types/shapeshift.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index e16a6eff84..1576c55326 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -15,10 +15,8 @@ var/die_with_shapeshifted_form = TRUE var/convert_damage = FALSE //If you want to convert the caster's health to the shift, and vice versa. var/convert_damage_type = BRUTE //Since simplemobs don't have advanced damagetypes, what to convert damage back into. - //TODO: Remember to remove this before making final commit and make a new request for this. But until then, I'm gonna be a catto wizard! - var/shapeshift_type //Incase I ever get lucky enough to be a wizard. Also why can you be a dog but not a cat!! I know this isn't fermichem related, but this is really important!!! + var/shapeshift_type var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\ - /mob/living/simple_animal/pet/cat,\ /mob/living/simple_animal/pet/dog/corgi,\ /mob/living/simple_animal/hostile/carp/ranged/chaos,\ /mob/living/simple_animal/bot/ed209,\ From 712996960603868f07eb46933078aeae40dd6815 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 04:02:04 +0100 Subject: [PATCH 184/608] Some comments didn't delete properly. --- code/modules/reagents/chemistry/holder.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 16999deea1..78ebb8cd24 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -386,7 +386,7 @@ im var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. do - var/list/possible_reactions = list() / + var/list/possible_reactions = list() reaction_occurred = 0 for(var/reagent in cached_reagents) var/datum/reagent/R = reagent @@ -455,7 +455,7 @@ im //select the reaction with the most extreme temperature requirements for(var/V in possible_reactions) var/datum/chemical_reaction/competitor = V - if(selected_reaction.is_cold_recipe) / + if(selected_reaction.is_cold_recipe) if(competitor.required_temp <= selected_reaction.required_temp) selected_reaction = competitor else From 6b4188ab86334b5b0935d450c057506015186963 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 04:33:46 +0100 Subject: [PATCH 185/608] British spellingggg --- code/modules/mob/living/simple_animal/friendly/cat.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index c3611b47f1..867c3787bc 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -354,7 +354,7 @@ HIonRelease += (rand(-25, 25)/100) RateUpLim += (rand(1, 1000)/100) PurityMin += (rand(-1, 1)/10) - var/additions = list("aluminum", "silver", "gold", "plasma", "silicon", "bluespace", "uranium", "milk") + var/additions = list("aluminium", "silver", "gold", "plasma", "silicon", "bluespace", "uranium", "milk") required_reagents[pick(additions)] = rand(1, 5)//weird /datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. From 455ebc2a7c2922e1fd435af19190eddcc98a1d47 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 04:50:21 +0100 Subject: [PATCH 186/608] Edited Astrogen. --- .../chemistry/reagents/fermi_reagents.dm | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 7f477d7496..fa8bb14a75 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -72,15 +72,7 @@ //Addiction send you on a wild ride and replaces you with an alternative reality version of yourself. //During the process you get really hungry, then your items start teleporting randomly, //then alternative versions of yourself are brought in from a different universe and they yell at you. -//and finally you yourself get teleported to an alternative universe, and character your playing is replaced with said alternative (this used to reroll objectives, but Kevin said prooobably not). -//Currently the creation loc doesn't work, so it teleports you back to where you took it. Which is fine too. This should be fixed, so it either does one or the other. -//Bugginess level: low - I can't get the remove all status effects and moodlets to work. Basically I'd like to reset the character to roundstart if possible. - -//Important factors to consider while balancing: -//1.It's... Fun. And thats mostly it. The teleport thing isn't that useful, since you have to be not stunned to take it. -//You could use it as an antag and OD someone, but you have to inject 20u, which is 5 more than a syringe, and it doesn't kill you. -//I'd like to make it reroll your objectives or expand upon the alternative version of you. -//It's maybe one of the most fun chems, I would say so by far. It's hillarious +//and finally you yourself get teleported to an alternative universe, and character your playing is replaced with said alternative /datum/reagent/fermi/eigenstate name = "Eigenstasium" @@ -505,7 +497,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //I'm not a very kinky person, sorry if it's not great //I tried to make it interesting..!! -//Normal function increases your breast size by 0.1, 1 unit = 1 cup. +//Normal function increases your breast size by 0.1, 5units = 1 cup. //If you get stupid big, it presses against your clothes, causing brute and oxydamage. Then rips them off. //If you keep going, it makes you slower, in speed and action. //decreasing your size will return you to normal. @@ -747,8 +739,6 @@ When it's out of your system, you return back to yourself. It doesn't last long Addiction is particularlly brutal, it slowly turns you invisible with flavour text, then kills you at a low enough alpha. (i've also added something to prevent geneticists speeding this up) There's afairly major catch regarding the death though. I'm not gonna say here, go read the code, it explains it and puts my comments on it in context. I know that anyone reading it without understanding it is going to freak out so, this is my attempt to get you to read it and understand it. I'd like to point out from my calculations it'll take about 60-80 minutes to die this way too. Plenty of time to visit me and ask for some pills to quench your addiction. - -Buginess level: works as intended - except teleport makes sparks for some reason. I'd like it to not if possible..? */ /datum/reagent/fermi/astral // Gives you the ability to astral project for a moment! @@ -844,7 +834,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason antiGenetics-- if(0 to 30) to_chat(M, "Your body disperses from existence, as you become one with the universe.") - to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life and afterlife remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. + to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. deadchat_broadcast("[M] has become one with the universe, meaning that their IC conciousness is continuous throughout death. If they find a way back to life, they are allowed to remember what was said in deadchat and their previous life. Be careful what you say. If they don't act IC while dead, bwoink the FUCK outta them.") M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") message_admins("[M] (ckey: [M.ckey]) has become one with the universe, and have continuous memories thoughout death should they find a way to come back to life (such as an inteligence potion, midround antag, ghost role). They MUST stay within characer while dead.") @@ -1198,7 +1188,6 @@ Creating a chem with a low purity will make you permanently fall in love with so //but if you OD it becomes negative. - /datum/reagent/fermi/hatmium //for hatterhat name = "Hat growth serium" id = "hatmium" From ae35366e97a31ae10770e93a5afd8b436ba22510 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 05:41:12 +0100 Subject: [PATCH 187/608] Some fixes before bed. --- code/datums/traits/good.dm | 4 ++-- code/datums/traits/negative.dm | 6 +++--- code/game/objects/effects/effect_system/effects_smoke.dm | 2 +- code/modules/mob/living/taste.dm | 8 ++++---- code/modules/reagents/chemistry/holder.dm | 1 - modular_citadel/code/datums/status_effects/chems.dm | 6 ++---- 6 files changed, 12 insertions(+), 15 deletions(-) diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 8a7d179172..c023a4f180 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -170,7 +170,7 @@ H.equip_to_slot(gloweyes, SLOT_IN_BACKPACK) H.regenerate_icons() -/datum/quirk/BloodPressure +/datum/quirk/bloodpressure name = "Synthetic blood" desc = "You've got a new form of synthetic blood that increases the total blood volume inside of you as well as the rate of replenishment!" value = 1 //I honeslty dunno if this is a good trait? I just means you use more of medbays blood and make janitors madder, but you also regen blood a lil faster. @@ -178,7 +178,7 @@ gain_text = "You feel full of blood!" lose_text = "You feel like your blood pressure went down." -/datum/quirk/BloodPressure/add() +/datum/quirk/bloodpressure/add() var/mob/living/M = quirk_holder M.blood_ratio = 1.2 M.blood_volume += 150 diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 6c30a8aa3c..95595ef713 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -326,7 +326,7 @@ medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events." //For reviewers: If you think it's a bad idea, feel free to remove it. I won't be upset :blobcat: -/datum/quirk/Hypno +/datum/quirk/hypno name = "Hypnotherapy user" desc = "You had hypnotherapy right before your shift, you're not sure it had any effects, though." mob_trait = "hypnotherapy" @@ -334,12 +334,12 @@ gain_text = "You really think the hypnotherapy helped you out." //lose_text = "You forget about the hypnotherapy you had, or did you even have it?" -/datum/quirk/Hypno/add() +/datum/quirk/hypno/add() //You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic! addtimer(CALLBACK(src, /datum/quirk/Hypno.proc/triggered, quirk_holder), rand(12000, 36000))//increase by 100, it's lower so I can test it. //DOES NOT give any indication when someone is triggered - this is intentional so people don't abuse it, you're supposed to get a random thing said to you as a mini objective. -/datum/quirk/Hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. +/datum/quirk/hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. var/mob/living/carbon/human/H = quirk_holder var/list/seen = viewers(8, get_turf(H)) seen -= quirk_holder diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index c4f8290845..e8e833890b 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -273,7 +273,7 @@ chemholder = null return ..() -/datum/effect_system/smoke_spread/chem/set_up(datum/reagents/carry = null, radius = 1, loca, silent = FALSE, skip_finger = FALSE) +/datum/effect_system/smoke_spread/chem/set_up(datum/reagents/carry = null, radius = 1, loca, silent = FALSE) if(isturf(loca)) location = loca else diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index 1c0fc9da1d..5692eb99da 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -43,17 +43,17 @@ ..() if ((from.pH > 12.5) || (from.pH < 1.5)) to_chat(src, "You taste chemical burns!") - T.adjustTongueLoss(src, 5) - if (!has_trait(TRAIT_AGEUSIA)) //I'll let you get away with not having 1 damage. (add trait that lets you taste this) + T.adjustTongueLoss(src, 4) + if (!has_trait(TRAIT_AGEUSIA)) //I'll let you get away with not having 1 damage. switch(from.pH) - if(11.5 to 12.5) + if(11.5 to INFINITY) to_chat(src, "You taste a strong alkaline flavour!") T.adjustTongueLoss(src, 1) if(8.5 to 11.5) to_chat(src, "You taste a sort of soapy tone in the mixture.") if(2.5 to 5.5) to_chat(src, "You taste a sort of acid tone in the mixture.") - if(1.5 to 2.5) + if(-INFINITY to 2.5) to_chat(src, "You taste a strong acidic flavour!") T.adjustTongueLoss(src, 1) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 78ebb8cd24..e282d6b8bd 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -1,4 +1,3 @@ -im /proc/build_chemical_reagent_list() //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 5c2ff08342..e4c8e1b3b2 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -52,7 +52,7 @@ /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") - moveCalc = 1+((round(B.cached_size) - 9)/5) //Afffects how fast you move, and how often you can click. + moveCalc = 1+((round(B.cached_size) - 9)/3) //Afffects how fast you move, and how often you can click. if(!B) o.remove_movespeed_modifier("megamilk") sizeMoveMod(1) @@ -127,7 +127,7 @@ /datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/penis/P = o.getorganslot("penis") - moveCalc = 1+((round(P.length) - 21)/5) //effects how fast you can move + moveCalc = 1+((round(P.length) - 21)/3) //effects how fast you can move bloodCalc = 1+((round(P.length) - 21)/10) //effects how much blood you need (I didn' bother adding an arousal check because I'm spending too much time on this organ already.) if(!P) o.remove_movespeed_modifier("hugedick") @@ -511,8 +511,6 @@ //UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) //Should still make custom commands work after freedom, need to check. -//WORKS!! AAAAA - /datum/status_effect/chem/enthrall/proc/owner_hear(var/hearer, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) if (cTriggered == TRUE) return From 1ce25acb0c550867e88fedb1a2e80ecba7d81793 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 29 May 2019 05:41:33 +0100 Subject: [PATCH 188/608] Forgot to save this too. --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index fa8bb14a75..352f7f25ea 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -834,10 +834,10 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die antiGenetics-- if(0 to 30) to_chat(M, "Your body disperses from existence, as you become one with the universe.") - to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. - deadchat_broadcast("[M] has become one with the universe, meaning that their IC conciousness is continuous throughout death. If they find a way back to life, they are allowed to remember what was said in deadchat and their previous life. Be careful what you say. If they don't act IC while dead, bwoink the FUCK outta them.") + to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag, you do not remember the afterlife IC)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. + deadchat_broadcast("[M] has become one with the universe, meaning that their IC conciousness is continuous in a new life. If they find a way back to life, they are allowed to remember their previous life. Be careful what you say. If they abuse this, bwoink the FUCK outta them.") M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") - message_admins("[M] (ckey: [M.ckey]) has become one with the universe, and have continuous memories thoughout death should they find a way to come back to life (such as an inteligence potion, midround antag, ghost role). They MUST stay within characer while dead.") + message_admins("[M] (ckey: [M.ckey]) has become one with the universe, and have continuous memories thoughout their lives should they find a way to come back to life (such as an inteligence potion, midround antag, ghost role).") qdel(M) //Approx 60minutes till death from initial addiction ..() From 45149ffc118b847488e1f3d7181f58c7abf1bb19 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Wed, 29 May 2019 18:29:56 +0100 Subject: [PATCH 189/608] Beaker resistance check moved. --- code/modules/reagents/chemistry/holder.dm | 85 ++++++------------- code/modules/reagents/reagent_containers.dm | 33 +++++++ .../reagents/reagent_containers/glass.dm | 9 ++ 3 files changed, 70 insertions(+), 57 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index e282d6b8bd..0ed03c0c45 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -342,30 +342,6 @@ R.on_update (A) update_total() -//beaker check proc, -/datum/reagents/proc/beaker_check(atom/A) - if(istype(A, /obj/item/reagent_containers/glass/beaker/meta) || istype(A, /obj/item/reagent_containers/glass/bottle)) //prevent bottles from being dispenced and melting. - return - if(istype(A, /obj/item/reagent_containers/glass/beaker/plastic))//reaclly weird how this runtimes but the previous doesn't - if(chem_temp > 444)//assuming polypropylene - var/list/seen = viewers(5, get_turf(A)) - var/iconhtml = icon2html(A, seen) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s melts from the temperature!") - playsound(get_turf(A), 'sound/FermiChem/heatmelt.ogg', 80, 1) - - qdel(A) - return - else if(istype(A, /obj/item/reagent_containers/glass) && ((pH < 0.5) || (pH > 13.5)))//maybe make it higher? - var/list/seen = viewers(5, get_turf(A)) - var/iconhtml = icon2html(A, seen) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s melts from the extreme pH!") - playsound(get_turf(A), 'sound/FermiChem/acidmelt.ogg', 80, 1) - qdel(A) - return - - /datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION if(fermiIsReacting == TRUE) @@ -377,10 +353,6 @@ if(reagents_holder_flags & REAGENT_NOREACT) return - //QPlasticCheck - this is done to reduce calculations - if (istype(my_atom, /obj/item/reagent_containers/glass/beaker/plastic)) - beaker_check() - var/reaction_occurred = 0 // checks if reaction, binary variable var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. @@ -604,7 +576,7 @@ return -/datum/reagents/proc/FermiReact(selected_reaction, cached_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) +/datum/reagents/proc/FermiReact(selected_reaction, cached_temp, cached_pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) var/datum/chemical_reaction/fermi/C = selected_reaction var/deltaT = 0 var/deltapH = 0 @@ -614,40 +586,24 @@ var/purity = 1 //Begin checks - - //Check extremes first - if (cached_temp > C.ExplodeTemp) - //go to explode proc - fermiIsReacting = FALSE - C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) - STOP_PROCESSING(SSprocessing, src) - return - - //Make sure things are limited. - if (pH > 14) - pH = 14 - else if (pH < 0) - pH = 0 - //some beakers melt at extremes. - //For now, purity is handled elsewhere (on add) //Calculate DeltapH (Deviation of pH from optimal) //Lower range - if (pH < C.OptimalpHMin) - if (pH < (C.OptimalpHMin - C.ReactpHLim)) + if (cached_pH < C.OptimalpHMin) + if (cached_pH < (C.OptimalpHMin - C.ReactpHLim)) deltapH = 0 return//If outside pH range, no reaction else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/((C.ReactpHLim**C.CurveSharppH))) + deltapH = (((cached_pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/((C.ReactpHLim**C.CurveSharppH))) //Upper range - else if (pH > C.OptimalpHMax) - if (pH > (C.OptimalpHMax + C.ReactpHLim)) + else if (cached_pH > C.OptimalpHMax) + if (cached_pH > (C.OptimalpHMax + C.ReactpHLim)) deltapH = 0 return //If outside pH range, no reaction else - deltapH = (((- pH + (C.OptimalpHMax + C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH))//Reverse - to + to prevent math operation failures. + deltapH = (((- cached_pH + (C.OptimalpHMax + C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH))//Reverse - to + to prevent math operation failures. //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + else if (cached_pH >= C.OptimalpHMin && cached_pH <= C.OptimalpHMax) deltapH = 1 //This should never proc: else @@ -711,6 +667,22 @@ pH += (C.HIonRelease * addChemAmmount) //keep track of the current reacted amount reactedVol = reactedVol + addChemAmmount + + //Check extremes + if (chem_temp > C.ExplodeTemp) + //go to explode proc + fermiIsReacting = FALSE + C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) + STOP_PROCESSING(SSprocessing, src) + return + + //Make sure things are limited. + if (pH > 14) + pH = 14 + else if (pH < 0) + pH = 0 + //some beakers melt at extremes. This proc is called in add_reagent + //return said amount to compare for next step. return (reactedVol) @@ -815,7 +787,6 @@ chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), min_temp, max_temp) /datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, other_purity = 1, other_pH, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ - //beaker_check(my_atom) if(!isnum(amount) || !amount) return FALSE @@ -841,8 +812,6 @@ s.start() return FALSE - beaker_check(my_atom) //Beaker resilience test - if(!pH) other_pH = D.pH @@ -869,10 +838,11 @@ chem_temp = thermal_energy / (specific_heat * new_total) //// - //pH = round(-log(10, ((cached_total * (10^(-cached_pH))) + (amount * (10^(-other_pH)))) / new_total), REAGENT_PH_ACCURACY) I think this is wrong? I'm getting negative numbers? + //cacluate reagent based pH shift. pH = ((cached_pH * cached_total)+(D.pH * amount))/(cached_total + amount)//should be right - //add the reagent to the existing if it exists + holder.pH_check()//checks beaker resilience + //add the reagent to the existing if it exists for(var/A in cached_reagents) var/datum/reagent/R = A if (R.id == reagent) @@ -954,6 +924,7 @@ pH = 7 else pH = ((pH * total_volume)-(R.pH * amount))/(total_volume - amount) + holder.pH_check() amount = CLAMP(amount, 0, R.volume) R.volume -= amount update_total() diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index aa5fbfa596..85304519c1 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -11,6 +11,8 @@ var/spawned_disease = null var/disease_amount = 20 var/spillable = FALSE + var/pH_immunne = TRUE//true for now, just so things that shouldn't melt don't. + var/temp_immune = TRUE /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() @@ -122,9 +124,40 @@ reagents.clear_reagents() +//melts plastic beakers /obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M) reagents.expose_temperature(1000) + if(temp_immune == TRUE) + return + var/list/seen = viewers(5, get_turf(src)) + var/iconhtml = icon2html(src, seen) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [src]'s melts from the temperature!") + playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) + qdel(A) ..() +//melts plastic beakers /obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) reagents.expose_temperature(exposed_temperature) + if(temp_immune == TRUE) + return + if(reagents.chem_temp > 444)//assuming polypropylene + var/list/seen = viewers(5, get_turf(src)) + var/iconhtml = icon2html(src, seen) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [src]'s melts from the temperature!") + playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) + qdel(A) + +//melts glass beakers +/obj/item/reagent_containers/proc/pH_check() + if(pH_immunne == TRUE) + return + else if((pH < 0.5) || (pH > 13.5)) + var/list/seen = viewers(5, get_turf(src)) + var/iconhtml = icon2html(A, seen) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [my_atom]'s melts from the extreme pH!") + playsound(get_turf(src), 'sound/FermiChem/acidmelt.ogg', 80, 1) + qdel(A) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 14323c405f..b52d74bfd0 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -113,6 +113,7 @@ icon_state = "beaker" item_state = "beaker" materials = list(MAT_GLASS=500) + pH_immunne = FALSE /obj/item/reagent_containers/glass/beaker/Initialize() . = ..() @@ -164,6 +165,7 @@ volume = 100 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100) + pH_immunne = FALSE /obj/item/reagent_containers/glass/beaker/plastic name = "x-large beaker" @@ -173,6 +175,7 @@ volume = 150 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,150) + temp_immune = FALSE /obj/item/reagent_containers/glass/beaker/plastic/update_icon() icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states @@ -211,6 +214,7 @@ volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300) + pH_immunne = FALSE /obj/item/reagent_containers/glass/beaker/cryoxadone list_reagents = list("cryoxadone" = 30) @@ -267,6 +271,7 @@ SLOT_L_STORE, SLOT_R_STORE,\ SLOT_GENERC_DEXTROUS_STORAGE ) + pH_immunne = FALSE /obj/item/reagent_containers/glass/bucket/attackby(obj/O, mob/user, params) if(istype(O, /obj/item/mop)) @@ -316,6 +321,8 @@ materials = list(MAT_GLASS=0) volume = 50 amount_per_transfer_from_this = 10 + pH_immunne = FALSE + temp_immune = FALSE /obj/item/reagent_containers/glass/beaker/waterbottle/empty list_reagents = list() @@ -327,6 +334,8 @@ list_reagents = list("water" = 100) volume = 100 amount_per_transfer_from_this = 20 + pH_immunne = FALSE + temp_immune = FALSE /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty list_reagents = list() From 6811896f34b108b2fe92d4fdc38ddef97ea37b11 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Wed, 29 May 2019 18:30:22 +0100 Subject: [PATCH 190/608] Bloodmath redone. --- code/modules/mob/living/blood.dm | 35 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index a3c888ebfc..bb7e38f91d 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -56,23 +56,24 @@ //Effects of bloodloss var/word = pick("dizzy","woozy","faint") //switch(blood_volume) Used to be a switch statement; now it uses ifs (so blood ratio can work.) Check my logic please. - if(((BLOOD_VOLUME_OKAY * blood_ratio) < blood_volume) && (blood_volume <= (BLOOD_VOLUME_SAFE * blood_ratio))) - if(prob(5)) - to_chat(src, "You feel [word].") - adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.01, 1)) - else if(((BLOOD_VOLUME_BAD * blood_ratio) < blood_volume) && (blood_volume <=(BLOOD_VOLUME_OKAY*blood_ratio))) - adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1)) - if(prob(5)) - blur_eyes(6) - to_chat(src, "You feel very [word].") - else if( ((BLOOD_VOLUME_SURVIVE * blood_ratio) < blood_volume) && (blood_volume <= (BLOOD_VOLUME_BAD * blood_ratio))) - adjustOxyLoss(5) - if(prob(15)) - Unconscious(rand(20,60)) - to_chat(src, "You feel extremely [word].") - else if((-INFINITY < blood_volume) && (blood_volume <= (BLOOD_VOLUME_SURVIVE * blood_ratio))) - if(!has_trait(TRAIT_NODEATH)) - death() + switch(blood_volume * INVERSE(blood_ratio)) + if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) + if(prob(5)) + to_chat(src, "You feel [word].") + adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.01, 1)) + if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) + adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1)) + if(prob(5)) + blur_eyes(6) + to_chat(src, "You feel very [word].") + if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) + adjustOxyLoss(5) + if(prob(15)) + Unconscious(rand(20,60)) + to_chat(src, "You feel extremely [word].") + if(-INFINITY to BLOOD_VOLUME_SURVIVE) + if(!has_trait(TRAIT_NODEATH)) + death() var/temp_bleed = 0 //Bleeding out From af80bf32041a98b8be5ec7c8078de85ebd7af601 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Wed, 29 May 2019 18:41:51 +0100 Subject: [PATCH 191/608] MINUTE defines. --- code/__DEFINES/time.dm | 7 ++++- code/datums/mood_events/drink_events.dm | 8 +++--- .../mood_events/generic_negative_events.dm | 28 ++++++++++--------- .../mood_events/generic_positive_events.dm | 10 +++---- code/datums/mood_events/needs_events.dm | 2 +- .../code/datums/mood_events/chem_events.dm | 4 +-- .../mood_events/generic_negative_events.dm | 8 +++--- .../mood_events/generic_positive_events.dm | 8 +++--- 8 files changed, 41 insertions(+), 34 deletions(-) diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index c5d6f3051e..41a4ae3273 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -31,4 +31,9 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using #define WORLDTIMEOFDAY2TEXT(format) GAMETIMESTAMP(format, world.timeofday) #define TIME_STAMP(format, showds) showds ? "[WORLDTIMEOFDAY2TEXT(format)]:[world.timeofday % 10]" : WORLDTIMEOFDAY2TEXT(format) #define STATION_TIME(display_only) ((((world.time - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0) -#define STATION_TIME_TIMESTAMP(format) time2text(STATION_TIME(TRUE), format) \ No newline at end of file +#define STATION_TIME_TIMESTAMP(format) time2text(STATION_TIME(TRUE), format) + +//For moodlets +#define ONEMINUTE 600 +#define TWOMINUTES 1200 +#define THREEMINUTES 1800 diff --git a/code/datums/mood_events/drink_events.dm b/code/datums/mood_events/drink_events.dm index db5a91009e..dff72feeb7 100644 --- a/code/datums/mood_events/drink_events.dm +++ b/code/datums/mood_events/drink_events.dm @@ -6,19 +6,19 @@ /datum/mood_event/quality_nice description = "That drink wasn't bad at all.\n" mood_change = 1 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/quality_good description = "That drink was pretty good.\n" mood_change = 2 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/quality_verygood description = "That drink was great!\n" mood_change = 3 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/quality_fantastic description = "That drink was amazing!\n" mood_change = 4 - timeout = 1200 + timeout = TWOMINUTES diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index c9a5b80060..376510fe59 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -1,3 +1,5 @@ + + /datum/mood_event/handcuffed description = "I guess my antics have finally caught up with me.\n" mood_change = -1 @@ -17,7 +19,7 @@ /datum/mood_event/burnt_thumb description = "I shouldn't play with lighters...\n" mood_change = -1 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/cold description = "It's way too cold in here.\n" @@ -30,17 +32,17 @@ /datum/mood_event/creampie description = "I've been creamed. Tastes like pie flavor.\n" mood_change = -2 - timeout = 1800 + timeout = THREEMINUTES /datum/mood_event/slipped description = "I slipped. I should be more careful next time...\n" mood_change = -2 - timeout = 1800 + timeout = THREEMINUTES /datum/mood_event/eye_stab description = "I used to be an adventurer like you, until I took a screwdriver to the eye.\n" mood_change = -4 - timeout = 1800 + timeout = THREEMINUTES /datum/mood_event/delam //SM delamination description = "Those God damn engineers can't do anything right...\n" @@ -50,12 +52,12 @@ /datum/mood_event/depression description = "I feel sad for no particular reason.\n" mood_change = -9 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/shameful_suicide //suicide_acts that return SHAME, like sord description = "I can't even end it all!\n" mood_change = -10 - timeout = 600 + timeout = ONEMINUTE /datum/mood_event/dismembered description = "AHH! I WAS USING THAT LIMB!\n" @@ -69,7 +71,7 @@ /datum/mood_event/tased description = "There's no \"z\" in \"taser\". It's in the zap.\n" mood_change = -3 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/embedded description = "Pull it out!\n" @@ -78,7 +80,7 @@ /datum/mood_event/table description = "Someone threw me on a table!\n" mood_change = -2 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/table/add_effects() if(ishuman(owner)) @@ -118,9 +120,9 @@ mood_change = -4 /datum/mood_event/healsbadman - description = "I feel a lot better, but wow that was disgusting.\n" //when you read the latest felinid removal PR and realize you're really not that much of a degenerate + description = "I feel a lot better, but wow that was disgusting.\n" mood_change = -4 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/jittery description = "I'm nervous and on edge and I can't stand still!!\n" @@ -129,17 +131,17 @@ /datum/mood_event/vomit description = "I just threw up. Gross.\n" mood_change = -2 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/vomitself description = "I just threw up all over myself. This is disgusting.\n" mood_change = -4 - timeout = 1800 + timeout = THREEMINUTES /datum/mood_event/painful_medicine description = "Medicine may be good for me but right now it stings like hell.\n" mood_change = -5 - timeout = 600 + timeout = ONEMINUTE //These are unused so far but I want to remember them to use them later /datum/mood_event/cloned_corpse diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 2cd4d951d7..a92e946526 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -1,7 +1,7 @@ /datum/mood_event/hug description = "Hugs are nice.\n" mood_change = 1 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/arcade description = "I beat the arcade game!\n" @@ -50,7 +50,7 @@ /datum/mood_event/jolly description = "I feel happy for no particular reason.\n" mood_change = 6 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/focused description = "I have a goal, and I will reach it, whatever it takes!\n" //Used for syndies, nukeops etc so they can focus on their goals @@ -74,7 +74,7 @@ /datum/mood_event/goodmusic description = "There is something soothing about this music.\n" mood_change = 3 - timeout = 600 + timeout = ONEMINUTE /datum/mood_event/chemical_euphoria description = "Heh...hehehe...hehe...\n" @@ -83,9 +83,9 @@ /datum/mood_event/chemical_laughter description = "Laughter really is the best medicine! Or is it?\n" mood_change = 4 - timeout = 1800 + timeout = THREEMINUTES /datum/mood_event/chemical_superlaughter description = "*WHEEZE*\n" mood_change = 12 - timeout = 1800 + timeout = THREEMINUTES diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm index 75b7e6931f..30b9d64953 100644 --- a/code/datums/mood_events/needs_events.dm +++ b/code/datums/mood_events/needs_events.dm @@ -59,4 +59,4 @@ /datum/mood_event/nice_shower description = "I have recently had a nice shower.\n" mood_change = 2 - timeout = 1800 + timeout = THREEMINUTES diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index 4e1be8d67f..c82615d796 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -10,14 +10,14 @@ /datum/mood_event/enthrallpraise mood_change = 10 - timeout = 600 + timeout = ONEMINUTE /datum/mood_event/enthrallpraise/add_effects(message) description = "[message]\n" /datum/mood_event/enthrallscold mood_change = -10 - timeout = 600 + timeout = ONEMINUTE /datum/mood_event/enthrallscold/add_effects(message) description = "[message]\n"//aaa I'm not kinky enough for this diff --git a/modular_citadel/code/datums/mood_events/generic_negative_events.dm b/modular_citadel/code/datums/mood_events/generic_negative_events.dm index c0f2591656..93c4cfe59c 100644 --- a/modular_citadel/code/datums/mood_events/generic_negative_events.dm +++ b/modular_citadel/code/datums/mood_events/generic_negative_events.dm @@ -3,19 +3,19 @@ /datum/mood_event/plushjack description = "I have butchered a plush recently.\n" mood_change = -1 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/plush_nostuffing description = "A plush I tried to pet had no stuffing...\n" mood_change = -1 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/emptypred description = "I had to let someone out.\n" mood_change = -2 - timeout = 600 + timeout = ONEMINUTE /datum/mood_event/emptyprey description = "It feels quite cold out here.\n" mood_change = -2 - timeout = 600 \ No newline at end of file + timeout = ONEMINUTE diff --git a/modular_citadel/code/datums/mood_events/generic_positive_events.dm b/modular_citadel/code/datums/mood_events/generic_positive_events.dm index 717fe5a47d..ff6944201b 100644 --- a/modular_citadel/code/datums/mood_events/generic_positive_events.dm +++ b/modular_citadel/code/datums/mood_events/generic_positive_events.dm @@ -3,12 +3,12 @@ /datum/mood_event/headpat description = "Headpats are nice.\n" mood_change = 2 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/hugbox description = "I hugged a box of hugs recently.\n" mood_change = 1 - timeout = 1200 + timeout = TWOMINUTES /datum/mood_event/plushpet description = "I pet a plush recently.\n" @@ -24,11 +24,11 @@ description = "I came!\n" //funny meme haha mood_change = 3 timeout = 1000 - + /datum/mood_event/fedpred description = "I've devoured someone!\n" mood_change = 3 /datum/mood_event/fedprey description = "It feels quite cozy in here.\n" - mood_change = 3 \ No newline at end of file + mood_change = 3 From 6117e3a6aa87b7a29a1ff6f139548701372e8f4f Mon Sep 17 00:00:00 2001 From: Thalpy Date: Wed, 29 May 2019 19:09:40 +0100 Subject: [PATCH 192/608] Fixes to the hypnoflash, --- code/__DEFINES/status_effects.dm | 2 ++ code/datums/status_effects/debuffs.dm | 19 +++++++++++++++++++ code/modules/assembly/flash.dm | 9 +++++---- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index ffaaa04d0f..3cd64af8c7 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -44,6 +44,8 @@ #define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep +#define STATUS_EFFECT_PACIFY /datum/status_effect/pacify //the affected is pacified, preventing direct hostile actions + #define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run #define STATUS_EFFECT_GEISTRACKER /datum/status_effect/geis_tracker //if you're using geis, this tracks that and keeps you from using scripture diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index ec8093b782..db2761356a 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -508,6 +508,25 @@ icon_state = "ichorial_stain" alerttooltipstyle = "clockcult" +datum/status_effect/pacify + id = "pacify" + status_type = STATUS_EFFECT_REPLACE + tick_interval = 1 + duration = 100 + alert_type = null + +/datum/status_effect/pacify/on_creation(mob/living/new_owner, set_duration) + if(isnum(set_duration)) + duration = set_duration + . = ..() + +/datum/status_effect/pacify/on_apply() + owner.add_trait(TRAIT_PACIFISM, "status_effect") + return ..() + +/datum/status_effect/pacify/on_remove() + owner.remove_trait(TRAIT_PACIFISM, "status_effect") + /datum/status_effect/trance id = "trance" status_type = STATUS_EFFECT_UNIQUE diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index c723e5fed9..fbcc55896d 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -12,6 +12,7 @@ crit_fail = FALSE //Is the flash burnt out? light_color = LIGHT_COLOR_WHITE light_power = FLASH_LIGHT_POWER + var/flashing_overlay = "flash-f" var/times_used = 0 //Number of times it's been used. var/burnout_resistance = 0 var/last_used = 0 //last world.time it was used. @@ -36,8 +37,8 @@ add_overlay("flashburnt") attached_overlays += "flashburnt" if(flash) - add_overlay("flash-f") - attached_overlays += "flash-f" + add_overlay(flashing_overlay) + attached_overlays += flashing_overlay addtimer(CALLBACK(src, .proc/update_icon), 5) if(holder) holder.update_icon() @@ -317,7 +318,7 @@ //ported from tg - check to make sure it can't appear where it's not supposed to. /obj/item/assembly/flash/hypnotic desc = "A modified flash device, programmed to emit a sequence of subliminal flashes that can send a vulnerable target into a hypnotic trance." - //flashing_overlay = "flash-hypno" doesn't seem to be in citcode yet. + flashing_overlay = "flash-hypno" //I cannot find this icon no matter how hard I look in tg, so I might just make my own. light_color = LIGHT_COLOR_PINK cooldown = 20 @@ -346,7 +347,7 @@ M.confused += min(M.confused + 10, 20) M.dizziness += min(M.dizziness + 10, 20) M.drowsyness += min(M.drowsyness + 10, 20) - //M.apply_status_effect(STATUS_EFFECT_PACIFY, 100) for when we port apply_status_effect pacifist (maybe I'll do it) + M.apply_status_effect(STATUS_EFFECT_PACIFY, 100) else M.apply_status_effect(/datum/status_effect/trance, 200, TRUE) From 71eb28547227011a362fbfdc23dd7e85279ef0a7 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Wed, 29 May 2019 20:04:52 +0100 Subject: [PATCH 193/608] Few tweaks and fixes to last commits. --- code/datums/traits/negative.dm | 2 +- .../mob/living/simple_animal/friendly/cat.dm | 7 ++++--- code/modules/reagents/chemistry/holder.dm | 8 ++++++-- code/modules/reagents/reagent_containers.dm | 16 ++++++++-------- .../reagents/reagent_containers/bottle.dm | 4 +++- .../reagents/reagent_containers/glass.dm | 5 +++++ icons/obj/assemblies/new_assemblies.dmi | Bin 12380 -> 12493 bytes 7 files changed, 27 insertions(+), 15 deletions(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 95595ef713..3a8b58d146 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -336,7 +336,7 @@ /datum/quirk/hypno/add() //You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic! - addtimer(CALLBACK(src, /datum/quirk/Hypno.proc/triggered, quirk_holder), rand(12000, 36000))//increase by 100, it's lower so I can test it. + addtimer(CALLBACK(src, /datum/quirk/hypno.proc/triggered, quirk_holder), rand(12000, 36000))//increase by 100, it's lower so I can test it. //DOES NOT give any indication when someone is triggered - this is intentional so people don't abuse it, you're supposed to get a random thing said to you as a mini objective. /datum/quirk/hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 867c3787bc..36b17dc84c 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -358,7 +358,7 @@ required_reagents[pick(additions)] = rand(1, 5)//weird /datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. - message_admins("Someone found the hidden reaction. Amazing!! Please tell Fermis!!") + SSblackbox.record_feedback("catgirlium", "catgirlium made!")//log //ReagentVars //Turns you into a cute catto while it's in your system. @@ -400,7 +400,8 @@ catto.name = H.name catto.desc = "A cute catto! They remind you of [H] somehow." catto.color = "#[H.dna.features["mcolor"]]" - H.forceMove(locate(10,6,1))//To the zelda room. + //H.forceMove(locate(10,6,1))//To the zelda room. + H.moveToNullspace() /datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) if(prob(5)) @@ -410,7 +411,7 @@ /datum/reagent/fermi/secretcatchem/on_mob_delete(mob/living/carbon/H) var/words = "Your body shifts back to normal." - do_teleport(H, catto.loc) + H.forceMove(catto) catto.mind.transfer_to(H) if(catshift == TRUE) words += " ...But wait, are those ears and a tail?" diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 0ed03c0c45..2b282cd8d6 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -840,7 +840,9 @@ //cacluate reagent based pH shift. pH = ((cached_pH * cached_total)+(D.pH * amount))/(cached_total + amount)//should be right - holder.pH_check()//checks beaker resilience + if(istype(my_atom, /obj/item/reagent_containers/)) + var/obj/item/reagent_containers/RC = my_atom + RC.pH_check()//checks beaker resilience //add the reagent to the existing if it exists for(var/A in cached_reagents) @@ -924,7 +926,9 @@ pH = 7 else pH = ((pH * total_volume)-(R.pH * amount))/(total_volume - amount) - holder.pH_check() + if(istype(my_atom, /obj/item/reagent_containers/)) + var/obj/item/reagent_containers/RC = my_atom + RC.pH_check()//checks beaker resilience) amount = CLAMP(amount, 0, R.volume) R.volume -= amount update_total() diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 85304519c1..5a5a728a47 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -131,10 +131,10 @@ return var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [src]'s melts from the temperature!") + for(var/mob/H in seen) + to_chat(H, "[iconhtml] \The [src]'s melts from the temperature!") playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) - qdel(A) + qdel(src) ..() //melts plastic beakers @@ -148,16 +148,16 @@ for(var/mob/M in seen) to_chat(M, "[iconhtml] \The [src]'s melts from the temperature!") playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) - qdel(A) + qdel(src) //melts glass beakers /obj/item/reagent_containers/proc/pH_check() if(pH_immunne == TRUE) return - else if((pH < 0.5) || (pH > 13.5)) + else if((reagents.pH < 0.5) || (reagents.pH > 13.5)) var/list/seen = viewers(5, get_turf(src)) - var/iconhtml = icon2html(A, seen) + var/iconhtml = icon2html(src, seen) for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s melts from the extreme pH!") + to_chat(M, "[iconhtml] \The [src]'s melts from the extreme pH!") playsound(get_turf(src), 'sound/FermiChem/acidmelt.ogg', 80, 1) - qdel(A) + qdel(src) diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 66befb1bb6..b0c759e005 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -7,6 +7,8 @@ item_state = "atoxinbottle" possible_transfer_amounts = list(5,10,15,25,30) volume = 30 + temp_immune = TRUE //required so that things don't melt when you dispence them in the chem_master. + pH_immunne = TRUE /obj/item/reagent_containers/glass/bottle/Initialize() @@ -240,7 +242,7 @@ name = "Rhinovirus culture bottle" desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium." spawned_disease = /datum/disease/advance/cold - + /obj/item/reagent_containers/glass/bottle/flu_virion name = "Flu virion culture bottle" desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium." diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index b52d74bfd0..2cb90e6cde 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -176,6 +176,7 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,150) temp_immune = FALSE + pH_immunne = TRUE /obj/item/reagent_containers/glass/beaker/plastic/update_icon() icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states @@ -190,6 +191,8 @@ volume = 200 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,200) + temp_immune = TRUE + pH_immunne = TRUE /obj/item/reagent_containers/glass/beaker/noreact name = "cryostasis beaker" @@ -199,6 +202,8 @@ materials = list(MAT_METAL=3000) volume = 50 amount_per_transfer_from_this = 10 + temp_immune = TRUE + pH_immunne = TRUE /obj/item/reagent_containers/glass/beaker/noreact/Initialize() . = ..() diff --git a/icons/obj/assemblies/new_assemblies.dmi b/icons/obj/assemblies/new_assemblies.dmi index df9517aeaa5f13599f50c557131d2d4d64651128..fa0c138d21d5573bc8d1184ade0c3cba4b6c5d84 100644 GIT binary patch literal 12493 zcmb_@bzGEfx9&4^rwG!Bbc=L@fHczG0@5WQIdnHjw;+O~bPf#)0@7X5EzJ<;@qNE< zpB>*m`<&nJ{4v7}+|M2BUhBG65uvIqi;Y2w0RRBD+^d&r000pOU({$Q;BR^@N{_)W zNnRQ{ZZF@sn!CJpa(nCO005p@*~v-{U7UC!(#r zYZyO_gFNaDUr1_R!pdnFmUIa-6rl8WFe+ap)bzx&72;0&r=>_jbU4hk$xrw76@Drk z&j%$@_O^3NDqu_m+rK@@5kT4vBf_+fee5DvXdTLkQS~CyGEFyo<1r$Q)%5q4aN?7- z*OvwII;_!?lGy^)P6Q0BlJ61JZ*l$iq_7EId@nz-ZgJcTDU4~*=$d?CqeehEI-AWX zlt)v%jqj$s|Qe(}pSeh|(&kZQo-^d!EkNVQQb)$+_;M;)fbp z0H6lsUP@?qW*sbg`)F)riye=o55A$-mP8285T}k&LNEh-o$(1cs9RjhQi{_oZ^s&I z4UnWIrfV-6>MJnH=t}ac2jX;W3eOrA=3-3dtB5Q#(I7OW1)VR^LXid(6Vnx+pYBsJ zY+2B!#}5rP4Gmql8&|eIPqk>b+7vhy7lYAM~A$+AhuJYTtTZ%vz<-jlT>eM5ab(mb{{S_H5<%#&xLz-s6NC9ZEIRIbY^09166N=S7_*Slq*z6gGBv4ez(&Y z!))gq6PN7|nQFDC_aR)cHgi!TDt)T-IP?Bkrk`;5)wc00LvGgg}~ zV8ZhZk?H3M(a0nwbdZZFsm}p)NZ!2+o+*)zoF0~lwoApTDsDUyktyvfV`IN-x_bNh z;+;I|r9$ADgcT^dyV#q&W7_t-zwU|xLlzV(hPY(7DB~8pkvlA-@g6KI&S$qJkoh7SQ?H);*<4#PF?3CCYs9>fpy?dG`Tn}-kM5p^&o zpP%AccHQJo(QX_h`*pwz#Gk2grYkC5EnRA=tJ4npJRXHG1{+ICA^_p0g%)V+;J%*3 z^hrGYu&Fcq`B5&B2Maa=Xq6EG$M^6f*QSoyAH@yRYuo+q4IS%;!^vz&ZH8?sDk`aG z+|+YC$?r#&uUUt3{ihH>irol#t*7NZ#~?Lno#%;JT$}<|2eKVdp;H|wayrCKnVZS) z{4~e+Lbq6h;~15zzslzM1KoqH63gM73*vqICV^#9f0RG>efZgYQnZYD$MJh>CMQ~G zkwWV4velx8VjY#efdpDgs$2or;(1koMyKV#oh7m^X?1W^O5T|o5PA~lU+8qYPwOG zU$od{bLTFjeF_!?0rM+E*18m&vr$Cv>Y>g~xGq9KPAr=PE`ZU%fbd4n56 zsdCB?bCfh$krsCmBPX8)NMm*~3=9mwP{+lb<_GFMzbyjL;Tam;Y$&#P=YO)wbNcNj z!MxI~%fktY2LlYVD-j)3pwZTY85Bq2(>i2ss~*dn%xz|@IT z^pR0ea0I7MNahd}KdyX6WefxNG#x`N)`Pp4qwYc*K55hIU$4~tkhRi)&~dH~Frsj# zbofhNwcx(i)@Hc#gECk~G+fW&?HSp%gwKCu-3(}uZC1U)XY$;Ie4{Zz#6ydYp+4$( z5VZo;+|Y3G-Gg#$b{^serw|5D!3z};aj8k7!9Aqj*im2K>y6YIP@cX_=;*I2F#Sxo zd*AVqtopq=LSwT-zc_0o9hX9T9r~$`N`SW>*$o#&a{FmA1dMC*0Cbv{%5I|nKY>9C zmIdD|^_%l~DrRG~^BM?65EQHDRTWZT-$tmas)~n*`}v7_uLPj#fInS*4We*TsD5n@ zVU{mJ>RkQvXMU*tev@;u8$C+KYi9zCPELl*%;;!nX+33Q!>+5V8~E`fbl9@HFNW-m zzB19HM^zs`K1&<6?CI&r%g=`l4h~w|+DaK1kY{9Op8OCxvUU*=uv+rnSG`6}Z1u3& zg3-MZQee{AN~b|Jk&u8OLP6ssiIJJH;{~9dCeTTnkTL6?*{@a*@ek?hoMF-Guab>l&iGjSPrYBIJqg*bORc^dp zJ=VwDZh{|+iwiz~9z42KIrtLe{y~j%gj=ee*}%-~sgdA&0)_c`F3Ta3tk0q>qI@*m znD+MeBw~KTf`Wp#eo}}}c?^Q=|14H3vA8o4QTuML*-irSQJ@poI; zxr#J&b6Ez8Yap=K*21=$XhYKgXGEt06XsO5Ccqfb9yyQTwK&pRpTomrlO*v zPU{zIr(dlWb}@r*tV&0oii%QladF|*i(j*diRJe8^iYe68W}VjRkjaXO4-@%#~bI) zHEA<8d`*^ooAczi17~%0^_{y^#z%Dr4pJ2bA(itD9pe@7YrH*-n<)?9_L`cXTV4}C=B%xlkWYoVf5lMe{QUZD2Pu#0 z?C96e22n(lYMp15N!i(p`h`}}#q>|fd4QXC|2~q$q$E1Bk9?#tP84JWXXPBij+`X% zA3kilir8%BkkTxH^51-KIl#sC@sn+84Sj+Cw0ebe1c<&8d#->R`=FTBk^z11s?_5s zWRxI??vr$fb7aXoP%CTe>kG=uv0K~^5-sekrz;E%^!3R=dqFK119cjtOwejYrwiSu zWI)SH11;|ofcPnV8&uc4BbD_GYFHGMtLI}HN&}@Cc^<;1BzgBa=@T_QJ&Nn*Vn2W~ z?Tq0c92VAXQ@57s*bae0mi>KvgeweNLK_?TIb*fA%vHYkCvGkgS%LXI90VvMN5X>QaLwZd)r#~Vgvyi8;jG^-)}By`Iz3qvdRAK zw{HV46*XS?y*p#f$jERixkXei-00|R45ycva1kF=EiCG zY^>~Sza|Gd=bQ)v=)MBAfpY?9$cxtiB0_e85?M*M6eZ}O(qu@B{0~&pDoBP!6P$Xg z@^Dt{1V8q_n;x0Sdb}pI3;Azj3`tR-s8I)p=Glu7AK;?Jgo!5jY_w;mYP;t{FrJEJ z2Pzu0IRO0hYzOifO_PM@}&OoqHt}R8ryMfBxh%$Nq&(-dPj0|RJ zUCCGB$3g%L3yW!;UN5|QjLShglvq-=k-uivE>t6RV7}c~$ci_!)0rH!wMu>ep)@W| z(wH@70h-_|U*5FZ+7}?Nk;8xa_Z&OZ1&@M9N#n8?%u;3mZ+I5G-dmi`+gqOx$;rVW z$B~O%oaCLaudU&ck?lF^N(Kh*J+bv6+O=vvX+hP|*T>8pMgdm%MaO?080!2y5N}>= zYv}z4LPh@GJCpsP1cu=d*rg z`Cb1GfYiR+Bf!9eHFkAL7LV_s{5$wjOQwIe5^}R!_UP6K83z|P3^YEzWgo;mk0GTi z{4Pci#G|=-dVA%XiTK&saR5%cnX0`h)GNwD+qe|aSxO{FSJT!G^QbiFoETIGxh1u{ z3h1E911VqkXF05*Y+RB;A@>FZ#qg-8ZqR+`J&~70OW1!E-_!Flnp}Y3-Me>Ag4y9Q zF$W&c(E6QgD9{n|mJ_IfzfJZJ4!z*z{h0tp+X){Tq|&&LMBPE~!61=*r5b-_fmYjq zMDxt^m7gH1;Q6E12!-~pZF^;Bo1i}3AncjV-EtmD!+Z*Cw(Y=)oz?Tj-MIcpr!KOQIk zFypli;m^5Yas$%Zy7#6FW2l4UA=ST}Y9DI8AIPHhI3Bg@U&nA6W&^-oR0ko|&yF+D z1swNY&Ml;*rjdB{*;$|>A9JkZa2XNlsp>F^!-wV-lQh?rt?2GnzovLJ@#(K|SCRDw zHVPoo$j5!Z`<0JONwwT^ia2x)Urt%ZE5Jp(objq!c0jtk0+Vmv8`4g3<)}vQJNHsC zBY}Eiz)TRrKS{}mkJNzSKc{5qpT?{WA z;>2w9PJ7n*ui$*u;KLoK30ao1;hpb8>AiCcHc&G}HIZP_p@a$j=b*((b` z$z)=?uMb9UZUt*G6ko-^wlQ#+j`a{wfscpD}bpE0t-;e>O9-6 zuqSIiH)0qtyqBp(SoSt?ou7Z~zz&ehAe{UhKC#tb5u+e2^iyN)iq_O+-NwojQp zM_gh>VVK_TJt28~OZ9T$1KW~TkT+bxUspzHZx;#JHr_wb0ry7+z;;r|+AlT4G_Ed~ zcF(TdthnfLqEG+>W`A7s4_^{png`BHnlz?%ATV>dt8-y;28O-KkAPfm9CZgl$ux^) zGD~iSb2SSz1pCj52ONmLB#r%3L3i$jS9t%hOJbtRfoE8M7I+N(aj#wUGv+p@V_Y&Y zU|iy$5|2Ic$ka8?aog8!ar`#MDad7f^>e$tR;3Z!4u8}LBD%WEQShAw9XpS2Om)bJ zoPd%AUYD9~8dq=8ZxP+!#M3(vE55o80xV~fOum4+256Kr61RW9qrHb9P(0+h2R+xE z!?5F3XenM*$94Mty`y&__ZEweNBiW}j)dL&>xM=?tBj9?G8HQ2MZep=7URs^>l@vd zn~moqSGHFZUT!LOmpLZ??pVG-Jj{M4^zeS9+3?~9d>-|S*n`+oe4C#!eNqIQQ7Z|3 zl3dN%WizUdnky0fBE@vItJSY#>!F`)p!poDoGRuF< z-uGBEmPbXnVjy;a>VBOYHhWMl3ViW(i`gFs8p9TIM7&Y%;AdxUX^Ql`$#`deSfiFG z+GhyC+V15rqZD@{>k?T}tPl=a*%HI$Byk;P*SPY_nR~T3iPF34GDBmh)-_s1^2ag% zfDmTB&AG4UEjH(dLsJU!H>Y8c%=BDdSw7ef^!SxisE$(~{}4ZinYQ~&71)M{Knv;Jm!VuG5E4*C52{FR)X z#JhJq&!0cL#a9{$3koHD8*uny+79>*~%PU1obMMcmxHhq>gnTP(#Jjl+Ro6<=3pn2#WHxreNe z9aRR~)C~^I57<^l$60pL1t?U+5J0*{oIkUDh@6{)l|K|+d5Jq7h1E5L8+T2LHIwzT zh!Q*;Tm(+uPg1;svZbW_Qh+N|>-{L#{bU3eq7bRcQ=%W`aSTOx0l3%HJC%U`0 zw&nYVlDK#6RylRFx3^#7D#YSm z^Ryj8TtaokKM`ATT1lmNMp7ylhnl8#tl>6$IDg);-Jkb}KZ2xnoX(K{2xSIij_l=} zH5I8}Z<~jf&mEwg!@bzF{pa_~AtTpMWNZS!OUt|4fU%}tpBNg?8zX?vEYB~GASeBj zVq9`EoOg0R6|$UX^+73tnQ&4I36TLEMZ{1~<16grHt|{apw(z+p#Qu=&&A-V^Xm0) z^1NYe6$r6IPtotoo_^4R!$PJBuDJ5fRS=x0qCG&Nfe=3buoNL`;6t&Rrk{@kdL-4T zob|`fS(3JY!i;duK%G_?QshL(e*i{uOza($>}FYws}OGG=Cul$3il3_VLrBBh1__9qk-INPr!ytgIry%Qqhe$GE`R=XnqKrk1mxxAHFB5>lBJ^_SA!uXm=;0+ zg6F+24>f~wdJ%lpEPRj>Bdg|AA; zjWqjt)C&z`^gD!6i|5t7QN*ZcKYArA?QXz=<7T?m@eub2H4~HEZ$U7BCB}b77JPTv zjRrpo$sO!3<~){hQbNL0+5X6ZJH!)=~BJVY#32 zB>*_Y!_w4ty0<5){5dIg;QXX~T03J7@{6=t9<_==T3UMl zs?k&NI>XU__2P8I+keWwfpTRiox2j=KQ=Z7K!Z?m*Sc~0Y3Pdj=DiYCYqaYH+FgzY5pFAUluxdB7o8jAEZE#yn8F;zM`XYcMZQ>7e|}&Fg(zt z1#T+bnahuCJeKEe7@3*PF2!y*V|y6Z@260*M14tR4{xnL`kWCzA|m2)l&V@LF;P;& z2Jio>rKU!$b@}JdpYX8npU&>Ids}~>nJ%1Ia2`m7mf(-5T+LL!gd^99>_i zNmJF_4di2;-x%+<_>CvuPJO<+hZBI25vL=ia;_-b5(?1W_?nUV_n{#BoqLen-#qv) z873#!aga~`@|%pqA_icsH|s6U%flB~BEnvn;>;8k(ouXAfQ;GGkHe}1EoHtB+yfIx z&oyzr+{Cb-lM#Ipiy!}_f_Spgh70oQZGX@2_T!V6L@(uuScK-ANe7uoAok4umRZ(2rci;zBJP8O1ufw9ADx*t`ij8%VUSc94rIk!C?O$X?I?j(_8TRFUgc55yv>oU|BnB> z0%#-u71(*)gCNNVDLmx{5grEJ7trQ;SYl$L1~yH8yB_4r89Z0S+r6VdSW~>TvNeK` z;UY8-sRv+XW7}w*z1A&1b}iDV9I8uYQne-GSM3X#sNlG4oLFk}7BKZ7Qvs8yszyfa z^B&@R=cq1bmlDCt&q)>ht7Uxbb~vW;KHnoim#)oA7QCPVcs5e`7M1(ZuxZivyU8}W zDRb-3^-4K{p?kZz;t?DjQ+wWE3N?I8q@j{D+hN48qV)XcTsQ}dhJx5+hc`eV8Ru8bkN(^7ug}JD1R!56!aWGEY~i6QP=;b)+o1xh0ep}&%sO_ zLwc@(x|e^M6~itVx0!`H7Yd7dG?hNqueUoXy<-A`;{QxvsWPFdq0wWY?T@?^N+td$ zqT_6)NBd_##6R))|E=1Nya6u$Y})3$F}{@ZLV%*e=Un6mEs>0Q0|A&oBSbcV?xMGI z0{9{wA=LXQquI7~a}fRwjINv&ZXg_jx5Q0>CC&h?Fet0ThGqxGBXMKEBtYY0B?c|L_)xZKn>sm) zK#|o{BT=3 zFUQeT&cm1@+UC8bcLxiD)@^}m9bt7&%aLfk+s|h{_0F`}SW~E?_DF+udhc@lKISy; zP2irM(Z0c^xdnjJ%_igcCs5M`Mo>c7*Ut-#&=5@;&xiRql)pVdGTc^SS10`MHkkDa z%>rs))IKTfTucnyx1VoE?8so=uyO?OF551b$`sSZP?vXU1A>vV_V&9b(>$qZAll|@ ztFNe{^uK*mhJ+(_c#;2h@&B5w$ zCnD7&PZjjNd4XrV1Q&mQ4fEgslrzGIAYRMOie;aLW6Z;cXzYuu9~|KSsjjXnlx!tB zJUFKVBM1Msv}!rmdt{3Yk@_>sQv~gIUItZj&@ye)xbR;O+q;@Nv@xTy(m|NGsL<6F z?GPd|T(`TLPheeg&56v#)l5}e8&!O+?E0@p4A{o^)P$s@pvbs`f#HbG)$Xu_#Kb_y zU0KE@#24v`c83d1Yj>E$?BQ{?8(k)9Ph5bXjmb4xULwr`I5-skpGO=FN%;Hxk0=Bw zvTit?On=9i@IQSzx}mn5KYj|qf_3h6hJN`|AB&&`C71R1_7%00r#9d< z!ckwf`s2);eTFSY;R(RqKc=K)BXVNEoS3vC;1w4aEo`*e-2q4K_Rysrz@hz#=?{l{ zcX^C6Wrnj@hwbK#@1AXou@@g6w_9pFI#WhH8-l!)l^P)*edi(N*zjHJ!Rz9o2?73K z5a8}A+d)NVD2%Tns-{h6$7-Z`MA(J)p`BAMw3uNRrUEEeSp*6XK#UXDE)M;WwXq(Ys5`VJou~ zg!4;eTU8h-~H4bMztGTT!%^3>hP@ZdrZ17^ucqZN~NwTo~kXM=B# ziDD|2oIjKJdj~MMQy~GYcfF)1)kPgTv_`?R=ZQW9yC^16ReH{=E3)Bx*8M}iM>P56 z*e4W^7n&{&-Tc+#!Y|z2czGaDY-q9}J{j=!WR52-j#4(Th-fDz*TggP3A%mx)&1au zgpQO*bounk?S($T8H8&;>r8ix+tI#vzaS!(MpRqZ%H?j>+&?cr=smi6Qm?kpo7q3# z{+pS)mY03I?%9q$OjKZ;W+dB7cdtROPd(!R$_wBAOCpL@~5-DQy@clzc z+cz;)7_2*apGOyE-S9d4-_bNydY>ruChO{Wl*W)~@UU(ID4Mte)HH%&$Wr+AFK_oul z+j8ZWre4IlT7rz9!EOtRC{#@?uM&=srM9ltXYFTDTKEa|F$MNr3jJVzkxU$AOkbZ2 z;Nz&$i05i&$10;JpTvXoP}f4n7eg9?xi!*_o;PeGZRhr4=rQJ6K_S=fhfL?DQmqeC zYs}Goho9_tpT&^`gl3TX5q2!bZkI5+>9B@#lX7|OqZw3ud3_e&*lkag1>%=;s5<~# z{CbF&nuQrRsXfk2oXX^>HSU%eGv8y90U z!+O`trg&@5q7@*5wU^NfI~F9V@`Kq6M_gb(oU$Mw_=(W`sCClZm*SU5k~9gl>d+xN z^TSTHU)uQRIioYo!x8LoJ+HRkTLk!$c+i5?EiL2Ta+oBVyk;)g>_~DJ7hDcg=X0#@ zDf$Sk%NBC8A}D9$DC3}cxD~FO(RSJK)@GOV%^Ke^lM+;9pz8-XvN65IqT<6@Wa5L7 z;-kx^QDTulB{$r@ITU*7?v}TAwZ(tgLs&@NS*rW`H9mJV*~UrJcg?z)nm18jxS>;f zxE58}enkt!%7c1RZ@?HR7@ZK72LG5X;3|`{gKjCM7jFB`U>D@;t;op8w7uQRzg-{P zkF~YQU_mAM04%5MkLOviIdb+njVtl3c7<#Mjk=OUl6&xYHH) zPe;U#E*s^O9@Vyf!!%79Sji9i6m+{TIbB9oEbdFdzq!fm`cgTspeiYJnu5NrAN2TC zYGwCK$-afw5~bm>%{RF+cweoCyVF!O z{&kD#e|D)@O5B4*J(hj#c0S5o*{#b6^5Bns>8JFLE-EgLyxiN}t$KfIsoPE{Kcyz6 zij?R1rs8$s@t#5|kQ6cY#5v;e-A&V$&YL%MV2cH(|Gf`6zY_qq4uQQzmTIU;iFFeM z$B;jv=|YohFC1(*#iRO!_e_tFn2KYm;^z1fsokypw2>a?l$ru84&v_aZuW402iEGp z$lrmyL~nqWv7015Iywq_sGn?E#J$k7Ic5SO-vVq!4J_SlErw|T#AHV-={ zkBo|<%cQ5X{XDn_XzVJ`1TW7-?2rg?8De!l8805xtTDb@dow)XJsQx8N)Z{Bhv(;> ziS3@Lbb|M2?z;S7-uZY%LNP~JfLfB1gCkDFR3bH_@sepLDL+TXe zVGarm?2}5f`a5+;4gEklB${hX(S%&3MZI!H^NfvF%f)AvvOSq~#9MTpR&*&A? z@;tB5C+^p5!Th}$nq(#>9l*(^ANrF*==f$V&guLcQQ8MKOi-X`SD1yFiu51A6J$Cx zqk{@7{vCcA-}sT->PJ=psgUH>?JBzaReq`_W(c-=*-YOE{b#LQcX931y+fvosS3j= zuwzPoj$M924W2=rh?JLQjFB|h1MUDy=GgjL7y}7v19^p@@`I|~B8;k8nj4c&1->Fj z;U_NYN#RZ z<~!eao_o%7;@&@ahS_`VckOq*YyDQv``4-p1b7ed001CRQk2yI0EiU$$B2UkUg@&> zdH{ZT@2{ojDQoRv>Hfym^Nou$0QhEPCaE~L^AXEW9ddC0iTDbEjmrt%|6&2rl~P?{ z&A-HsAxN6_A$jnKSnM}X!h%pReVq7uc4;Ltg;&VIJ884^LDtd5tZ0<#>+|&DKtXHu z$GKmFj#qykBo+rIahSI#aB~85YJTl`q~R$8KFWI|H@ikW(GX4X;$m*j0#e(oBi5US zDF5NNVK1s@zDiq2-ex}d`Syi6n=->QSTB@)_iy{i2mfJMBK`Ny7Yd%AcW2WdD(}Q_ zsONB3EL{os>I%xTXn7IMJ@|Gwm|oH1ISj)+&yQPT)J)_F#+`eh&O#L}{3ZJJ2R@g_ zN}@qdM5_Mes2pi!ym8o@H-}mDXvmI8FRNGzccpwgOm%XzH{|7JHeM-)yYU&uya;BK z&ZwTbDDB3McD={rpU5axS736F)XYBI9@Tq&Vb1JwcMzL7aB6n_ewy;KAzfbOWjp%w zrhC@d&t#+M+dn3rq)R3<{q(6N?|s)aYQ|gJ6Ig3}v}Q9942f4ObQ1f4$qfLEfRgMB zE#Hj2`G7$3wPwkKq22Xwp9jL@fxL&rik2UtR8po!u+DqGMBGc0i=GW!<{$oXCn3ia zFRF#l7~GFd$qBPaV5lCK-$J$qasA87jF)_-@JWInFi3g@tzI|5l&OYw3df4s4sWvlAMldU)12vzu z>hgr%2b1kYmR-WNl#~+<3+G``93w2<0ggHB|D-0khtyL%h{( zv1Ey`xpIJ>5#Zj=2yL!B-GZ#7eb8jhuDMO`Nl`#9+`7J?_t>3M4d`pGBAV7V%M)*_ zB9V>JHrs}15XBP%+b$R+I-$u0UBe#i8xIJPfRZAKVAu)rVk6sfXRnn-wlu zSmpQcN%_RAte)xsR-|-%{P2C!DGdF8SB~WC#>%P0)YJ_U&-?f9&n2=cQvp;l@<}Nv zy-%HNYCio&&a}Lev9WphwX}5PtbS%pzI{q6^IpmNj~pVY<)@L<)YJgfvL}{q`=uKPgdrE0YBTql>uz#c6D8WG#OTV`!}m-dJDHTam#&a<_ClKQJ#SDq1PMB>8p* z*bZj+4QzyCj%A4l{LR46Q;(wLJ-uuoKQ&-dn<7q<+4>veJC4mb z893ptG&!>$ODhsq?ZW#uXw>zvnn8XpOuXkdf<@T}zac3_WB*Fb`&=sAMz`E!)Oo7)f(B|>@4NE@ox zS-=q2#MVMyEo2IAW-GtIhog1?z-L#rV^KFGU(uyHaiaBdqrd8 zgOZ7?0II7JRKZ`bFbROtYp``e7j*)-y*k`VOHP2oD{rvwmSER*G2bqb?(((B<)Gx_5vwTrA&ws;oi;VglCwq2+3e@#tu9v> zz)RrO8X}wcWQGvypO^XN7_z%5QlmfrmU;7H`2H>W(u5V1!w+ z{Axn9^nDtz(b3iQ8GwJZWZyIs>5r9;c{E^1H2m62|L8eWHH)WdcF2uLo%8%l)0fii zNvJSWDu1^{0{I4pNm1#0hGEU(72PMq(n-rsdkV2JPA}%sK^&N^jexe_=$T35B#>o- z*pjFJ|7H09J)E@i@oi-N_?j)4{VQ%p-=7@13>}OsCm0`0y!Qj(=H#>hUcY|by5EG5 z&;dW^7^d=M*06tw9JiPHNbSv;3fI*nU460*e9m%miQJ(EJiWY_cz6htlam$I)D)bY z9=p4{o7K-&n|EMMr)Y+UhjWXFP*X%-6_Gh3;;S@0sDU@(XY&i9r>FM|V0`?TKt7+uyNM1k2a+D)dA&x#KEsg5Wp0}sBHyXgq!ZI>3feF|- zJ7X~}qHLpIoa4h9bxQ9)&m?^F=8c`bJ>L1Xrl>=HW+8d+aesUzUTRVjj8ZkLbM(|Z znwlTW_Uq7xA(daf@`i>q-EjxPVzdCx*MVwRJ~@ckkY(Bm!e_Q;CU*e2#zkJUu;^{+4haieLrX*>y&e z_%8od5=%=AL+(uRhoshx56;-xa)cj=@!J7MmV~tXX_--`18JdkWIb+0m)t9_sx5kh z{ZFIyxS5z=^+2Zlp<>aYg zhM0Evr!m{eF#|2F&N`Px`h$Lb@V~^5AG-?E>d#!9Tsqj9`b|+z1S;@ z@lMeY?&n8$#`xqhWF%<2VC4PfiqYrGm3T!(1z~oEFb_plU47fAO?Yjy3b$|3Wm#Fw z$_-Zep3_R)>&2k=9EH8TFaJ0S9^ObHD@~g5fGR!i_!VUcFkA1k!A)^bI9A5NVMkym z4wScizPgb%4W9jm$?_bi48?vnt$^6c!i)Xa7cZ*ajCm;23?aZT*8_qj6GbZi1OqE8 zRzBEe`=SzuxHuiCEZJG&tLmnVNtJ5*^ccZ=Kuo7;p zDwyR69!85@9UdND8u^F=8?cd)k$J19J6zv_ItC3Pcq-p}QeIS10F1TFi$ zZG)bic*1woMbE}@jzRf98se9UeZwR^-;^Yve%+Mi9-}O)pg?4hjh^G7d?Rwa{*;4| z;hRA@9~J(u!TzH!yu{nKwl=x7wfCKzoc`20q_SGdG

      fEEa<=X1MjT>a^)X~!?+ z<;W)b+8V(b{g=67L-;?iaSjYMRI|QrPYJiv{9IdC`qr#u-YupXq*KQ0_=a>_EmQ2y zp40dd^jLfiahe#+PoI(sekL#tLf!}P&u_>`NnMfK+MPW;%8g!p5)$-Mh@zX&ZS+93 z_Gb1~B70k>?=?x%URl)cL{&e2P(OL{B<+b)V*`vd_#1x>pT{MB+N+29r$cDa*jPeV zR#r1<9l?iI)&Y)hdI$TZ9iwsKV*cbRDk{QSH}vcisnV}?b>G$Vns$%>)&u~G`ZJ;f z0&dXOQ#^NaP_~@o)u$!dnV-VX&wVq*Y5q(K{*%4m9sBrIVYg$+9=ALGJqwfV9`0`( z9WemVT-reQ5IZLpCqB5kvT|T%OgB8r?6*fiBj^fZ+U|Qp=eA#e^rDrN!u!^wjf^rH zid#CCTf3qt+uSn#1~kDzWHT~1XL4|MmIuue+?H7EtH{{ch&D4~pJxPC8+!l#7KdAU zX0>r6M(|*9ek%OySpM$@?&Les#2|euu9k`3l$rYZ$mp+jzeB|CsSHa&g_Gh?2vH3u~60 zqqnjofk3FPrN#O?WjZg9`Qgds+zw9dYQT1g`-*T1Aw%r<@6R}TNu}FmTOoS-`naD5 z9xlZ3cljGpo8Y`yUik$&I}KxI7u4xqMwbPo$IZ^ksoCcGiDh@I-Lns+e__O=2h(Pw zV`Ju^Biqdn`LMjIij&JfVf(~##iYp!)< z!co(o^uhhhfsV64?-~;dZp=+iPVQCl7=b|uXx3oxZtvhw_((-@_}JX&gM zP^1x+Ethywh_ufKEHHIxX*4R!$hf#vPcGNMKrz7VPnG#p8PS2b{24tLlk6<32x$T6 zgj`HpqDwv&0|2+Pp*bX2QtE|=M@@lY=)7)m`145#WDS4KUEon;JM>{S8Ai-JoxrH1 zq(mj+&bqz5z2yFbn38e|p-3FNY9&gFAq8i70Wdy){s8MOgpQ8R&e5@eD^TaRIr1LCeO4J{Iwn=H9BnYcFfD+yj*63z5r zYT8*EX01FeUTTAXp7DU`mm`I1gs7rlp5shWza|m#`5yC4`5VEWS0L5p`k_zHd($eu7tL{cJl&|3XAiU(g9-wkgYFsi) zb6DDl?g$M2QH3LQRugv~RcBc!^#g`{zl<5HBSKL@_eukqFP!h)qwfBty6H;%7|Y{NS9r|ECu-_v-lc z{e&pNLwG|<-q5d^@KbWb)wKZ+q zo6f0HPo$xY*q@>pv%SYluawMET-pel=v_r1>j976$pNF=T!-4Amwy@CH;qp*o^*x& zG1#BCNbPs`JK?umn%@qyNp4xplXC+uYBT@TSK{BJTo1U;3_5m_Xg1NqU}Q4L``ciY zGyuaT8hHCr1On8n-0)=dzdz@l*n&tTCE(x_2V>LUQfCSKwii$3&zs@kKB05+-krao zpW&vntMObKUX+wq_-vfw_Jc>Eeu_b$Ja|`~_NrsY_Yn&TTxh6kyNA9D^)BuLX#gr5 zjH+_gogq7=PM>D0Jd%#*{LsBcv8dw5gf`n}My=E7zBjc&&W0sfGA1_Hk_`gKM4T;iUjy15eG zuCK6UzTi~c|M|LdSQo(SYgUsG>Pr# z2+M8J2*i^r4}8=qY9C^q{PUdF>=m%2n#_*|^h^-gG-GU@T-EAl&g<2OhE1WQ=l2?1Y=s_3_3X`GN&Tr3&1GfBJ zm#n%EEP(mwibPGpgu2gfzq@_dql=do#dD0Q)9&r_jAjiFrS22oj-N%;8 zTVCpv8?bE&M=he`Y92YiTeV_qd2>l>8I_gbp8kswR``w2@`LhP)3-I=iZS#GXZsK~ zs+BfDCkzJ{i0w#K5l83dLP>U<9^(gtjPk1lS|FV&@U{nNhBP~x|eCNif3^-2Ox zR)9TEa&v7H%EdlpOYF{|4@4MzuWY{|jy%h~O&a(ZOfxD!*0waYtXVCP%a$gy zx4F@>GbAP!r3?Y&rNOT3wCr5f!(x<{QS^5hplzk__w4o%cWL|7fB~2k`)P3c1`z9T z9?BAbdlMutkJWF(PxBJzQUc4a9?BI=*v{3YYsRbGg!gQmg(0FnJD+8|0-?gko%};# z($6WRq=#|h=4zsXSJ>nb0&323W5TLyFlwwf=Ev#op9+H@A+QYgbN%=s8N6+CsqL-r z?X{btN;&oD&Lu6htS0kz-iJ7N@1s=e{8TEMS^dG-`Yx6*9Wgb* zATjnJRh&TFb<-kJ*(8v#-v&}+ctNN6DQZ!iX$FI8mVPAMbK=jS5Y*iz#&#pD8}0Tg2W)0P2P=bOOPJlhTV`3wJlfqF&mj2xuuKVmP)V zOHd_3E$l&b`MEidg!_l`uLB}je(pVBr5q%#)GIgp$_q15RVC!);zC`wT%XRWn@SS- z;(S>YbWyC_3IN=v{Pbu~3v7KZx!F@S=il>FdXa_|HFd?crG3+2q0 zFan%Yzgh}hVF!TqBnOUP0N*QG8`2O^Yr8(h@gEwSo*B!W4BciS2rwEu>T7yV zaL_C@?frH+`Vih= zurxoG&`(EO%Y>8b8Z6O#-*!PMlk|svhr{>sPW5XiDi%|DbJy=>qrEOCD!hHK69)i< zVmJK#w{cTd{`0F>5|PHGtmGYQskiT9VQnLelz)12Hj z;cAP`rR))rU%i9MHBra9O%e&Fudx}KV81vrR1s=8OcJ^O3f=Geb3v?Yzp22iGY>c! zIeFu`?jYSR2S#nkUL2+yoG75cgqo?7!JGul)Bo8PQU@+KJ1l#~voNG1W&hFNyHC-B zMua5wy)kI=ehd~DPJQn(MBe5TQo1EoMVw>*=VjWZI@P)+e&H>1OC3X2PnSi(>f`F5 zC|GE#bJFzt8mU3?*r1b?loYH0;Q_?Xi1{Yn1jM_^oxXt`&Z;g8b^qsqb>4dhHiDl& zRT1S(JK8u*RU~_cv?g=uKK=L`c6#caQCi;R5`r>xoUJ1mv#Y03(fe*k0v5tie3dQq zXY)P`HbYr4en@1Rcz__tj1|>VEPZWJf7$imYb7igVkh`{8teqU_200_)fEhyc_xM& z*Yw>kDUQ#`;P#^{o%n#DyCh(~*?`Di4WUz^PM_kGw)3!O?mo@HH4O&R&?5IF3O6pm zBv@ajwfV-a{<3{7IH`=N{u1rS4p*1u{RWp!0*WyA*d_w2wccdM^MhrJ%3V;7;QG;T z#)_8H@D1&zB(ithB=46bPBFHXf;Fi9DJq&vWOqTSBtvUx7D{u@nM>Pr;EY%32{8Xp zzh)^fAF)fr@Uz;W{L%9k%#dvfT!6~Zi+UsVNOv$XU-xwM&jnIk$f7ioZQPZ|Tk~?(@M6T=opQf%XKmNu5gnbVf z7eYd4H8dRp%h_?+0<1qj#cP(R7z=<){g{JkfBZ!!I$RrV%Er(fBKd%lyERWPDs7I5 zaXh=u5<3<-o(&I?B!rm{LsU>xtTKGw?9Lq;8^>g1&}!-EoT7qId-eG(!Sn~jui;K6P?z75FVA}Aou|nA zJ9ON&W}>82qN|>_o0QQ1=s8+V{hI&fI1(1SuGvmHF|Y|~9$eaj^=f1d%4}ZWcfhnY><$ z{Rn2Pq7u_{eR=86%EopW(y%8yKF9dgvvRj@NaDDmQimuW6ctTsI=?L;A>DHfC}IyR z-bTR{Vre-7aO|2}gy>6~8Lo71XC<~NpQRAeS<^x z;n|{v{?_}=uR`xO_LQfNpQpbyi?vW?o{@iDwgf=!OB6-qtAM&`L?2%%Y&u}JmG zhTPZ8NaUROSykc3hsz%cXf~~?f)5;66tf13j!#*ToyPgWuzCg#2b^VWAWdlKIIJJQ zUzN{oXz=}&N`icW0dx#h!h_v3+RlaxqAijeG!-sq#2Qr z*sXe==l!5QU%B@uAOA|UygdBzD4?tL?Bq)OAbLqR9Q|f4Kw?o3_-(AN-jFx88a6;^ z^aD*n>)EY>Zbd7F6HKBTgXbwJ5b@UZzK)~V@O57nSo{9a;qB^q`Vtoh-w@!^cusDV+UBKh81CF@@h z#Z`@7_bue+y0Eaj@SUp%y}GaC3ipbGQ-5RxWVXlck$OW`F7_vg)7FBB*;p}}50CW8u3>_SjyGZJBcP*D zk8QtcW)@Kw?WxM%a@`2=PbF(Ol$UL2yqGO18E!Hf7H!JiN#R{Z5@OF78l0y;c{1FT zG0e|y_VmS2#;})<48rx7&aJ`eZ6O-!RwL9~Spm+#<{%<^f12#KOmMJ-Wxzi6tcRq@ z^fydP4Gr>2({E+eY<=lnj2ex>US0y=&2$!1*Zh3L z*5wY#>Lx~BzPalkb5~C^b#*@PX_Bo?*uoYDKyyBE1BJ(kH?Io<0||uKqY-SaR`uv3 zBa!Z&%)KLBQ;6?v!y~c3DtLef{2Z0{^ghmx^r-FIsgA@2G-dyLH>YuNof{H2v%llZ z1+=8kV=~i1tI7B~i8G!!rCT7CQv_IUgV~P|KAiMn(&r+(-om@yO46>w@edr0dg<>! zj#c)Olk1ok<+;x$$Lm_<#-X59Ak1SO_awK}$B0vK*ktMbJT?RX@!lZNacf97iqhO0 z&YBHtg#5{O6f_b(hpdRsJn>i*RdjTak$!i-9uY({Z#u#9wV5tcMFlX!X0+DrBy6?# z>3=^ZzbC=YNlt!Efoj3#g@qwkOTbZfq}`Wy)ksbw(+~oH;vo02s58xNM?}VGO|ts+<|{{Ir+Q!ePkUx5D%w3Mp-~m(86D_=F*%zh4F0gvVzqpi=|PQb}!$Sf)vB#0NVUNjfVHTHg~GQZMU5iE_rZHg_b@ zi^m(1Mmpn^y-rSAUp?I96;hJm5%52;dnPD|wiFQ19-aoa75PASSH^UX09D6){E?Ax z2t5zrBuKOJ>Y-klPUq)WR9<5-4O-eM7u>;KH916()CW;-_u2wB-22(pPf}@i_7KztXica4{lOWBgNtkRDL=nHsOJD9KR+2rg|jJuP0*S}|GuX| z%WG9=rGcD^JyuzSHgm~}Ds_9hxlm+uxizMP^gzym#=yV35TKh0=q~hp8m(NouCjlY zR)xpSP6uT6g;&=v?$)*t9%cPzMw62D5$aayJ2H@LU(;~ny~I3Q$CP{AY;xi89)}4> zYUJSfOXZ4=852g~*CA~!E&NM`cAce?&w~1^nwp`9`6JXMn5nARl-RP*n?~HKNl3g! zXH>OTcX>nJguzN}K-$msP7cwuLWJ`rQ*9LY32b5X__TQ$#+#R?hO$1MIXmaY!e@Uh z^BLQ|>i_2`qKqFpxkF@Cl^I+(N2&VTK*kzOS75kgt!WztnIazY$y>PAG6sy_v(h-LV|2$EJMUt{ntIOYPzJ?EHM_6H|WG zzr8VYzdffCy~?N5Mg>l)m0QqAeEO?<%~aWC=VkPA@FV@}pcUTO9VZHb4kBP2UlKSF zx&lmv!l2!SIO>LAKnI@iG&rLX+DSpzw4P^b8NT4gpKjdTDE8!Pde4nW^NpwF4gLAHB-@cI&5D=tEhDZ?73PY2U z$p8NR%UAMN34Dm|1p^dx(*v2Jx<5m}fzv}bycc`#)f9wHb_J)AmO^HC#P{F%Kh6__qrEQSmHQ9)FLy}X z4^o5RuMYYEdzch>x3r={-pi}j9;sWd2j(IaUo_yAiHW2-8X9Q8qxoud)Y-n=RxDk+ z$0H7o1jh%-Wpd-I9snn@khtAtw-XYu? zpz{)3p|U=CrE0c$L8q5ywmzzUC_^OQ_d1jn>{h>HUql0ZeUBb1(n^SN+moza%%N)? zDZAZx#!St=9z?*~?|FAN8nb1JK%5R@c$#c8l^^ zz1n(^A!&^6eCS+eP>rS#NB6PZX7SR&n>F9Dp5D3%saL~7ZEbD+!O4r~-;jjFnvb#9 zObQ$p)hXA@)$#)a0yoqdLc!Zx@LNrd+e#;{+zwG!uXbtsHwyJwwWhW^f{Tj_$D_Z$ z0Y+46URhampJ{)k1s8QNJu*P&Fd1L+>=GO}{5q+7d`HhoOKcPIO9)7cfBenbTs`X1 zQ02T?Z*Q+K8=NZo$sA~|05rvCgF}0=bWT#DXgg&XsadL3&P$)1A12^1>FO|9wp?sE z{ghkpyCQx8c*SfWT_ADb Date: Wed, 29 May 2019 20:17:22 +0100 Subject: [PATCH 194/608] Fixed the forceMove issue. --- code/modules/mob/living/simple_animal/friendly/cat.dm | 3 +-- modular_citadel/code/modules/arousal/organs/genitals.dm | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 36b17dc84c..47de0e605f 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -400,7 +400,6 @@ catto.name = H.name catto.desc = "A cute catto! They remind you of [H] somehow." catto.color = "#[H.dna.features["mcolor"]]" - //H.forceMove(locate(10,6,1))//To the zelda room. H.moveToNullspace() /datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) @@ -411,7 +410,7 @@ /datum/reagent/fermi/secretcatchem/on_mob_delete(mob/living/carbon/H) var/words = "Your body shifts back to normal." - H.forceMove(catto) + H.forceMove(catto.loc) catto.mind.transfer_to(H) if(catshift == TRUE) words += " ...But wait, are those ears and a tail?" diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 8c6d9df54a..a2b4a34549 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -216,7 +216,6 @@ B.prev_size = 0 else if (B.cached_size == "huge") B.prev_size = "huge" - message_admins("I hate genitals, this should not appear. I'm so mad.") else B.cached_size = B.breast_values[B.size] B.prev_size = B.size From 621f973cac5f8c4d9da07c7993ae3c3688b8b68e Mon Sep 17 00:00:00 2001 From: Thalpy Date: Wed, 29 May 2019 20:25:32 +0100 Subject: [PATCH 195/608] Fixed pH disappearing and changed how strongly reactions shifted the pH. --- .../modules/reagents/chemistry/recipes/fermi.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 2771d014ec..7f9d4e5a8e 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -53,7 +53,7 @@ R.add_reagent("fermiAcid", ((volume/3)/pH)) if(R.reagent_list) - s.set_up(R, (volume/10), 10, T) + s.set_up(R, (volume/10), T) s.start() if (pH > 10) //if alkaline, small explosion. @@ -150,7 +150,7 @@ CurveSharpT = 2 CurveSharppH = 2 ThermicConstant = 1 - HIonRelease = 0.5 + HIonRelease = 0.2 RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE @@ -182,7 +182,7 @@ CurveSharpT = 2 CurveSharppH = 2 ThermicConstant = 1 - HIonRelease = -0.5 + HIonRelease = -0.2 RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE @@ -213,7 +213,7 @@ CurveSharpT = 1 CurveSharppH = 1 ThermicConstant = 25 - HIonRelease = 1 + HIonRelease = 0.02 RateUpLim = 15 FermiChem = TRUE FermiExplode = TRUE @@ -239,7 +239,7 @@ CurveSharpT = 0.5 CurveSharppH = 4 ThermicConstant = 15 - HIonRelease = 0.1 + HIonRelease = 0.05 RateUpLim = 1 FermiChem = TRUE FermiExplode = TRUE @@ -271,8 +271,8 @@ var/turf/T = get_turf(my_atom) var/datum/reagents/R = new/datum/reagents(1000) var/datum/effect_system/smoke_spread/chem/s = new() - R.add_reagent("enthrallExplo", volume/2) - s.set_up(R, volume, T) + R.add_reagent("enthrallExplo", volume) + s.set_up(R, volume/2, T) s.start() my_atom.reagents.clear_reagents() @@ -293,7 +293,7 @@ CurveSharpT = 8 CurveSharppH = 0.5 ThermicConstant = -2 - HIonRelease = -0.5 + HIonRelease = -0.1 RateUpLim = 2 FermiChem = TRUE FermiExplode = TRUE From a58766c8853fb879f00756fc44443aa6e5b31d48 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Wed, 29 May 2019 21:11:21 +0100 Subject: [PATCH 196/608] Fixed explosions not occuring when temps were high enough. --- code/modules/reagents/chemistry/holder.dm | 11 ++++++----- .../reagents/chemistry/recipes/fermi.dm | 19 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 2b282cd8d6..49a04ca8ef 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -443,6 +443,12 @@ var/datum/chemical_reaction/C = selected_reaction if (C.FermiChem == TRUE && !continue_reacting) + if (chem_temp > C.ExplodeTemp) //This is first to ensure explosions. + var/datum/chemical_reaction/fermi/Ferm = selected_reaction + fermiIsReacting = FALSE + Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH) + return 0 + for(var/B in cached_required_reagents) multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01)) for(var/P in selected_reaction.results) @@ -460,11 +466,6 @@ fermiReactID = selected_reaction reaction_occurred = 1 SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log - if (chem_temp > C.ExplodeTemp) - var/datum/chemical_reaction/fermi/Ferm = selected_reaction - fermiIsReacting = FALSE - Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH) - return 0 else return 0 diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 7f9d4e5a8e..ac4a6acdbd 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -44,15 +44,14 @@ if (istype(reagent, /datum/reagent/fermi)) R.add_reagent(reagent.id, reagent.volume) else if (istype(reagent, /datum/reagent/toxin/plasma)) - R.add_reagent(reagent.id, reagent.volume) //for !FUN! (am I doing this right?) - continue //Only allow fermichems into the mix (specific fermi explosions are handled elsewhere) + R.add_reagent(reagent.id, reagent.volume/2) //for !FUN! (am I doing this right?) reduced to half so it's less punishing. This is mostly for astrogen failures. if (reagent.purity < 0.6) ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 if(pH < 4) //if acidic, make acid spray R.add_reagent("fermiAcid", ((volume/3)/pH)) - if(R.reagent_list) + message_admins("gas") s.set_up(R, (volume/10), T) s.start() @@ -85,7 +84,7 @@ CurveSharpT = 0.6 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = 5 //Temperature change per 1u produced - HIonRelease = -0.1 //pH change per 1u reaction + HIonRelease = -0.05 //pH change per 1u reaction RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way @@ -114,7 +113,7 @@ CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = -5 // Temperature change per 1u produced - HIonRelease = 0.05 // pH change per 1u reaction (inverse for some reason) + HIonRelease = 0.01 // pH change per 1u reaction (inverse for some reason) RateUpLim = 3 // Optimal/max rate possible if all conditions are perfect FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics FermiExplode = TRUE // If the chemical explodes in a special way @@ -150,7 +149,7 @@ CurveSharpT = 2 CurveSharppH = 2 ThermicConstant = 1 - HIonRelease = 0.2 + HIonRelease = 0.1 RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE @@ -182,7 +181,7 @@ CurveSharpT = 2 CurveSharppH = 2 ThermicConstant = 1 - HIonRelease = -0.2 + HIonRelease = -0.1 RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE @@ -239,7 +238,7 @@ CurveSharpT = 0.5 CurveSharppH = 4 ThermicConstant = 15 - HIonRelease = 0.05 + HIonRelease = 0.1 RateUpLim = 1 FermiChem = TRUE FermiExplode = TRUE @@ -319,12 +318,12 @@ ExplodeTemp = 700 OptimalpHMin = 8 OptimalpHMax = 10 - ReactpHLim = 1 + ReactpHLim = 2 //CatalystFact = 0 //To do 1 CurveSharpT = 2 CurveSharppH = 0.5 ThermicConstant = -10 - HIonRelease = -0.2 + HIonRelease = -0.1 RateUpLim = 2 FermiChem = TRUE PurityMin = 0.30 From 4077ab1fe3c60e66ba11c827072571a97586b921 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Wed, 29 May 2019 21:22:07 +0100 Subject: [PATCH 197/608] .5 --- .../code/modules/reagents/chemistry/recipes/fermi.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index ac4a6acdbd..401fd8473d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -44,7 +44,7 @@ if (istype(reagent, /datum/reagent/fermi)) R.add_reagent(reagent.id, reagent.volume) else if (istype(reagent, /datum/reagent/toxin/plasma)) - R.add_reagent(reagent.id, reagent.volume/2) //for !FUN! (am I doing this right?) reduced to half so it's less punishing. This is mostly for astrogen failures. + R.add_reagent(reagent.id, reagent.volume/2.5) //for !FUN! (am I doing this right?) reduced to half so it's less punishing. This is mostly for astrogen failures. if (reagent.purity < 0.6) ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 From ee2d75ae2239aa5b3e3ef6c5764a018aae7a84da Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 30 May 2019 20:05:06 +0100 Subject: [PATCH 198/608] Removed special screen obj, as I didn't like how they looked. --- code/datums/mood_events/drug_events.dm | 4 ++-- icons/mob/screen_gen.dmi | Bin 113920 -> 115810 bytes .../reagents/chemistry/recipes/fermi.dm | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm index 82e5a5718b..89e93d3361 100644 --- a/code/datums/mood_events/drug_events.dm +++ b/code/datums/mood_events/drug_events.dm @@ -46,10 +46,10 @@ description = "YES! YES!! YES!!!\n" mood_change = 100 timeout = 300 - //special_screen_obj = "mood_happiness_good" uncomment when added from tg + //special_screen_obj = "mood_happiness_good" Originally in tg, but I personally think they look dumb /datum/mood_event/happiness_drug_bad_od description = "NO! NO!! NO!!!\n" mood_change = -100 timeout = 300 - //special_screen_obj = "mood_happiness_bad" uncomment when added from tg + //special_screen_obj = "mood_happiness_bad" Originally in tg \ No newline at end of file diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 14f5540f389fa2e201ee556a061beff21225a4c3..756dcfa981281eb26d9ad3afb712d8d5b1512ba7 100644 GIT binary patch delta 6264 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 Date: Fri, 31 May 2019 02:47:08 +0100 Subject: [PATCH 199/608] Moved the secret cat to the respective fermi.dms. --- .../mob/living/simple_animal/friendly/cat.dm | 115 ------------------ .../code/datums/status_effects/chems.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 62 +++++++++- .../reagents/chemistry/recipes/fermi.dm | 64 +++++++++- 4 files changed, 123 insertions(+), 120 deletions(-) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 47de0e605f..d8d72146b5 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -313,118 +313,3 @@ emote_hear = list("meows.", "mews.") emote_see = list("looks at you eagerly for pets!", "wiggles enthusiastically.") gold_core_spawnable = NO_SPAWN - -//secretcatchemcode, shh!! Of couse I hide it amongst cats. Also, yes, I expect you, Mr.Maintaner to read and review this, dispite it being hidden and not mentioned in the changelogs. -//I'm not trying to be sneaky, I'm trying to keep it a secret! -//I don't know how to do hidden chems like Aurora -//ChemReactionVars: -/datum/chemical_reaction/fermi/secretcatchem //DONE - name = "secretcatchem" - id = "secretcatchem" - results = list("secretcatchem" = 0.5) - required_reagents = list("stable_plasma" = 0.1, "sugar" = 0.1, "cream" = 0.1, "blood" = 0.1, "slimejelly" = 0.1) - required_catalysts = list("felinidmutationtoxin" = 1) - required_temp = 600 - mix_message = "the reaction gives off a meow!" - mix_sound = "modular_citadel/sound/voice/merowr.ogg" - //FermiChem vars: - OptimalTempMin = 650 - OptimalpHMin = 0 - ReactpHLim = 2 - CurveSharpT = 0 - CurveSharppH = 0 - ThermicConstant = 0 - HIonRelease = 0 - RateUpLim = 0.1 - FermiChem = TRUE - FermiExplode = FALSE - PurityMin = 0.2 - -/datum/chemical_reaction/fermi/secretcatchem/New() - //rand doesn't seem to work with n^-e - OptimalTempMin += rand(-100, 100) - OptimalTempMax = (OptimalTempMin+rand(0, 200)) - ExplodeTemp = (OptimalTempMax+rand(0, 200)) - OptimalpHMin += rand(1, 10) - OptimalpHMax = (OptimalpHMin + rand(1, 5)) - ReactpHLim += rand(-2, 2) - CurveSharpT += (rand(1, 500)/100) - CurveSharppH += (rand(1, 500)/100) - ThermicConstant += rand(-50, 50) - HIonRelease += (rand(-25, 25)/100) - RateUpLim += (rand(1, 1000)/100) - PurityMin += (rand(-1, 1)/10) - var/additions = list("aluminium", "silver", "gold", "plasma", "silicon", "bluespace", "uranium", "milk") - required_reagents[pick(additions)] = rand(1, 5)//weird - -/datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. - SSblackbox.record_feedback("catgirlium", "catgirlium made!")//log - -//ReagentVars -//Turns you into a cute catto while it's in your system. -//If you manage to gamble perfectly, makes you a catgirl after you transform back. But really, you shouldn't end up with that with how random it is. -/datum/reagent/fermi/secretcatchem //Should I hide this from code divers? A secret cit chem? - name = "secretcatchem" //an attempt at hiding it - id = "secretcatchem" - description = "An illegal and hidden chem that turns people into cats. It's said that it's so rare and unstable that having it means you've been blessed." - taste_description = "hairballs and cream" - color = "#ffc224" - var/catshift = FALSE - var/mob/living/simple_animal/pet/cat/custom_cat/catto = null - -/datum/reagent/fermi/secretcatchem/New() - name = "Catgirli[pick("a","u","e","y")]m [pick("apex", "prime", "meow")]" - -/datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H) - . = ..() - var/current_species = H.dna.species.type - var/datum/species/mutation = /datum/species/human/felinid - if((mutation != current_species) && (purity >= 0.8))//ONLY if purity is high, and given the stuff is random. It's basically impossible to get this to 1. It already requires felind too, so no new functionality there. - H.set_species(mutation) - H.gender = FEMALE - //exception(al) handler: - H.dna.features["mam_tail"] = "Cat" - H.dna.features["tail_human"] = "Cat" - H.dna.features["ears"] = "Cat" - H.dna.features["mam_ears"] = "Cat" - H.dna.features["tail_lizard"] = "Cat" - H.dna.features["mam_tail"] = "Cat" - H.dna.features["mam_tail_animated"] = "Cat" - H.facial_hair_style = "Shaved" - H.verb_say = "mewls" - catshift = TRUE - playsound(get_turf(H), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) - to_chat(H, "You suddenly turn into a cat!") - catto = new(get_turf(H.loc)) - H.mind.transfer_to(catto) - catto.name = H.name - catto.desc = "A cute catto! They remind you of [H] somehow." - catto.color = "#[H.dna.features["mcolor"]]" - H.moveToNullspace() - -/datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) - if(prob(5)) - playsound(get_turf(catto), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) - catto.say("lets out a meowrowr!*") - ..() - -/datum/reagent/fermi/secretcatchem/on_mob_delete(mob/living/carbon/H) - var/words = "Your body shifts back to normal." - H.forceMove(catto.loc) - catto.mind.transfer_to(H) - if(catshift == TRUE) - words += " ...But wait, are those ears and a tail?" - H.say("*wag")//force update sprites. - to_chat(H, "[words]") - qdel(catto) - -/datum/chemical_reaction/fermi/secretcatchem/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) - var/mob/living/simple_animal/pet/cat/custom_cat/catto = new(get_turf(my_atom)) - var/list/seen = viewers(8, get_turf(my_atom)) - for(var/mob/M in seen) - to_chat(M, "The reaction suddenly gives out a meow, condensing into a chemcat!")//meow! - playsound(get_turf(my_atom), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) - catto.name = "FermiCat" - catto.desc = "A cute Fermichem cat, created by a lot of compicated and confusing chemistry!" - catto.color = "#770000" - my_atom.reagents.remove_any(10) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index e4c8e1b3b2..06ca536eee 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -214,7 +214,7 @@ enthrallGender = E.creatorGender master = get_mob_by_key(enthrallID) if(M.ckey == enthrallID) - owner.remove_status_effect(src)//This shouldn't happen, but just in case + owner.remove_status_effect(src)//This shouldn't happen, but just in case, also it's not worth the overhead of giving someone themselves; they can't proc themselves as velvet removes them from the list. redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear) var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 352f7f25ea..f748dd6a33 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1381,8 +1381,10 @@ Creating a chem with a low purity will make you permanently fall in love with so /datum/reagent/fermi/fermiAcid/reaction_obj(obj/O, reac_volume) if(ismob(O.loc)) //handled in human acid_act() return + if((holder.pH > 5) || (volume < 0.1)) //Shouldn't happen, but just in case + return reac_volume = round(volume,0.1) - var/acidstr = (5-holder.pH) + var/acidstr = (5-holder.pH)*2 //(max is 10) O.acid_act(acidstr, volume) ..() @@ -1483,3 +1485,61 @@ Creating a chem with a low purity will make you permanently fall in love with so playsound(get_turf(holder.my_atom), 'sound/FermiChem/bufferadd.ogg', 50, 1) holder.remove_reagent(src.id, src.volume) ..() + +//ReagentVars +//Turns you into a cute catto while it's in your system. +//If you manage to gamble perfectly, makes you a catgirl after you transform back. But really, you shouldn't end up with that with how random it is. +/datum/reagent/fermi/secretcatchem //Should I hide this from code divers? A secret cit chem? + name = "secretcatchem" //an attempt at hiding it + id = "secretcatchem" + description = "An illegal and hidden chem that turns people into cats. It's said that it's so rare and unstable that having it means you've been blessed." + taste_description = "hairballs and cream" + color = "#ffc224" + var/catshift = FALSE + var/mob/living/simple_animal/pet/cat/custom_cat/catto = null + +/datum/reagent/fermi/secretcatchem/New() + name = "Catbalti[pick("a","u","e","y")]m [pick("apex", "prime", "meow")]" + +/datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H) + . = ..() + var/current_species = H.dna.species.type + var/datum/species/mutation = /datum/species/human/felinid + if((mutation != current_species) && (purity >= 0.8))//ONLY if purity is high, and given the stuff is random. It's very unlikely to get this to 1. It already requires felind too, so no new functionality there. + H.set_species(mutation) + H.gender = FEMALE + //exception(al) handler: + H.dna.features["mam_tail"] = "Cat" + H.dna.features["tail_human"] = "Cat" + H.dna.features["ears"] = "Cat" + H.dna.features["mam_ears"] = "Cat" + H.dna.features["tail_lizard"] = "Cat" + H.dna.features["mam_tail"] = "Cat" + H.dna.features["mam_tail_animated"] = "Cat" + H.facial_hair_style = "Shaved" + H.verb_say = "mewls" + catshift = TRUE + playsound(get_turf(H), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) + to_chat(H, "You suddenly turn into a cat!") + catto = new(get_turf(H.loc)) + H.mind.transfer_to(catto) + catto.name = H.name + catto.desc = "A cute catto! They remind you of [H] somehow." + catto.color = "#[H.dna.features["mcolor"]]" + H.moveToNullspace() + +/datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) + if(prob(5)) + playsound(get_turf(catto), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) + catto.say("lets out a meowrowr!*") + ..() + +/datum/reagent/fermi/secretcatchem/on_mob_delete(mob/living/carbon/H) + var/words = "Your body shifts back to normal." + H.forceMove(catto.loc) + catto.mind.transfer_to(H) + if(catshift == TRUE) + words += " ...But wait, are those ears and a tail?" + H.say("*wag")//force update sprites. + to_chat(H, "[words]") + qdel(catto) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index b3662e5703..b9383ea430 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -39,18 +39,19 @@ message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].") var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case. var/datum/effect_system/smoke_spread/chem/s = new() + R.my_atom = my_atom //Give the gas a fingerprint - for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents + for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents, has to be done this way, otherwise it never stops Exploding R.add_reagent(reagent.id, reagent.volume/3) //Seems fine? I think I fixed the infinite explosion bug. if (reagent.purity < 0.6) ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 if(pH < 4) //if acidic, make acid spray - R.add_reagent("fermiAcid", ((volume/3)/pH)) + R.add_reagent("fermiAcid", (volume/3)) if(R.reagent_list) message_admins("gas") - s.set_up(R, (volume/10), T) + s.set_up(R, (volume/10), my_atom) s.start() if (pH > 10) //if alkaline, small explosion. @@ -403,3 +404,60 @@ /datum/chemical_reaction/fermi/fermiBBuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this var/datum/reagent/fermi/fermiBBuffer/Fb = locate(/datum/reagent/fermi/fermiBBuffer) in my_atom.reagents.reagent_list Fb.data = 11 + +//secretcatchemcode, shh!! Of couse I hide it amongst cats. Also, yes, I expect you, Mr.Maintaner to read and review this, dispite it being hidden and not mentioned in the changelogs. +//I'm not trying to be sneaky, I'm trying to keep it a secret! +//I don't know how to do hidden chems like Aurora +//ChemReactionVars: +/datum/chemical_reaction/fermi/secretcatchem //DONE + name = "secretcatchem" + id = "secretcatchem" + results = list("secretcatchem" = 0.5) + required_reagents = list("stable_plasma" = 0.1, "sugar" = 0.1, "cream" = 0.1, "blood" = 0.1, "slimejelly" = 0.1)//Yes this will make a plushie if you don't lucky guess. It'll eat all your reagents too. + required_catalysts = list("felinidmutationtoxin" = 1) + required_temp = 600 + mix_message = "the reaction gives off a meow!" + mix_sound = "modular_citadel/sound/voice/merowr.ogg" + //FermiChem vars: + OptimalTempMin = 650 + OptimalpHMin = 0 + ReactpHLim = 2 + CurveSharpT = 0 + CurveSharppH = 0 + ThermicConstant = 0 + HIonRelease = 0 + RateUpLim = 0.1 + FermiChem = TRUE + FermiExplode = FALSE + PurityMin = 0.2 + +/datum/chemical_reaction/fermi/secretcatchem/New() + //rand doesn't seem to work with n^-e + OptimalTempMin += rand(-100, 100) + OptimalTempMax = (OptimalTempMin+rand(0, 200)) + ExplodeTemp = (OptimalTempMax+rand(0, 200)) + OptimalpHMin += rand(1, 10) + OptimalpHMax = (OptimalpHMin + rand(1, 5)) + ReactpHLim += rand(-2, 2) + CurveSharpT += (rand(1, 500)/100) + CurveSharppH += (rand(1, 500)/100) + ThermicConstant += rand(-50, 50) + HIonRelease += (rand(-25, 25)/100) + RateUpLim += (rand(1, 1000)/100) + PurityMin += (rand(-1, 1)/10) + var/additions = list("aluminium", "silver", "gold", "plasma", "silicon", "bluespace", "uranium", "milk") + required_reagents[pick(additions)] = rand(1, 5)//weird + +/datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. + SSblackbox.record_feedback("tally", "catgirlium")//log + +/datum/chemical_reaction/fermi/secretcatchem/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) + var/mob/living/simple_animal/pet/cat/custom_cat/catto = new(get_turf(my_atom)) + var/list/seen = viewers(8, get_turf(my_atom)) + for(var/mob/M in seen) + to_chat(M, "The reaction suddenly gives out a meow, condensing into a chemcat!")//meow! + playsound(get_turf(my_atom), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) + catto.name = "FermiCat" + catto.desc = "A cute Fermichem cat, created by a lot of compicated and confusing chemistry!" + catto.color = "#770000" + my_atom.reagents.remove_any(10) From 1461f46292300029896e78deba3ec06731d68b78 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 31 May 2019 03:12:00 +0100 Subject: [PATCH 200/608] Added a catch to prevent acid from being rascals. --- code/game/objects/effects/alien_acid.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/effects/alien_acid.dm b/code/game/objects/effects/alien_acid.dm index 1a605d64b0..9dbb389e4e 100644 --- a/code/game/objects/effects/alien_acid.dm +++ b/code/game/objects/effects/alien_acid.dm @@ -18,7 +18,8 @@ if(acid_amt) acid_level = min(acid_amt*acid_pwr, 12000) //capped so the acid effect doesn't last a half hour on the floor. - + if(acid_level < 0)//Fix for a weird runtime. + acid_level = 0 //handle APCs and newscasters and stuff nicely pixel_x = target.pixel_x + rand(-4,4) pixel_y = target.pixel_y + rand(-4,4) From 08e72ba05e7d54554a0aaee4b8adb3f8f48b5978 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 31 May 2019 03:49:25 +0100 Subject: [PATCH 201/608] Why does adjustLungLoss not workkkkkkkkkkkkkkkkk --- code/modules/surgery/organs/lungs.dm | 15 ++++++++------- .../reagents/chemistry/reagents/fermi_reagents.dm | 8 ++++---- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 12e763fafd..76229b10a5 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -61,7 +61,8 @@ var/damage = 0 //TODO: lung health affects lung function -/obj/item/organ/lungs/proc/adjustLungLoss(mob/living/carbon/M, damage_mod) +/obj/item/organ/lungs/proc/adjustLungLoss(damage_mod, mob/living/carbon/M) + message_admins("lung damage: [damage_mod], damage: [damage]") if (maxHealth == "plasma") return if(damage+damage_mod < 0) @@ -405,13 +406,13 @@ var/cold_modifier = H.dna.species.coldmod if(breath_temperature < cold_level_3_threshold) H.apply_damage_type(cold_level_3_damage*cold_modifier, cold_damage_type) - adjustLungLoss(cold_level_3_damage*cold_modifier) + adjustLungLoss(cold_level_3_damage*cold_modifier, H) if(breath_temperature > cold_level_3_threshold && breath_temperature < cold_level_2_threshold) H.apply_damage_type(cold_level_2_damage*cold_modifier, cold_damage_type) - adjustLungLoss(cold_level_2_damage*cold_modifier) + adjustLungLoss(cold_level_2_damage*cold_modifier, H) if(breath_temperature > cold_level_2_threshold && breath_temperature < cold_level_1_threshold) H.apply_damage_type(cold_level_1_damage*cold_modifier, cold_damage_type) - adjustLungLoss(cold_level_1_damage*cold_modifier) + adjustLungLoss(cold_level_1_damage*cold_modifier, H) if(breath_temperature < cold_level_1_threshold) if(prob(20)) to_chat(H, "You feel [cold_message] in your [name]!") @@ -420,13 +421,13 @@ var/heat_modifier = H.dna.species.heatmod if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold) H.apply_damage_type(heat_level_1_damage*heat_modifier, heat_damage_type) - adjustLungLoss(cold_level_1_damage*heat_modifier) + adjustLungLoss(cold_level_1_damage*heat_modifier, H) if(breath_temperature > heat_level_2_threshold && breath_temperature < heat_level_3_threshold) H.apply_damage_type(heat_level_2_damage*heat_modifier, heat_damage_type) - adjustLungLoss(cold_level_1_damage*heat_modifier) + adjustLungLoss(cold_level_1_damage*heat_modifier, H) if(breath_temperature > heat_level_3_threshold) H.apply_damage_type(heat_level_3_damage*heat_modifier, heat_damage_type) - adjustLungLoss(cold_level_1_damage*heat_modifier) + adjustLungLoss(cold_level_1_damage*heat_modifier, H) if(breath_temperature > heat_level_1_threshold) if(prob(20)) to_chat(H, "You feel [hot_message] in your [name]!") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index f748dd6a33..1d679b3ecb 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -114,10 +114,10 @@ ..() /datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location - do_sparks(5,FALSE,src) + do_sparks(5,FALSE,M) to_chat(M, "You feel your wavefunction collapse!") do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home - do_sparks(5,FALSE,src) + do_sparks(5,FALSE,M) ..() /datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly @@ -1373,8 +1373,8 @@ Creating a chem with a low purity will make you permanently fall in love with so if(prob(20)) to_chat(C, "You can feel your lungs burning!") var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) - L.adjustLungLoss(acidstr) - C.apply_damage(acidstr/2, BURN, target) + L.adjustLungLoss(acidstr, C) + C.apply_damage(acidstr/3, BURN, target) C.acid_act(acidstr, volume) ..() From adeffe0c47a424e2ae48bbb18a713e0d4965eed6 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 31 May 2019 04:16:18 +0100 Subject: [PATCH 202/608] Fixed lungs. --- code/modules/surgery/organs/lungs.dm | 1 - modular_citadel/code/datums/status_effects/chems.dm | 2 +- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 8 ++++---- .../code/modules/reagents/chemistry/recipes/fermi.dm | 1 - 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 76229b10a5..846f32205d 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -62,7 +62,6 @@ //TODO: lung health affects lung function /obj/item/organ/lungs/proc/adjustLungLoss(damage_mod, mob/living/carbon/M) - message_admins("lung damage: [damage_mod], damage: [damage]") if (maxHealth == "plasma") return if(damage+damage_mod < 0) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 06ca536eee..045d6807bd 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -209,7 +209,7 @@ var/mob/living/carbon/M = owner var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list if(!E) - message_admins("WARNING: FermiChem: No master found in thrall, did you bus in the chem? You need to set up the vars manually if it's not reacted. Someone set up the reaction incorrectly if not. Console them with a fermiplush please.") + message_admins("WARNING: FermiChem: No master found in thrall, did you bus in the chem? You need to set up the vars manually if it's not reacted/bussed. Someone set up the reaction incorrectly if not (Don't use donor blood). Console them with a fermiplush maybe?") enthrallID = E.creatorID enthrallGender = E.creatorGender master = get_mob_by_key(enthrallID) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 1d679b3ecb..1c31ba2a65 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1365,16 +1365,16 @@ Creating a chem with a low purity will make you permanently fall in love with so color = "#FFFFFF" pH = 0 -/datum/reagent/fermi/fermiAcid/on_mob_life(mob/living/carbon/C, method) +/datum/reagent/fermi/fermiAcid/reaction_mob(mob/living/carbon/C, method) var/target = C.get_bodypart(BODY_ZONE_CHEST) var/acidstr = ((5-C.reagents.pH)*2) - C.adjustFireLoss(acidstr, 0) - if(method==VAPOR) + C.adjustFireLoss(acidstr/2, 0) + if((method==VAPOR) && if(!C.wear_mask)) if(prob(20)) to_chat(C, "You can feel your lungs burning!") var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) L.adjustLungLoss(acidstr, C) - C.apply_damage(acidstr/3, BURN, target) + C.apply_damage(acidstr/5, BURN, target) C.acid_act(acidstr, volume) ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index b9383ea430..3ad833f5e4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -246,7 +246,6 @@ /datum/chemical_reaction/fermi/enthrall/FermiFinish(datum/reagents/holder, var/atom/my_atom) - message_admins("On finish for enthral proc'd") var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list if(!B.data) From d0811e5be65b2ba8738dc6a2f9a1c5a708a0a3ec Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 31 May 2019 04:26:41 +0100 Subject: [PATCH 203/608] Adjusted lung health. --- code/modules/surgery/organs/lungs.dm | 9 +++++---- code/modules/surgery/organs/tongue.dm | 8 ++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 846f32205d..c13a7b249b 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -1,4 +1,4 @@ -#define LUNGS_MAX_HEALTH 450 +#define LUNGS_MAX_HEALTH 300 /obj/item/organ/lungs name = "lungs" @@ -61,7 +61,8 @@ var/damage = 0 //TODO: lung health affects lung function -/obj/item/organ/lungs/proc/adjustLungLoss(damage_mod, mob/living/carbon/M) +/obj/item/organ/lungs/proc/adjustLungLoss(damage_mod, mob/living/carbon/M) //damage might be too low atm. + message_admins("[M] lung damage: [damage_mod], damage: [damage]") if (maxHealth == "plasma") return if(damage+damage_mod < 0) @@ -452,7 +453,7 @@ desc = "A cybernetic version of the lungs found in traditional humanoid entities. It functions the same as an organic lung and is merely meant as a replacement." icon_state = "lungs-c" synthetic = TRUE - maxHealth = 600 + maxHealth = 400 /obj/item/organ/lungs/cybernetic/emp_act() . = ..() @@ -472,7 +473,7 @@ cold_level_1_threshold = 200 cold_level_2_threshold = 140 cold_level_3_threshold = 100 - maxHealth = 750 + maxHealth = 550 /obj/item/organ/lungs/ashwalker name = "ash lungs" diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 5dadd2a729..c6fcbab33a 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -1,4 +1,4 @@ -#define TONGUE_MAX_HEALTH 50 +#define TONGUE_MAX_HEALTH 560 /obj/item/organ/tongue name = "tongue" @@ -74,7 +74,7 @@ icon_state = "tonguelizard" say_mod = "hisses" taste_sensitivity = 10 // combined nose + tongue, extra sensitive - maxHealth = 35 //extra sensitivity means tongue is more susceptible to damage + maxHealth = 40 //extra sensitivity means tongue is more susceptible to damage /obj/item/organ/tongue/lizard/TongueSpeech(var/message) var/regex/lizard_hiss = new("s+", "g") @@ -133,7 +133,7 @@ icon_state = "tonguezombie" say_mod = "moans" taste_sensitivity = 32 - maxHealth = 60 //Stop! It's already dead...! + maxHealth = 65 //Stop! It's already dead...! /obj/item/organ/tongue/zombie/TongueSpeech(var/message) var/list/message_list = splittext(message, " ") @@ -157,7 +157,7 @@ icon_state = "tonguexeno" say_mod = "hisses" taste_sensitivity = 10 // LIZARDS ARE ALIENS CONFIRMED - maxHealth = "alien" + maxHealth = "alien" //Their blood is acid, so, no, though a tongueless xeno might be funny var/static/list/languages_possible_alien = typecacheof(list( /datum/language/xenocommon, /datum/language/common, From 1244b848bf698829281c600fe1adee34a2e7af2a Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 31 May 2019 04:29:35 +0100 Subject: [PATCH 204/608] Compile safe. --- .../code/modules/reagents/chemistry/reagents/fermi_reagents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 1c31ba2a65..2cf8603595 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1369,7 +1369,7 @@ Creating a chem with a low purity will make you permanently fall in love with so var/target = C.get_bodypart(BODY_ZONE_CHEST) var/acidstr = ((5-C.reagents.pH)*2) C.adjustFireLoss(acidstr/2, 0) - if((method==VAPOR) && if(!C.wear_mask)) + if((method==VAPOR) && (!C.wear_mask)) if(prob(20)) to_chat(C, "You can feel your lungs burning!") var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) From e1577111a022cfd2602e55614051965470dcde7d Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 31 May 2019 05:09:07 +0100 Subject: [PATCH 205/608] TO BE TESTED: Added the ability for slimes to make MKUltra. --- code/modules/mob/living/blood.dm | 17 +++++++++- .../chemistry/reagents/fermi_reagents.dm | 4 +-- .../reagents/chemistry/recipes/fermi.dm | 33 +++++++++++++++---- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index bb7e38f91d..e6dc89d47d 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -164,7 +164,7 @@ return /mob/living/carbon/get_blood_data(blood_id) - if(blood_id == "blood") //actual blood reagent + if(blood_id == "blood") //actual blood reagent var/blood_data = list() //set the blood data blood_data["donor"] = src @@ -207,6 +207,21 @@ if(istype(ling)) blood_data["changeling_loudness"] = ling.loudfactor return blood_data + if(blood_id == "slimejelly") + var/blood_data = list() + if(mind) + blood_data["mind"] = mind + else if(last_mind) + blood_data["mind"] = last_mind + if(ckey) + blood_data["ckey"] = ckey + else if(last_mind) + blood_data["ckey"] = ckey(last_mind.key) + blood_data["gender"] = gender + blood_data["real_name"] = real_name + return blood_data + + //get the id of the substance this mob use as blood. /mob/proc/get_blood_id() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 2cf8603595..b050d461a3 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1440,9 +1440,9 @@ Creating a chem with a low purity will make you permanently fall in love with so //I'm concerned this is too weak, but I also don't want deathmixes. /datum/reagent/fermi/fermiTox/on_mob_life(mob/living/carbon/C, method) if(C.dna && istype(C.dna.species, /datum/species/jelly)) - C.adjustToxLoss(-2.5) + C.adjustToxLoss(-2) else - C.adjustToxLoss(2.5) + C.adjustToxLoss(2) ..() /datum/reagent/fermi/fermiABuffer diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 3ad833f5e4..3d3017f847 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -148,7 +148,7 @@ CurveSharpT = 2 CurveSharppH = 2 ThermicConstant = 1 - HIonRelease = 0.1 + HIonRelease = -0.1 RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE @@ -180,7 +180,7 @@ CurveSharpT = 2 CurveSharppH = 2 ThermicConstant = 1 - HIonRelease = -0.1 + HIonRelease = 0.1 RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE @@ -236,15 +236,13 @@ //CatalystFact = 0 CurveSharpT = 0.5 CurveSharppH = 4 - ThermicConstant = 15 + ThermicConstant = 20 HIonRelease = 0.1 RateUpLim = 1 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.2 - - /datum/chemical_reaction/fermi/enthrall/FermiFinish(datum/reagents/holder, var/atom/my_atom) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list @@ -264,6 +262,29 @@ E.data.["creatorID"] = B.data.["ckey"] E.creatorID = B.data.["ckey"] +//So slimes can play too. +/datum/chemical_reaction/fermi/enthrall/slime + required_catalysts = list("slimejelly" = 1) + +/datum/chemical_reaction/fermi/enthrall/slime/FermiFinish(datum/reagents/holder, var/atom/my_atom) + var/datum/reagent/toxin/slimejelly/B = locate(/datum/reagent/toxin/slimejelly) in my_atom.reagents.reagent_list + var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list + if(!B.data) + var/list/seen = viewers(5, get_turf(my_atom)) + for(var/mob/M in seen) + to_chat(M, "The reaction splutters and fails to react.") //if this appears, WHAT?! + E.purity = 0 + if (B.data.["gender"] == "female") + E.data.["creatorGender"] = "Mistress" + E.creatorGender = "Mistress" + else + E.data.["creatorGender"] = "Master" + E.creatorGender = "Master" + E.data["creatorName"] = B.data.["real_name"] + E.creatorName = B.data.["real_name"] + E.data.["creatorID"] = B.data.["ckey"] + E.creatorID = B.data.["ckey"] + /datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) var/turf/T = get_turf(my_atom) var/datum/reagents/R = new/datum/reagents(1000) @@ -404,7 +425,7 @@ var/datum/reagent/fermi/fermiBBuffer/Fb = locate(/datum/reagent/fermi/fermiBBuffer) in my_atom.reagents.reagent_list Fb.data = 11 -//secretcatchemcode, shh!! Of couse I hide it amongst cats. Also, yes, I expect you, Mr.Maintaner to read and review this, dispite it being hidden and not mentioned in the changelogs. +//secretcatchemcode, shh!! Of couse I hide it amongst cats. Though, I moved it with your requests. //I'm not trying to be sneaky, I'm trying to keep it a secret! //I don't know how to do hidden chems like Aurora //ChemReactionVars: From abfcc25e9140302c3a1fcfd47ce6793c311c574a Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 31 May 2019 23:54:30 +0100 Subject: [PATCH 206/608] No changed, just staching a comment. --- code/modules/mob/living/blood.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index e6dc89d47d..77c0d4985f 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -207,7 +207,7 @@ if(istype(ling)) blood_data["changeling_loudness"] = ling.loudfactor return blood_data - if(blood_id == "slimejelly") + if(blood_id == "slimejelly") //Just so MKUltra works. Takes the minimum required data. Sishen is testing if this breaks stuff. var/blood_data = list() if(mind) blood_data["mind"] = mind From 2eceb6f57bdcadb8152978adf70dc13a4b7227ae Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 01:28:52 +0100 Subject: [PATCH 207/608] Added a cybernetic tongue and sprites. Fixed furranium. --- code/modules/mob/living/taste.dm | 4 ++++ .../research/designs/medical_designs.dm | 10 ++++++++++ code/modules/research/techweb/all_nodes.dm | 2 +- code/modules/surgery/organs/tongue.dm | 12 +++++++++++- icons/obj/surgery.dmi | Bin 34848 -> 34739 bytes .../chemistry/reagents/fermi_reagents.dm | 8 ++++---- 6 files changed, 30 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index 5692eb99da..deb6884105 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -44,6 +44,10 @@ if ((from.pH > 12.5) || (from.pH < 1.5)) to_chat(src, "You taste chemical burns!") T.adjustTongueLoss(src, 4) + if(istype(T, /obj/item/organ/tongue/cybernetic)) + to_chat(src, "Your tongue moves on it's own in response to the liquid.") + src.say("The pH is appropriately [round(from.pH, 1)].") + return if (!has_trait(TRAIT_AGEUSIA)) //I'll let you get away with not having 1 damage. switch(from.pH) if(11.5 to INFINITY) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 9005b1cd30..f3a347b6a2 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -580,6 +580,16 @@ category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL +/datum/design/cybernetic_tongue + name = "Cybernetic tongue" + desc = "A fancy cybernetic tongue." + id = "cybernetic_tongue" + build_type = PROTOLATHE + materials = list(MAT_METAL = 500, MAT_GLASS = 500) + build_path = /obj/item/organ/tongue/cybernetic + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + ///////////////////// //Adv Surgery Tools// ///////////////////// diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index de9dd4b71f..bc310ac699 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -481,7 +481,7 @@ display_name = "Cybernetic Organs" description = "We have the technology to rebuild him." prereq_ids = list("adv_biotech") - design_ids = list("cybernetic_heart", "cybernetic_liver", "cybernetic_liver_u", "cybernetic_lungs", "cybernetic_lungs_u") + design_ids = list("cybernetic_heart", "cybernetic_liver", "cybernetic_liver_u", "cybernetic_lungs", "cybernetic_lungs_u, cybernetic_tongue") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index c6fcbab33a..e1e616069c 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -235,7 +235,7 @@ /obj/item/organ/tongue/OwO name = "fluffy tongue" desc = "OwO what's this?" - icon_state = "tonguenormal" + icon_state = "tonguefluffy" taste_sensitivity = 10 // extra sensitive and inquisitive uwu maxHealth = 35 //Sensitive tongue! @@ -253,3 +253,13 @@ message += pick(" OwO", " uwu") message = lowertext(message) return message + +/obj/item/organ/tongue/cybernetic + name = "cybernetic tongue" + desc = "A state of the art robotic tongue that can detect the pH of anything drank." + icon_state = "tonguecybernetic" + taste_sensitivity = 10 // extra sensitive and inquisitive uwu + maxHealth = 70 //It's robotic! + +/obj/item/organ/tongue/cybernetic/get_spans() + return ..() | SPAN_ROBOT diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 1a3b344566e33144ad4561ff8319f9d8eeb2b259..9a2d2ceb1a45bf002333e9255cbac8229197528f 100755 GIT binary patch delta 15485 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

      YXtK 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 diff --git a/tgstation.dme b/tgstation.dme index fe821189c3..a40dec7441 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2506,22 +2506,10 @@ #include "code\modules\research\designs\AI_module_designs.dm" #include "code\modules\research\designs\biogenerator_designs.dm" #include "code\modules\research\designs\bluespace_designs.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_all_misc.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_cargo .dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_engi.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_medical.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sci.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sec.dm" #include "code\modules\research\designs\computer_part_designs.dm" #include "code\modules\research\designs\electronics_designs.dm" #include "code\modules\research\designs\equipment_designs.dm" #include "code\modules\research\designs\limbgrower_designs.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_all_misc.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_cargo.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_engi.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_medical.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_sci.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_service.dm" #include "code\modules\research\designs\mecha_designs.dm" #include "code\modules\research\designs\mechfabricator_designs.dm" #include "code\modules\research\designs\medical_designs.dm" @@ -2539,6 +2527,18 @@ #include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" #include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm" #include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_all_misc.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_cargo .dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_engi.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_medical.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sci.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sec.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_all_misc.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_cargo.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_engi.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_medical.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_sci.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_service.dm" #include "code\modules\research\machinery\_production.dm" #include "code\modules\research\machinery\circuit_imprinter.dm" #include "code\modules\research\machinery\departmental_circuit_imprinter.dm" From 40aa231b6419212c55cb7598000403ad84c898e4 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 04:31:34 +0100 Subject: [PATCH 210/608] Made MKUltra's OD on self turn the player into a narcissist. --- code/modules/research/techweb/all_nodes.dm | 2 +- code/modules/surgery/organs/tongue.dm | 4 +-- code/modules/surgery/organs/vocal_cords.dm | 33 +++++-------------- .../code/datums/status_effects/chems.dm | 20 +++++++---- .../chemistry/reagents/fermi_reagents.dm | 11 ++++--- .../reagents/chemistry/recipes/fermi.dm | 2 +- 6 files changed, 33 insertions(+), 39 deletions(-) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index bc310ac699..901bcdd92a 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -481,7 +481,7 @@ display_name = "Cybernetic Organs" description = "We have the technology to rebuild him." prereq_ids = list("adv_biotech") - design_ids = list("cybernetic_heart", "cybernetic_liver", "cybernetic_liver_u", "cybernetic_lungs", "cybernetic_lungs_u, cybernetic_tongue") + design_ids = list("cybernetic_heart", "cybernetic_liver", "cybernetic_liver_u", "cybernetic_lungs", "cybernetic_lungs_u", "cybernetic_tongue") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index e1e616069c..8e366e54dd 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -258,8 +258,8 @@ name = "cybernetic tongue" desc = "A state of the art robotic tongue that can detect the pH of anything drank." icon_state = "tonguecybernetic" - taste_sensitivity = 10 // extra sensitive and inquisitive uwu - maxHealth = 70 //It's robotic! + taste_sensitivity = 10 + maxHealth = 60 //It's robotic! /obj/item/organ/tongue/cybernetic/get_spans() return ..() | SPAN_ROBOT diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 01e03bc8b8..0b00f0b58f 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -677,26 +677,15 @@ return 0 //no cooldown var/log_message = message - /* - if(!span_list || !span_list.len) //Not too sure what this does, I think it changes your output message depending if you're a cultist or not? I.e. font - if(iscultist(user)) - span_list = list("narsiesmall") - else if (is_servant_of_ratvar(user)) - span_list = list("ratvar") - else - span_list = list() - */ - //user.say(message, sanitize = TRUE)//Removed spans = span_list, It should just augment normal speech//DO NOT ENABLE, RECURSION HELL //FIND THRALLS - message = lowertext(message) var/mob/living/list/listeners = list() for(var/mob/living/L in get_hearers_in_view(8, user)) if(L.can_hear() && !L.anti_magic_check(FALSE, TRUE) && L.stat != DEAD) if(L.has_status_effect(/datum/status_effect/chem/enthrall))//Check to see if they have the status - if(L == user && !include_speaker) - continue + //if(L == user && !include_speaker) //Remove this if I decide to make OD apply to self. + // continue if(ishuman(L)) var/mob/living/carbon/human/H = L if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) @@ -854,12 +843,10 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] has praised me!!"), 5) if(L.has_trait(TRAIT_NYMPHO)) L.adjustArousalLoss(2*power_multiplier) - /*enable when maso is added if(L.has_trait(TRAIT_MASO)) E.enthrallTally -= power_multiplier E.resistanceTally += power_multiplier E.cooldown += 1 - */ else addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've been praised for doing a good job!"), 5) E.resistanceTally -= power_multiplier @@ -877,16 +864,14 @@ //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values var/descmessage = "[(L.lewd?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]" if (L.lewd) - //TODO: ADD THIS IN WHEN MASO IS MERGED - /* if(L.has_trait(TRAIT_MASO)) L.adjustArousalLoss(3*power_multiplier) descmessage += "And yet, it feels so good..!" //I don't really understand masco, is this the right sort of thing they like? E.enthrallTally += power_multiplier E.resistanceTally -= power_multiplier addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've let [E.enthrallGender] down...!"), 5) - else*/ - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've let [E.enthrallGender] down..."), 5) + else + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've let [E.enthrallGender] down..."), 5) else addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've failed [E.master]..."), 5) E.resistanceTally += power_multiplier @@ -1115,7 +1100,7 @@ if (E.phase > 2) for (var/trigger in E.customTriggers) speaktrigger += "[trigger], " - C.add_trait(TRAIT_DEAF, "Triggers") //So you don't trigger yourself! + C.add_trait(TRAIT_DEAF, "Triggers") //So you don't trigger yourself! Actually this will trigger yourself oops. addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, /atom/movable/proc/say, "[speaktrigger]"), 5) C.remove_trait(TRAIT_DEAF, "Triggers") @@ -1207,12 +1192,12 @@ var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) - if(3 to INFINITY)//Tier 3 only + if(3)//Tier 3 only E.status = "heal" E.statusStrength = (5 * power_multiplier) E.cooldown += 5 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You begin to lick your wounds."), 5) - L.Stun(5 * power_multiplier) + L.Stun(15 * power_multiplier) //STUN else if(findtext(message, stun_words)) @@ -1276,7 +1261,7 @@ var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) - if(3 to INFINITY)//Tier 3 only + if(3)//Tier 3 only E.status = "pacify" E.cooldown += 10 @@ -1286,7 +1271,7 @@ var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) - if(3 to INFINITY)//Tier 3 only + if(3)//Tier 3 only E.statusStrength = 2* power_multiplier E.status = "charge" E.cooldown += 10 diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 045d6807bd..bdef46d001 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -213,8 +213,8 @@ enthrallID = E.creatorID enthrallGender = E.creatorGender master = get_mob_by_key(enthrallID) - if(M.ckey == enthrallID) - owner.remove_status_effect(src)//This shouldn't happen, but just in case, also it's not worth the overhead of giving someone themselves; they can't proc themselves as velvet removes them from the list. + //if(M.ckey == enthrallID) + // owner.remove_status_effect(src)//This shouldn't happen, but just in case, also it's not worth the overhead of giving someone themselves; they can't proc themselves as velvet removes them from the list. redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear) var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! @@ -321,6 +321,15 @@ M.confused = 0 resistGrowth = 0 else + if (cooldown > 0) + cooldown -= (0.8 + (mental_capacity/500)) + cooldownMsg = FALSE + else if (cooldownMsg == FALSE) + if(DistApart < 10) + if(master.lewd) + to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") + else + to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") return//If you break the mind of someone, you can't use status effects on them. @@ -515,13 +524,10 @@ if (cTriggered == TRUE) return var/mob/living/carbon/C = owner - //message_admins("[C] heard something!") raw_message = lowertext(raw_message) for (var/trigger in customTriggers) var/cached_trigger = lowertext(trigger) - //message_admins("[C] heard something: [message] vs [trigger] vs [raw_message]") if (findtext(raw_message, cached_trigger))//if trigger1 is the message - message_admins("[C] has been triggered with [trigger]!") cTriggered = TRUE //Speak (Forces player to talk) works @@ -551,7 +557,7 @@ if (C.has_trait(TRAIT_NYMPHO)) if (C.getArousalLoss() > 80) C.mob_climax(forced_climax=TRUE) - C.SetStun(20)//We got your stun effects in somewhere, Kev. + C.SetStun(10)//We got your stun effects in somewhere, Kev. else C.adjustArousalLoss(10) else @@ -637,7 +643,7 @@ to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") //nymphomania if (M.canbearoused && M.has_trait(TRAIT_NYMPHO))//I'm okay with this being removed. - deltaResist*= ((100 - M.arousalloss/100)/100)//more aroused you are, the weaker resistance you can give + deltaResist*= 0.5-(((2/200)*M.arousalloss)/1)//more aroused you are, the weaker resistance you can give, the less you are, the more you gain. (+/- 0.5) //chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist. if (owner.reagents.has_reagent("mannitol")) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index b99e9c830d..061ecf9972 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -130,7 +130,7 @@ do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) M.reagents.remove_reagent(src.id, 0.5)//So you're not stuck for 10 minutes teleporting - ..() //loop function + ..() //Addiction /datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride. @@ -191,7 +191,7 @@ src.addictCyc3++ do_teleport(M, get_turf(M), 2, no_effects=TRUE) //Teleports player randomly do_sparks(5,FALSE,M) - ..() //loop function + ..() /datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. switch(src.addictCyc4) @@ -323,7 +323,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING SM.setBrainLoss(40) SM.nutrition = startHunger/2 - //Really hacky way to deal with this stupid problem I have, and heal the clone. I think around 30u will make a healthy clone. + //Transfer remaining reagent to clone. I think around 30u will make a healthy clone, otherwise they'll have clone damage, blood loss, brain damage and hunger. SM.reagents.add_reagent("SDGFheal", volume) M.reagents.remove_reagent(src.id, src.volume) return @@ -1083,6 +1083,8 @@ Creating a chem with a low purity will make you permanently fall in love with so /datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I made it so the creator is set to gain the status for someone random. . = ..() if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 100u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.) + to_chat(M, "You are unable to resist your own charms anymore, and become a full blown narcissist.") + /*Old way of handling, left in as an option B var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers for(var/mob/living/carbon/victim in seen) if(victim == M)//as much as I want you to fall for beepsky, he doesn't have a ckey @@ -1097,6 +1099,7 @@ Creating a chem with a low purity will make you permanently fall in love with so creatorGender = "Master" creatorName = chosen.real_name creator = get_mob_by_key(creatorID) + */ M.add_trait(TRAIT_PACIFISM, "MKUltra") var/datum/status_effect/chem/enthrall/E if (!M.has_status_effect(/datum/status_effect/chem/enthrall)) @@ -1107,7 +1110,7 @@ Creating a chem with a low purity will make you permanently fall in love with so E.master = creator else E = M.has_status_effect(/datum/status_effect/chem/enthrall) - to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side at all costs.") + to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side at all costs.") M.slurring = 100 M.confused = 100 E.phase = 4 diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 3d3017f847..74a54bb87f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -267,7 +267,7 @@ required_catalysts = list("slimejelly" = 1) /datum/chemical_reaction/fermi/enthrall/slime/FermiFinish(datum/reagents/holder, var/atom/my_atom) - var/datum/reagent/toxin/slimejelly/B = locate(/datum/reagent/toxin/slimejelly) in my_atom.reagents.reagent_list + var/datum/reagent/toxin/slimejelly/B = locate(/datum/reagent/toxin/slimejelly) in my_atom.reagents.reagent_list//The one line change. var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list if(!B.data) var/list/seen = viewers(5, get_turf(my_atom)) From 4513dd98153b53965b6bc8a2e338b445c1b2413a Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 2 Jun 2019 22:26:53 +0100 Subject: [PATCH 211/608] MINUTE define changes. --- code/__DEFINES/time.dm | 5 ---- code/datums/mood_events/drink_events.dm | 8 +++---- .../mood_events/generic_negative_events.dm | 24 +++++++++---------- .../mood_events/generic_positive_events.dm | 10 ++++---- code/datums/mood_events/needs_events.dm | 2 +- .../code/datums/mood_events/chem_events.dm | 4 ++-- .../mood_events/generic_negative_events.dm | 8 +++---- .../mood_events/generic_positive_events.dm | 4 ++-- 8 files changed, 30 insertions(+), 35 deletions(-) diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index 41a4ae3273..f13f13510b 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -32,8 +32,3 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using #define TIME_STAMP(format, showds) showds ? "[WORLDTIMEOFDAY2TEXT(format)]:[world.timeofday % 10]" : WORLDTIMEOFDAY2TEXT(format) #define STATION_TIME(display_only) ((((world.time - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0) #define STATION_TIME_TIMESTAMP(format) time2text(STATION_TIME(TRUE), format) - -//For moodlets -#define ONEMINUTE 600 -#define TWOMINUTES 1200 -#define THREEMINUTES 1800 diff --git a/code/datums/mood_events/drink_events.dm b/code/datums/mood_events/drink_events.dm index dff72feeb7..b2e9861c41 100644 --- a/code/datums/mood_events/drink_events.dm +++ b/code/datums/mood_events/drink_events.dm @@ -6,19 +6,19 @@ /datum/mood_event/quality_nice description = "That drink wasn't bad at all.\n" mood_change = 1 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/quality_good description = "That drink was pretty good.\n" mood_change = 2 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/quality_verygood description = "That drink was great!\n" mood_change = 3 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/quality_fantastic description = "That drink was amazing!\n" mood_change = 4 - timeout = TWOMINUTES + timeout = 2 MINUTESS diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 376510fe59..8c4a6c67aa 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -19,7 +19,7 @@ /datum/mood_event/burnt_thumb description = "I shouldn't play with lighters...\n" mood_change = -1 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/cold description = "It's way too cold in here.\n" @@ -32,17 +32,17 @@ /datum/mood_event/creampie description = "I've been creamed. Tastes like pie flavor.\n" mood_change = -2 - timeout = THREEMINUTES + timeout = 3 MINUTESS /datum/mood_event/slipped description = "I slipped. I should be more careful next time...\n" mood_change = -2 - timeout = THREEMINUTES + timeout = 3 MINUTESS /datum/mood_event/eye_stab description = "I used to be an adventurer like you, until I took a screwdriver to the eye.\n" mood_change = -4 - timeout = THREEMINUTES + timeout = 3 MINUTESS /datum/mood_event/delam //SM delamination description = "Those God damn engineers can't do anything right...\n" @@ -52,12 +52,12 @@ /datum/mood_event/depression description = "I feel sad for no particular reason.\n" mood_change = -9 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/shameful_suicide //suicide_acts that return SHAME, like sord description = "I can't even end it all!\n" mood_change = -10 - timeout = ONEMINUTE + timeout = 1 MINUTES /datum/mood_event/dismembered description = "AHH! I WAS USING THAT LIMB!\n" @@ -71,7 +71,7 @@ /datum/mood_event/tased description = "There's no \"z\" in \"taser\". It's in the zap.\n" mood_change = -3 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/embedded description = "Pull it out!\n" @@ -80,7 +80,7 @@ /datum/mood_event/table description = "Someone threw me on a table!\n" mood_change = -2 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/table/add_effects() if(ishuman(owner)) @@ -122,7 +122,7 @@ /datum/mood_event/healsbadman description = "I feel a lot better, but wow that was disgusting.\n" mood_change = -4 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/jittery description = "I'm nervous and on edge and I can't stand still!!\n" @@ -131,17 +131,17 @@ /datum/mood_event/vomit description = "I just threw up. Gross.\n" mood_change = -2 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/vomitself description = "I just threw up all over myself. This is disgusting.\n" mood_change = -4 - timeout = THREEMINUTES + timeout = 3 MINUTESS /datum/mood_event/painful_medicine description = "Medicine may be good for me but right now it stings like hell.\n" mood_change = -5 - timeout = ONEMINUTE + timeout = 1 MINUTES //These are unused so far but I want to remember them to use them later /datum/mood_event/cloned_corpse diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index a92e946526..7710c730eb 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -1,7 +1,7 @@ /datum/mood_event/hug description = "Hugs are nice.\n" mood_change = 1 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/arcade description = "I beat the arcade game!\n" @@ -50,7 +50,7 @@ /datum/mood_event/jolly description = "I feel happy for no particular reason.\n" mood_change = 6 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/focused description = "I have a goal, and I will reach it, whatever it takes!\n" //Used for syndies, nukeops etc so they can focus on their goals @@ -74,7 +74,7 @@ /datum/mood_event/goodmusic description = "There is something soothing about this music.\n" mood_change = 3 - timeout = ONEMINUTE + timeout = 1 MINUTES /datum/mood_event/chemical_euphoria description = "Heh...hehehe...hehe...\n" @@ -83,9 +83,9 @@ /datum/mood_event/chemical_laughter description = "Laughter really is the best medicine! Or is it?\n" mood_change = 4 - timeout = THREEMINUTES + timeout = 3 MINUTESS /datum/mood_event/chemical_superlaughter description = "*WHEEZE*\n" mood_change = 12 - timeout = THREEMINUTES + timeout = 3 MINUTESS diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm index 30b9d64953..4d8a397b73 100644 --- a/code/datums/mood_events/needs_events.dm +++ b/code/datums/mood_events/needs_events.dm @@ -59,4 +59,4 @@ /datum/mood_event/nice_shower description = "I have recently had a nice shower.\n" mood_change = 2 - timeout = THREEMINUTES + timeout = 3 MINUTESS diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index c82615d796..55e0c1b617 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -10,14 +10,14 @@ /datum/mood_event/enthrallpraise mood_change = 10 - timeout = ONEMINUTE + timeout = 1 MINUTES /datum/mood_event/enthrallpraise/add_effects(message) description = "[message]\n" /datum/mood_event/enthrallscold mood_change = -10 - timeout = ONEMINUTE + timeout = 1 MINUTES /datum/mood_event/enthrallscold/add_effects(message) description = "[message]\n"//aaa I'm not kinky enough for this diff --git a/modular_citadel/code/datums/mood_events/generic_negative_events.dm b/modular_citadel/code/datums/mood_events/generic_negative_events.dm index 93c4cfe59c..83ec1c8d23 100644 --- a/modular_citadel/code/datums/mood_events/generic_negative_events.dm +++ b/modular_citadel/code/datums/mood_events/generic_negative_events.dm @@ -3,19 +3,19 @@ /datum/mood_event/plushjack description = "I have butchered a plush recently.\n" mood_change = -1 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/plush_nostuffing description = "A plush I tried to pet had no stuffing...\n" mood_change = -1 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/emptypred description = "I had to let someone out.\n" mood_change = -2 - timeout = ONEMINUTE + timeout = 1 MINUTES /datum/mood_event/emptyprey description = "It feels quite cold out here.\n" mood_change = -2 - timeout = ONEMINUTE + timeout = 1 MINUTES diff --git a/modular_citadel/code/datums/mood_events/generic_positive_events.dm b/modular_citadel/code/datums/mood_events/generic_positive_events.dm index ff6944201b..971efdd7ca 100644 --- a/modular_citadel/code/datums/mood_events/generic_positive_events.dm +++ b/modular_citadel/code/datums/mood_events/generic_positive_events.dm @@ -3,12 +3,12 @@ /datum/mood_event/headpat description = "Headpats are nice.\n" mood_change = 2 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/hugbox description = "I hugged a box of hugs recently.\n" mood_change = 1 - timeout = TWOMINUTES + timeout = 2 MINUTESS /datum/mood_event/plushpet description = "I pet a plush recently.\n" From a3e60843bcf7e10a69c6a8c37c05e273025c44b9 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 2 Jun 2019 22:35:16 +0100 Subject: [PATCH 212/608] Renamed blood trait and spelt minutes right. --- code/datums/mood_events/drink_events.dm | 8 ++++---- .../mood_events/generic_negative_events.dm | 20 +++++++++---------- .../mood_events/generic_positive_events.dm | 8 ++++---- code/datums/mood_events/needs_events.dm | 2 +- code/datums/traits/good.dm | 4 ++-- .../mood_events/generic_negative_events.dm | 4 ++-- .../mood_events/generic_positive_events.dm | 4 ++-- 7 files changed, 25 insertions(+), 25 deletions(-) diff --git a/code/datums/mood_events/drink_events.dm b/code/datums/mood_events/drink_events.dm index b2e9861c41..cb4c300f60 100644 --- a/code/datums/mood_events/drink_events.dm +++ b/code/datums/mood_events/drink_events.dm @@ -6,19 +6,19 @@ /datum/mood_event/quality_nice description = "That drink wasn't bad at all.\n" mood_change = 1 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/quality_good description = "That drink was pretty good.\n" mood_change = 2 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/quality_verygood description = "That drink was great!\n" mood_change = 3 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/quality_fantastic description = "That drink was amazing!\n" mood_change = 4 - timeout = 2 MINUTESS + timeout = 2 MINUTE diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 8c4a6c67aa..20dacdd38f 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -19,7 +19,7 @@ /datum/mood_event/burnt_thumb description = "I shouldn't play with lighters...\n" mood_change = -1 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/cold description = "It's way too cold in here.\n" @@ -32,17 +32,17 @@ /datum/mood_event/creampie description = "I've been creamed. Tastes like pie flavor.\n" mood_change = -2 - timeout = 3 MINUTESS + timeout = 3 MINUTE /datum/mood_event/slipped description = "I slipped. I should be more careful next time...\n" mood_change = -2 - timeout = 3 MINUTESS + timeout = 3 MINUTE /datum/mood_event/eye_stab description = "I used to be an adventurer like you, until I took a screwdriver to the eye.\n" mood_change = -4 - timeout = 3 MINUTESS + timeout = 3 MINUTE /datum/mood_event/delam //SM delamination description = "Those God damn engineers can't do anything right...\n" @@ -52,7 +52,7 @@ /datum/mood_event/depression description = "I feel sad for no particular reason.\n" mood_change = -9 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/shameful_suicide //suicide_acts that return SHAME, like sord description = "I can't even end it all!\n" @@ -71,7 +71,7 @@ /datum/mood_event/tased description = "There's no \"z\" in \"taser\". It's in the zap.\n" mood_change = -3 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/embedded description = "Pull it out!\n" @@ -80,7 +80,7 @@ /datum/mood_event/table description = "Someone threw me on a table!\n" mood_change = -2 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/table/add_effects() if(ishuman(owner)) @@ -122,7 +122,7 @@ /datum/mood_event/healsbadman description = "I feel a lot better, but wow that was disgusting.\n" mood_change = -4 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/jittery description = "I'm nervous and on edge and I can't stand still!!\n" @@ -131,12 +131,12 @@ /datum/mood_event/vomit description = "I just threw up. Gross.\n" mood_change = -2 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/vomitself description = "I just threw up all over myself. This is disgusting.\n" mood_change = -4 - timeout = 3 MINUTESS + timeout = 3 MINUTE /datum/mood_event/painful_medicine description = "Medicine may be good for me but right now it stings like hell.\n" diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 7710c730eb..acc8a620ad 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -1,7 +1,7 @@ /datum/mood_event/hug description = "Hugs are nice.\n" mood_change = 1 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/arcade description = "I beat the arcade game!\n" @@ -50,7 +50,7 @@ /datum/mood_event/jolly description = "I feel happy for no particular reason.\n" mood_change = 6 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/focused description = "I have a goal, and I will reach it, whatever it takes!\n" //Used for syndies, nukeops etc so they can focus on their goals @@ -83,9 +83,9 @@ /datum/mood_event/chemical_laughter description = "Laughter really is the best medicine! Or is it?\n" mood_change = 4 - timeout = 3 MINUTESS + timeout = 3 MINUTE /datum/mood_event/chemical_superlaughter description = "*WHEEZE*\n" mood_change = 12 - timeout = 3 MINUTESS + timeout = 3 MINUTE diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm index 4d8a397b73..5c36054768 100644 --- a/code/datums/mood_events/needs_events.dm +++ b/code/datums/mood_events/needs_events.dm @@ -59,4 +59,4 @@ /datum/mood_event/nice_shower description = "I have recently had a nice shower.\n" mood_change = 2 - timeout = 3 MINUTESS + timeout = 3 MINUTE diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index c023a4f180..be46a8aa21 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -171,8 +171,8 @@ H.regenerate_icons() /datum/quirk/bloodpressure - name = "Synthetic blood" - desc = "You've got a new form of synthetic blood that increases the total blood volume inside of you as well as the rate of replenishment!" + name = "Polycythemia vera" + desc = "You've a treated form of Polycythemia vera that increases the total blood volume inside of you as well as the rate of replenishment!" value = 1 //I honeslty dunno if this is a good trait? I just means you use more of medbays blood and make janitors madder, but you also regen blood a lil faster. mob_trait = TRAIT_HIGH_BLOOD gain_text = "You feel full of blood!" diff --git a/modular_citadel/code/datums/mood_events/generic_negative_events.dm b/modular_citadel/code/datums/mood_events/generic_negative_events.dm index 83ec1c8d23..2d03a7e990 100644 --- a/modular_citadel/code/datums/mood_events/generic_negative_events.dm +++ b/modular_citadel/code/datums/mood_events/generic_negative_events.dm @@ -3,12 +3,12 @@ /datum/mood_event/plushjack description = "I have butchered a plush recently.\n" mood_change = -1 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/plush_nostuffing description = "A plush I tried to pet had no stuffing...\n" mood_change = -1 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/emptypred description = "I had to let someone out.\n" diff --git a/modular_citadel/code/datums/mood_events/generic_positive_events.dm b/modular_citadel/code/datums/mood_events/generic_positive_events.dm index 971efdd7ca..3f9f405955 100644 --- a/modular_citadel/code/datums/mood_events/generic_positive_events.dm +++ b/modular_citadel/code/datums/mood_events/generic_positive_events.dm @@ -3,12 +3,12 @@ /datum/mood_event/headpat description = "Headpats are nice.\n" mood_change = 2 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/hugbox description = "I hugged a box of hugs recently.\n" mood_change = 1 - timeout = 2 MINUTESS + timeout = 2 MINUTE /datum/mood_event/plushpet description = "I pet a plush recently.\n" From a5b3ec793942be4304597caccf406ce06f9281d1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 2 Jun 2019 22:38:55 +0100 Subject: [PATCH 213/608] Acid changes. --- code/game/objects/effects/alien_acid.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/objects/effects/alien_acid.dm b/code/game/objects/effects/alien_acid.dm index 9dbb389e4e..3b5a029df4 100644 --- a/code/game/objects/effects/alien_acid.dm +++ b/code/game/objects/effects/alien_acid.dm @@ -17,9 +17,8 @@ target = get_turf(src) if(acid_amt) - acid_level = min(acid_amt*acid_pwr, 12000) //capped so the acid effect doesn't last a half hour on the floor. - if(acid_level < 0)//Fix for a weird runtime. - acid_level = 0 + acid_level = min( (CLAMP(round(acid_amt, 1), 0, INFINITY)) *acid_pwr, 12000) //capped so the acid effect doesn't last a half hour on the floor. + //handle APCs and newscasters and stuff nicely pixel_x = target.pixel_x + rand(-4,4) pixel_y = target.pixel_y + rand(-4,4) From 0eec1ed3f3f5706099d3938d16b1b2f2cf623f6b Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 2 Jun 2019 22:49:04 +0100 Subject: [PATCH 214/608] Pooj changes. --- code/__HELPERS/global_lists.dm | 3 ++- code/datums/mood_events/drink_events.dm | 8 ++++---- .../mood_events/generic_negative_events.dm | 20 +++++++++---------- .../mood_events/generic_positive_events.dm | 8 ++++---- code/datums/mood_events/needs_events.dm | 2 +- .../mood_events/generic_negative_events.dm | 4 ++-- .../mood_events/generic_positive_events.dm | 4 ++-- .../code/modules/arousal/organs/breasts.dm | 8 ++++---- .../code/modules/arousal/organs/genitals.dm | 2 +- .../code/modules/arousal/organs/penis.dm | 12 +++++------ .../chemistry/reagents/fermi_reagents.dm | 4 ++-- 11 files changed, 38 insertions(+), 37 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index f6ef08fe0d..d78405eb64 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -53,7 +53,8 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) - GLOB.breasts_size_list = list("a","b","c","d","e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing. + GLOB.breasts_size_list = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "flat") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing. + GLOB.gentlmans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger") //END OF CIT CHANGES //Species diff --git a/code/datums/mood_events/drink_events.dm b/code/datums/mood_events/drink_events.dm index cb4c300f60..7c32ef7421 100644 --- a/code/datums/mood_events/drink_events.dm +++ b/code/datums/mood_events/drink_events.dm @@ -6,19 +6,19 @@ /datum/mood_event/quality_nice description = "That drink wasn't bad at all.\n" mood_change = 1 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/quality_good description = "That drink was pretty good.\n" mood_change = 2 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/quality_verygood description = "That drink was great!\n" mood_change = 3 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/quality_fantastic description = "That drink was amazing!\n" mood_change = 4 - timeout = 2 MINUTE + timeout = 2 MINUTES diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 20dacdd38f..6424078b12 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -19,7 +19,7 @@ /datum/mood_event/burnt_thumb description = "I shouldn't play with lighters...\n" mood_change = -1 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/cold description = "It's way too cold in here.\n" @@ -32,17 +32,17 @@ /datum/mood_event/creampie description = "I've been creamed. Tastes like pie flavor.\n" mood_change = -2 - timeout = 3 MINUTE + timeout = 3 MINUTES /datum/mood_event/slipped description = "I slipped. I should be more careful next time...\n" mood_change = -2 - timeout = 3 MINUTE + timeout = 3 MINUTES /datum/mood_event/eye_stab description = "I used to be an adventurer like you, until I took a screwdriver to the eye.\n" mood_change = -4 - timeout = 3 MINUTE + timeout = 3 MINUTES /datum/mood_event/delam //SM delamination description = "Those God damn engineers can't do anything right...\n" @@ -52,7 +52,7 @@ /datum/mood_event/depression description = "I feel sad for no particular reason.\n" mood_change = -9 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/shameful_suicide //suicide_acts that return SHAME, like sord description = "I can't even end it all!\n" @@ -71,7 +71,7 @@ /datum/mood_event/tased description = "There's no \"z\" in \"taser\". It's in the zap.\n" mood_change = -3 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/embedded description = "Pull it out!\n" @@ -80,7 +80,7 @@ /datum/mood_event/table description = "Someone threw me on a table!\n" mood_change = -2 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/table/add_effects() if(ishuman(owner)) @@ -122,7 +122,7 @@ /datum/mood_event/healsbadman description = "I feel a lot better, but wow that was disgusting.\n" mood_change = -4 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/jittery description = "I'm nervous and on edge and I can't stand still!!\n" @@ -131,12 +131,12 @@ /datum/mood_event/vomit description = "I just threw up. Gross.\n" mood_change = -2 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/vomitself description = "I just threw up all over myself. This is disgusting.\n" mood_change = -4 - timeout = 3 MINUTE + timeout = 3 MINUTES /datum/mood_event/painful_medicine description = "Medicine may be good for me but right now it stings like hell.\n" diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index acc8a620ad..c4045f2e07 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -1,7 +1,7 @@ /datum/mood_event/hug description = "Hugs are nice.\n" mood_change = 1 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/arcade description = "I beat the arcade game!\n" @@ -50,7 +50,7 @@ /datum/mood_event/jolly description = "I feel happy for no particular reason.\n" mood_change = 6 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/focused description = "I have a goal, and I will reach it, whatever it takes!\n" //Used for syndies, nukeops etc so they can focus on their goals @@ -83,9 +83,9 @@ /datum/mood_event/chemical_laughter description = "Laughter really is the best medicine! Or is it?\n" mood_change = 4 - timeout = 3 MINUTE + timeout = 3 MINUTES /datum/mood_event/chemical_superlaughter description = "*WHEEZE*\n" mood_change = 12 - timeout = 3 MINUTE + timeout = 3 MINUTES diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm index 5c36054768..eb58f2aa92 100644 --- a/code/datums/mood_events/needs_events.dm +++ b/code/datums/mood_events/needs_events.dm @@ -59,4 +59,4 @@ /datum/mood_event/nice_shower description = "I have recently had a nice shower.\n" mood_change = 2 - timeout = 3 MINUTE + timeout = 3 MINUTES diff --git a/modular_citadel/code/datums/mood_events/generic_negative_events.dm b/modular_citadel/code/datums/mood_events/generic_negative_events.dm index 2d03a7e990..bb04b0b283 100644 --- a/modular_citadel/code/datums/mood_events/generic_negative_events.dm +++ b/modular_citadel/code/datums/mood_events/generic_negative_events.dm @@ -3,12 +3,12 @@ /datum/mood_event/plushjack description = "I have butchered a plush recently.\n" mood_change = -1 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/plush_nostuffing description = "A plush I tried to pet had no stuffing...\n" mood_change = -1 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/emptypred description = "I had to let someone out.\n" diff --git a/modular_citadel/code/datums/mood_events/generic_positive_events.dm b/modular_citadel/code/datums/mood_events/generic_positive_events.dm index 3f9f405955..ffa661e6e9 100644 --- a/modular_citadel/code/datums/mood_events/generic_positive_events.dm +++ b/modular_citadel/code/datums/mood_events/generic_positive_events.dm @@ -3,12 +3,12 @@ /datum/mood_event/headpat description = "Headpats are nice.\n" mood_change = 2 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/hugbox description = "I hugged a box of hugs recently.\n" mood_change = 1 - timeout = 2 MINUTE + timeout = 2 MINUTES /datum/mood_event/plushpet description = "I pet a plush recently.\n" diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 27a2d720bf..ea2fe492f3 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -9,7 +9,7 @@ size = BREASTS_SIZE_DEF //SHOULD BE A LETTER, starts as a number...??? var/cached_size = null //for enlargement SHOULD BE A NUMBER var/prev_size //For flavour texts SHOULD BE A LETTER - var/breast_sizes = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "flat") + //var/breast_sizes = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "flat") var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0) var/statuscheck = FALSE fluid_id = "milk" @@ -95,12 +95,12 @@ owner.remove_status_effect(/datum/status_effect/chem/BElarger) statuscheck = FALSE if(1 to 8) //If modest size - size = breast_sizes[round(cached_size)] + size = GLOB.breasts_size_list[round(cached_size)] if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) owner.remove_status_effect(/datum/status_effect/chem/BElarger) statuscheck = FALSE if(9 to 15) //If massive - size = breast_sizes[round(cached_size)] + size = GLOB.breasts_size_list[round(cached_size)] if(!owner.has_status_effect(/datum/status_effect/chem/BElarger)) owner.apply_status_effect(/datum/status_effect/chem/BElarger) statuscheck = TRUE @@ -113,7 +113,7 @@ if(size == 0)//Bloody byond with it's counting from 1 size = "flat" if(isnum(prev_size)) - prev_size = breast_sizes[prev_size] + prev_size = GLOB.breasts_size_list[prev_size] if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") var/mob/living/carbon/human/H = owner diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index a2b4a34549..73afd75002 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -171,7 +171,7 @@ P.length = dna.features["cock_length"] P.girth_ratio = dna.features["cock_girth_ratio"] P.shape = dna.features["cock_shape"] - P.prev_size = P.length + P.prev_length = P.length P.cached_length = P.length P.update() diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 560e019196..4dd10c3ab0 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -18,7 +18,7 @@ var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF var/list/dickflags = list() var/list/knotted_types = list("knotted", "barbed, knotted") - var/prev_size = 6 //really should be renamed to prev_length + var/prev_length = 6 //really should be renamed to prev_length /obj/item/organ/genital/penis/Initialize() . = ..() @@ -59,11 +59,11 @@ if(!owner.has_status_effect(/datum/status_effect/chem/PElarger)) o.apply_status_effect(/datum/status_effect/chem/PElarger) - if (round(length) > round(prev_size)) - to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.") - else if (round(length) < round(prev_size)) - to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.") - prev_size = length + if (round(length) > round(prev_length)) + to_chat(o, "Your [pick(GLOB.gentlmans_organ_names)] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.") + else if (round(length) < round(prev_length)) + to_chat(o, "Your [pick(GLOB.gentlmans_organ_names)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.") + prev_length = length icon_state = sanitize_text("penis_[shape]_[size]") girth = (length * girth_ratio)//Is it just me or is this ludicous, why not make it exponentially decay? diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 061ecf9972..e16d12dcc3 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -660,7 +660,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(!P) H.emergent_genital_call() return - P.prev_size = P.length + P.prev_length = P.length P.cached_length = P.length /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch. @@ -675,7 +675,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING nP.length = 1 to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.") nP.cached_length = 1 - nP.prev_size = 1 + nP.prev_length = 1 M.reagents.remove_reagent(src.id, 5) P = nP From 255aa6044108db437445b063d03b5473e0eedecb Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 2 Jun 2019 22:57:50 +0100 Subject: [PATCH 215/608] Final pooj changes. --- code/__HELPERS/_cit_helpers.dm | 1 + code/__HELPERS/global_lists.dm | 2 +- modular_citadel/code/datums/status_effects/chems.dm | 4 ++-- modular_citadel/code/init.dm | 2 +- modular_citadel/code/modules/arousal/organs/penis.dm | 4 ++-- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index eb2a564d1b..fbed9ba201 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -58,6 +58,7 @@ GLOBAL_LIST_EMPTY(ipc_antennas_list) //Genitals and Arousal Lists GLOBAL_LIST_EMPTY(cock_shapes_list)//global_lists.dm for the list initializations //Now also _DATASTRUCTURES globals.dm GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states for cockshapes. +GLOBAL_LIST_EMPTY(gentlemans_organ_names) GLOBAL_LIST_EMPTY(breasts_size_list) GLOBAL_LIST_EMPTY(breasts_shapes_list) GLOBAL_LIST_EMPTY(vagina_shapes_list) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index d78405eb64..0aeb0e0280 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -54,7 +54,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) GLOB.breasts_size_list = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "flat") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing. - GLOB.gentlmans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger") + GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger") //END OF CIT CHANGES //Species diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index bdef46d001..561a8a7e33 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -81,10 +81,10 @@ if((B.cached_size) < 16) switch(round(B.cached_size)) if(9) - if (B.breast_sizes[B.prev_size] != B.breast_sizes[B.size]) + if (GLOB.breasts_size_list[B.prev_size] != GLOB.breasts_size_list[B.size]) to_chat(o, "Your expansive chest has become a more managable size, liberating your movements.") if(10 to INFINITY) - if (B.breast_sizes[B.prev_size] != B.breast_sizes[B.size]) + if (GLOB.breasts_size_list[B.prev_size] != GLOB.breasts_size_list[B.size]) to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!") if(prob(2)) to_chat(owner, "Your back is feeling a little sore.") diff --git a/modular_citadel/code/init.dm b/modular_citadel/code/init.dm index 2c2b5b811f..ce80580af2 100644 --- a/modular_citadel/code/init.dm +++ b/modular_citadel/code/init.dm @@ -22,4 +22,4 @@ GLOB.cock_shapes_icons[K] = value.icon_state init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) - GLOB.breasts_size_list = list("a","b","c","d","e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing. + //GLOB.breasts_size_list = list("a","b","c","d","e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing. This is defined twice? diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 4dd10c3ab0..a01e83fe8d 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -60,9 +60,9 @@ o.apply_status_effect(/datum/status_effect/chem/PElarger) if (round(length) > round(prev_length)) - to_chat(o, "Your [pick(GLOB.gentlmans_organ_names)] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.") + to_chat(o, "Your [pick(GLOB.gentlemans_organ_names)] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.") else if (round(length) < round(prev_length)) - to_chat(o, "Your [pick(GLOB.gentlmans_organ_names)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.") + to_chat(o, "Your [pick(GLOB.gentlemans_organ_names)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.") prev_length = length icon_state = sanitize_text("penis_[shape]_[size]") girth = (length * girth_ratio)//Is it just me or is this ludicous, why not make it exponentially decay? From 228ab5b7c9c6a3be8925e830240ea572068cc40c Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 5 Jun 2019 00:23:42 +0100 Subject: [PATCH 216/608] +Acute hepatic pharmacokinesis. (untested, will test with alterations)CC --- code/__DEFINES/traits.dm | 1 + code/game/objects/items/devices/scanners.dm | 9 ++++ code/modules/surgery/organs/liver.dm | 30 ++++++++++++ modular_citadel/code/datums/traits/neutral.dm | 10 ++++ .../code/modules/arousal/organs/genitals.dm | 3 ++ .../chemistry/reagents/fermi_reagents.dm | 49 +++++++++++++++++-- 6 files changed, 99 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 3ac0b8b9fb..9040ee25d8 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -75,6 +75,7 @@ #define TRAIT_NYMPHO "nymphomania" #define TRAIT_MASO "masochism" #define TRAIT_HIGH_BLOOD "high_blood" +#define TRAIT_PHARMA "hepatic_pharmacokinesis" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index a613e9c518..c733b2086b 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -137,6 +137,15 @@ SLIME SCANNER to_chat(user, "Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!") if(H.undergoing_liver_failure() && H.stat != DEAD) to_chat(user, "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!") + var/obj/item/organ/liver/L = M.getorganslot("liver") + if(L.swelling > 20) + to_chat(user, "Subject is suffering from hyperhepatia.") //i.e. shrink their liver or give them a transplant. + var/obj/item/organ/tongue/T = M.getorganslot("tongue") + if(!T || T.damage > 40) + to_chat(user, "Subject is suffering from caustic burns on their tongue./span>") //i.e. their tongue is shot + var/obj/item/organ/lungs/Lung = M.getorganslot("lungs") + if(Lung.damage > 150) + to_chat(user, "Subject is suffering from an acute inhalation injury.") //i.e. Their lungs are shot var/msg = "*---------*\nAnalyzing results for [M]:\n\tOverall status: [mob_status]\n" diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index ee767566e6..75c9c0e2eb 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -16,6 +16,8 @@ var/toxTolerance = LIVER_DEFAULT_TOX_TOLERANCE//maximum amount of toxins the liver can just shrug off var/toxLethality = LIVER_DEFAULT_TOX_LETHALITY//affects how much damage toxins do to the liver var/filterToxins = TRUE //whether to filter toxins + var/swelling = 0 + var/cachedmoveCalc = 1 /obj/item/organ/liver/on_life() var/mob/living/carbon/C = owner @@ -45,11 +47,39 @@ if(damage > maxHealth)//cap liver damage damage = maxHealth + if(swelling >= 10) + pharmacokinesis() + /obj/item/organ/liver/prepare_eat() var/obj/S = ..() S.reagents.add_reagent("iron", 5) return S +//Just in case +/obj/item/organ/liver/Remove(mob/living/carbon/M, special = 0) + M.remove_movespeed_modifier("pharma") + M.ResetBloodVol() //At the moment, this shouldn't allow application twice. You either have this OR a thirsty ferret. + sizeMoveMod(1, M) + +//Applies some of the effects to the patient. +/obj/item/organ/liver/proc/pharmacokinesis() + var/moveCalc = 1+((round(swelling) - 9)/3) + if(moveCalc == cachedmoveCalc)//reduce calculations + return + if(prob(5)) + to_chat(owner, "You feel a stange ache in your side, almost like a sitch. You notice a hint of perspiration as your breathing becomes labored, this pain is affeting your movements and amking you feel lightheaded.") + var/mob/living/carbon/human/H = owner + H.add_movespeed_modifier("pharma", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) + H.AdjustBloodVol(moveCalc/3) + sizeMoveMod(moveCalc, H) + +/obj/item/organ/liver/proc/sizeMoveMod(var/value, mob/living/carbon/human/H) + if(cachedmoveCalc == value) + return + H.next_move_modifier /= cachedmoveCalc + H.next_move_modifier *= value + cachedmoveCalc = value + /obj/item/organ/liver/fly name = "insectoid liver" icon_state = "liver-x" //xenomorph liver? It's just a black liver so it fits. diff --git a/modular_citadel/code/datums/traits/neutral.dm b/modular_citadel/code/datums/traits/neutral.dm index 05aeb27361..eb48a58c7f 100644 --- a/modular_citadel/code/datums/traits/neutral.dm +++ b/modular_citadel/code/datums/traits/neutral.dm @@ -31,3 +31,13 @@ mob_trait = TRAIT_MASO gain_text = "You desire to be hurt." lose_text = "Pain has become less exciting for you." + +/datum/quirk/pharmacokinesis //Prevents unwanted organ additions. + name = "Acute hepatic pharmacokinesis" + desc = "You've a rare genetic disorder that causes certain chemicals to be absorbed by your liver instead." + value = 0 + mob_trait = TRAIT_PHARMA + lose_text = "Your liver feels different." + var/active = FALSE + var/power = 0 + var/cachedmoveCalc = 1 diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 73afd75002..d93496e867 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -297,6 +297,9 @@ var/organCheck = FALSE var/breastCheck = FALSE var/willyCheck = FALSE + if(!canbearoused) + add_trait(TRAIT_PHARMA)//Prefs prevent unwanted organs. + return for(var/obj/item/organ/O in internal_organs) if(istype(O, /obj/item/organ/genital)) organCheck = TRUE diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index e16d12dcc3..27450aa060 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -547,10 +547,19 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size if(!ishuman(M))//Just in case - return + return..() + var/mob/living/carbon/human/H = M var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) //If they don't have breasts, give them breasts. + + //If they have Acute hepatic pharmacokinesis, then route processing though liver. + if(M.has_trait(TRAIT_PHARMA)) + var/obj/item/organ/liver/L = M.getorganslot("liver") + L.swelling+= 0.1 + return..() + + //otherwise proceed as normal var/obj/item/organ/genital/breasts/nB = new nB.Insert(M) if(nB) @@ -579,6 +588,12 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/BElarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. + //Acute hepatic pharmacokinesis. + if(M.has_trait(TRAIT_PHARMA)) + var/obj/item/organ/liver/L = M.getorganslot("liver") + L.swelling+= 0.05 + return ..() + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") @@ -614,7 +629,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M) var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) - return + //Acute hepatic pharmacokinesis. + if(M.has_trait(TRAIT_PHARMA)) + var/obj/item/organ/liver/L = M.getorganslot("liver") + L.swelling-= 0.1 + return ..() + + //otherwise proceed as normal + return..() B.cached_size = B.cached_size - 0.1 B.update() ..() @@ -669,6 +691,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/mob/living/carbon/human/H = M var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P)//They do have a preponderance for escapism, or so I've heard. + + //If they have Acute hepatic pharmacokinesis, then route processing though liver. + if(M.has_trait(TRAIT_PHARMA)) + var/obj/item/organ/liver/L = M.getorganslot("liver") + L.swelling+= 0.1 + return..() + + //otherwise proceed as normal var/obj/item/organ/genital/penis/nP = new nP.Insert(M) if(nP) @@ -690,6 +720,12 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ..() /datum/reagent/fermi/PElarger/overdose_process(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. + //Acute hepatic pharmacokinesis. + if(M.has_trait(TRAIT_PHARMA)) + var/obj/item/organ/liver/L = M.getorganslot("liver") + L.swelling+= 0.05 + return..() + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") @@ -724,7 +760,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/mob/living/carbon/human/H = M var/obj/item/organ/genital/penis/P = H.getorganslot("penis") if(!P) - return + //Acute hepatic pharmacokinesis. + if(M.has_trait(TRAIT_PHARMA)) + var/obj/item/organ/liver/L = M.getorganslot("liver") + L.swelling-= 0.1 + return..() + + //otherwise proceed as normal + return..() P.cached_length = P.cached_length - 0.1 P.update() ..() From 83666abfeaab98c62705759b48a9a0688ad350d3 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 6 Jun 2019 22:56:59 +0100 Subject: [PATCH 217/608] Small text edits and tightening up of self MKU OD. --- code/modules/surgery/organs/liver.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 64 ++----------------- .../code/datums/status_effects/chems.dm | 3 + .../chemistry/reagents/fermi_reagents.dm | 7 +- 4 files changed, 17 insertions(+), 59 deletions(-) diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index 75c9c0e2eb..ada2c12b9a 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -67,7 +67,7 @@ if(moveCalc == cachedmoveCalc)//reduce calculations return if(prob(5)) - to_chat(owner, "You feel a stange ache in your side, almost like a sitch. You notice a hint of perspiration as your breathing becomes labored, this pain is affeting your movements and amking you feel lightheaded.") + to_chat(owner, "You feel a stange ache in your side, almost like a sitch. This pain is affecting your movements and making you feel lightheaded.") var/mob/living/carbon/human/H = owner H.add_movespeed_modifier("pharma", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) H.AdjustBloodVol(moveCalc/3) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 0b00f0b58f..a826ba72ae 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -617,61 +617,16 @@ name = "velvet chords" desc = "The voice spoken from these just make you want to drift off, sleep and obey." icon_state = "in_love" - //actions_types = list(/datum/action/item_action/organ_action/velvet) var/next_command = 0 var/cooldown_mod = 1 var/base_multiplier = 1 - spans = list("say","yell") + //spans = list("say","yell") -/* -/datum/action/item_action/organ_action/velvet - name = "Velvet voice" - var/obj/item/organ/vocal_cords/velvet/cords = null - -/datum/action/item_action/organ_action/velvet/New() - ..() - cords = target - -/datum/action/item_action/organ_action/velvet/IsAvailable() - return TRUE - -/datum/action/item_action/organ_action/velvet/Trigger() - . = ..() - if(!IsAvailable()) - if(world.time < cords.next_command) - to_chat(owner, "You must wait [DisplayTimeText(cords.next_command - world.time)] before Speaking again.") - return - var/command = input(owner, "Speak with the Voice of God", "Command") - if(QDELETED(src) || QDELETED(owner)) - return - if(!command) - return - owner.say(".x[command]") - -/obj/item/organ/vocal_cords/colossus/can_speak_with() - if(!owner) - return FALSE - if(!owner.can_speak()) - to_chat(owner, "You are unable to speak!") - return FALSE - return TRUE - -/obj/item/organ/vocal_cords/velvet/handle_speech(message) - velvetspeech(message, owner, spans, base_multiplier) - return //velvetspeech should handle speech - - - -/obj/item/organ/vocal_cords/velvet/speak_with(message) - velvetspeech(message, owner, spans, base_multiplier) - //next_command = world.time + (cooldown * cooldown_mod) -*/ ////////////////////////////////////// ///////////FermiChem////////////////// ////////////////////////////////////// //Removed span_list from input arguments. //mob/living/user /proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE, debug = FALSE) - //message_admins("Velvet speech proc'd on [user]") if(!user || !user.can_speak() || user.stat) return 0 //no cooldown @@ -764,13 +719,6 @@ if(debug == TRUE) to_chat(world, "[user]'s power is [power_multiplier].") - /* CHECK THIS STUFF IN THE CHEM STATUS INSTEAD. - if(istype(H.neck, /obj/item/clothing/neck/petcollar)) - power_multiplier *= 1.5 //Collaring players makes them more docile and accepting of their place as a pet - if(H.has_trait(TRAIT_CROCRIN_IMMUNE) || !M.canbearoused) - power_multiplier *= 1.5//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. - */ - //Mixables var/static/regex/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara") //enthral_words works var/static/regex/reward_words = regex("good boy|good girl|good pet|good job") //reward_words works @@ -822,7 +770,8 @@ var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, V)+1] - //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values + if(L == user) + continue if(length(message)) E.enthrallTally += (power_multiplier*(((length(message))/200) + 1)) //encourage players to say more than one word. else @@ -838,7 +787,8 @@ var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, V)+1] - //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values + if(L == user) + continue if (L.lewd) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] has praised me!!"), 5) if(L.has_trait(TRAIT_NYMPHO)) @@ -860,9 +810,9 @@ for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) - //power_multiplier *= distancelist[get_dist(user, V)+1] - //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values var/descmessage = "[(L.lewd?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]" + if(L == user) + continue if (L.lewd) if(L.has_trait(TRAIT_MASO)) L.adjustArousalLoss(3*power_multiplier) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 561a8a7e33..36032edec4 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -219,6 +219,9 @@ RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear) var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! mental_capacity = 500 - B.get_brain_damage() + if(M.ishuman)//Prefs + if(!M.canbearoused) + var/lewd = FALSE var/message = "[(owner.lewd?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 27450aa060..a60c2f7549 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1064,6 +1064,11 @@ Creating a chem with a low purity will make you permanently fall in love with so return var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) //Somehow a beaker got here? (what) if(E) + if(E.creatorID == M.ckey && creatorName != M.real_name)//If you're enthralled to yourself (from OD) and someone else tries to enthrall you, you become thralled to them instantly. + E.enthrallID = creatorID + E.enthrallGender = creatorGender + E.master = get_mob_by_key(creatorID) + to_chat(M, to_chat(M, "Your aldled, plastic, mind bends under the chemical influence of a new [(owner.lewd?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.")) //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE. return if(purity < 0.5)//Impure chems don't function as you expect return @@ -1086,7 +1091,7 @@ Creating a chem with a low purity will make you permanently fall in love with so . = ..() if(purity < 0.5)//DO NOT SPLIT INTO DIFFERENT CHEM: This relies on DoNotSplit - has to be done this way. if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. - if(M.has_status_effect(STATUS_EFFECT_INLOVE)) + if(M.has_status_effect(STATUS_EFFECT_INLOVE))//Can't be enthralled when enthralled, so to speak. return var/list/seen = viewers(7, get_turf(M)) for(var/victim in seen) From 05067463c520c109f7fb8e8e5ea696c0400a6ed8 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 6 Jun 2019 23:02:14 +0100 Subject: [PATCH 218/608] Missed a comment. --- code/modules/surgery/organs/vocal_cords.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index a826ba72ae..7ba3d6e757 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -857,7 +857,6 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) else addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of [E.master]'s fingers brings you back to being under their command."), 5) - //to_chat(L, ) //tier 1 From 8be37e049411521f8f5b8da0689b7b4750dca3d5 Mon Sep 17 00:00:00 2001 From: TrilbySpaseClone Date: Wed, 12 Jun 2019 18:50:52 -0400 Subject: [PATCH 219/608] Update gasthelizards.dmm --- .../RandomRuins/SpaceRuins/gasthelizards.dmm | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm b/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm index 8956267108..e21c3a92f7 100644 --- a/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm +++ b/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm @@ -103,7 +103,7 @@ /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard, -/turf/open/floor/plasteel/airless/dark, +/turf/open/floor/plasteel/freezer, /area/ruin/space/has_grav/gasthelizard) "n" = ( /obj/structure/closet/crate/freezer, @@ -117,7 +117,7 @@ }, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard, -/turf/open/floor/plasteel/airless/dark, +/turf/open/floor/plasteel/freezer, /area/ruin/space/has_grav/gasthelizard) "o" = ( /obj/structure/closet/crate/freezer, @@ -129,7 +129,7 @@ /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard, -/turf/open/floor/plasteel/airless/dark, +/turf/open/floor/plasteel/freezer, /area/ruin/space/has_grav/gasthelizard) "p" = ( /obj/structure/window/reinforced{ @@ -158,7 +158,7 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/gasthelizard) "r" = ( -/turf/open/floor/plasteel/airless/dark, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/gasthelizard) "s" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -203,14 +203,14 @@ /area/ruin/space/has_grav/gasthelizard) "x" = ( /obj/structure/kitchenspike, -/turf/open/floor/plasteel/airless/dark, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/gasthelizard) "y" = ( /obj/structure/table/reinforced, /obj/item/kitchen/knife/butcher, /obj/item/restraints/handcuffs, /obj/item/reagent_containers/spray/pepper, -/turf/open/floor/plasteel/airless/dark, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/gasthelizard) "z" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -230,14 +230,14 @@ /area/ruin/space/has_grav/gasthelizard) "C" = ( /obj/machinery/gibber, -/turf/open/floor/plasteel/airless/dark, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/gasthelizard) "D" = ( /obj/structure/table/reinforced, /obj/item/clothing/suit/straight_jacket, /obj/item/reagent_containers/syringe/lethal, /obj/item/reagent_containers/syringe/lethal/choral, -/turf/open/floor/plasteel/airless/dark, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/gasthelizard) "E" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -258,7 +258,7 @@ /area/ruin/space/has_grav/gasthelizard) "H" = ( /obj/machinery/door/airlock/security, -/turf/open/floor/plasteel/airless/dark, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/gasthelizard) "I" = ( /obj/item/reagent_containers/glass/bottle/morphine{ @@ -282,7 +282,7 @@ pixel_y = 6 }, /obj/structure/table/reinforced, -/turf/open/floor/plasteel/airless/dark, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/gasthelizard) "J" = ( /obj/structure/rack, @@ -328,12 +328,12 @@ /obj/item/cautery, /obj/item/circular_saw, /obj/machinery/light, -/turf/open/floor/plasteel/airless/dark, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/gasthelizard) "Q" = ( /obj/structure/table/optable, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel/airless/dark, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/gasthelizard) "R" = ( /obj/structure/table/reinforced, @@ -342,7 +342,7 @@ /obj/item/reagent_containers/glass/bottle/mutagen, /obj/item/reagent_containers/glass/bottle/mutagen, /obj/item/razor, -/turf/open/floor/plasteel/airless/dark, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/gasthelizard) "S" = ( /obj/machinery/suit_storage_unit/security, From 0fa194575acec8ee9307d5df0b10f3439c7c47e8 Mon Sep 17 00:00:00 2001 From: Thalpy <33956696+Thalpy@users.noreply.github.com> Date: Thu, 13 Jun 2019 00:42:27 +0100 Subject: [PATCH 220/608] Update DNA.dm --- code/__DEFINES/DNA.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 02833c4bbe..4ed099d9e2 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -122,4 +122,3 @@ #define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun" #define ORGAN_SLOT_TAIL "tail" #define ORGAN_SLOT_PENIS "penis" -//#define ORGAN_SLOT_BREASTS "breasts" From 463b4e19ecaed7d44a09d20ed8823070217fed75 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 01:01:19 +0100 Subject: [PATCH 221/608] (var/mob/living/master = parent) fix --- code/datums/components/mood.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index b94147c277..11b3b19b65 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -167,7 +167,7 @@ HandleNutrition(owner) /datum/component/mood/proc/setSanity(amount, minimum=SANITY_INSANE, maximum=SANITY_NEUTRAL)//I'm sure bunging this in here will have no negative repercussions. - var/mob/living/owner = parent + var/mob/living/master = parent if(amount == sanity) return @@ -179,12 +179,11 @@ amount = sanity - 0.5 // Disturbed stops you from getting any more sane - if(owner.has_trait(TRAIT_UNSTABLE)) + if(parent.has_trait(TRAIT_UNSTABLE)) sanity = min(amount,sanity) else sanity = amount - var/mob/living/master = parent switch(sanity) if(SANITY_INSANE to SANITY_CRAZY) setInsanityEffect(MAJOR_INSANITY_PEN) From 281c0ce582a0bedaab5b87839e61f614e380e844 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 01:02:39 +0100 Subject: [PATCH 222/608] Reduced happiness mood effects. --- code/datums/mood_events/drug_events.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm index 89e93d3361..469bf80979 100644 --- a/code/datums/mood_events/drug_events.dm +++ b/code/datums/mood_events/drug_events.dm @@ -40,16 +40,16 @@ /datum/mood_event/happiness_drug description = "I can't feel anything and I never want this to end.\n" - mood_change = 50 + mood_change = 10 /datum/mood_event/happiness_drug_good_od description = "YES! YES!! YES!!!\n" - mood_change = 100 + mood_change = 20 timeout = 300 //special_screen_obj = "mood_happiness_good" Originally in tg, but I personally think they look dumb /datum/mood_event/happiness_drug_bad_od description = "NO! NO!! NO!!!\n" - mood_change = -100 + mood_change = -20 timeout = 300 - //special_screen_obj = "mood_happiness_bad" Originally in tg \ No newline at end of file + //special_screen_obj = "mood_happiness_bad" Originally in tg From b51a9e70e5abf584cf0e59627a4d9defc4775bf8 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 01:13:47 +0100 Subject: [PATCH 223/608] Fix for pHbooklet. --- modular_citadel/code/modules/reagents/objects/items.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 30b9c8d711..a629eb34bc 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -7,7 +7,6 @@ var/numberOfPages = 50 resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_TINY - //set flammable somehow //A little janky with pockets /obj/item/FermiChem/pHbooklet/attack_hand(mob/user) @@ -28,7 +27,7 @@ to_chat(user, "[src] is empty!") add_fingerprint(user) return - ..() + . = ..() var/I = user.get_active_held_item() if(!I) user.put_in_active_hand(src) @@ -39,12 +38,11 @@ desc = "A piece of paper that will change colour depending on the pH of a solution." icon_state = "pHpaper" icon = 'modular_citadel/icons/obj/FermiChem.dmi' - //item_flags = NOBLUDGEON + item_flags = NOBLUDGEON color = "#f5c352" var/used = FALSE resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_TINY - //set flammable somehow /obj/item/FermiChem/pHpaper/afterattack(obj/item/reagent_containers/cont, mob/user, proximity) if(!istype(cont)) From 8edecb64a666ff6f5848eb2875b3d2764bc490c1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 01:20:36 +0100 Subject: [PATCH 224/608] pHMeter fix --- .../code/modules/reagents/objects/items.dm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index a629eb34bc..a8ee276fb1 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -28,10 +28,11 @@ add_fingerprint(user) return . = ..() + if(. & COMPONENT_NO_INTERACT) + return var/I = user.get_active_held_item() if(!I) user.put_in_active_hand(src) - return /obj/item/FermiChem/pHpaper name = "pH indicator strip" @@ -50,7 +51,7 @@ if(used == TRUE) to_chat(user, "[user] has already been used!") return - if(LAZYLEN(cont.reagents.reagent_list) == null) + if(LAZYLEN(cont.reagents.reagent_list)) return switch(round(cont.reagents.pH, 1)) if(14 to INFINITY) @@ -94,9 +95,11 @@ resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_TINY -/obj/item/FermiChem/pHmeter/afterattack(obj/item/reagent_containers/cont, mob/user, proximity) - if(!istype(cont)) +/obj/item/FermiChem/pHmeter/afterattack(atom/A, mob/user, proximity) + . = ..() + if(!istype(A, obj/item/reagent_containers)) return + var/obj/item/reagent_containers/cont = A if(LAZYLEN(cont.reagents.reagent_list) == null) return to_chat(user, "The pH meter beeps and displays [round(cont.reagents.pH, 0.1)]") From a9aa913860233e8604dbdebf3bf47082d9184f60 Mon Sep 17 00:00:00 2001 From: Thalpy <33956696+Thalpy@users.noreply.github.com> Date: Thu, 13 Jun 2019 01:24:50 +0100 Subject: [PATCH 225/608] Added remove() for bloodpressure --- code/datums/traits/good.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index be46a8aa21..4d6eb9a86a 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -182,3 +182,7 @@ var/mob/living/M = quirk_holder M.blood_ratio = 1.2 M.blood_volume += 150 + +/datum/quirk/bloodpressure/remove() + var/mob/living/M = quirk_holder + M.blood_ratio = 1 From f3a3e4c47ae527bd576fcee254836e1c1d8bdfcb Mon Sep 17 00:00:00 2001 From: Thalpy <33956696+Thalpy@users.noreply.github.com> Date: Thu, 13 Jun 2019 01:31:28 +0100 Subject: [PATCH 226/608] Removed hypnotherapy quirk --- code/datums/traits/negative.dm | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 3a8b58d146..79afe0049c 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -324,28 +324,3 @@ gain_text = "There's a lot on your mind right now." lose_text = "Your mind finally feels calm." medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events." - -//For reviewers: If you think it's a bad idea, feel free to remove it. I won't be upset :blobcat: -/datum/quirk/hypno - name = "Hypnotherapy user" - desc = "You had hypnotherapy right before your shift, you're not sure it had any effects, though." - mob_trait = "hypnotherapy" - value = -1 //I mean, it can be a really bad trait to have, but on the other hand, some people want it? - gain_text = "You really think the hypnotherapy helped you out." - //lose_text = "You forget about the hypnotherapy you had, or did you even have it?" - -/datum/quirk/hypno/add() - //You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic! - addtimer(CALLBACK(src, /datum/quirk/hypno.proc/triggered, quirk_holder), rand(12000, 36000))//increase by 100, it's lower so I can test it. - -//DOES NOT give any indication when someone is triggered - this is intentional so people don't abuse it, you're supposed to get a random thing said to you as a mini objective. -/datum/quirk/hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. - var/mob/living/carbon/human/H = quirk_holder - var/list/seen = viewers(8, get_turf(H)) - seen -= quirk_holder - if(LAZYLEN(seen) == 0) - to_chat(H, "That object accidentally sets off your implanted trigger, sending you into a hypnotic daze!") - else - to_chat(H, "[pick(seen)] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") - H.apply_status_effect(/datum/status_effect/trance, 200, TRUE) - qdel(src) From fab603fabe59b806b298218aede1eae0e7d7d19d Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 01:44:48 +0100 Subject: [PATCH 227/608] Removed hypnotherapy quirk --- code/datums/traits/negative.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 3a8b58d146..a26e2149a2 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -325,7 +325,8 @@ lose_text = "Your mind finally feels calm." medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events." -//For reviewers: If you think it's a bad idea, feel free to remove it. I won't be upset :blobcat: +//For reviewers: If you think it's a bad idea, feel free to remove it. Removal requested, commented out until the end of review (will remove when fixing merge conflicts). +/* /datum/quirk/hypno name = "Hypnotherapy user" desc = "You had hypnotherapy right before your shift, you're not sure it had any effects, though." @@ -349,3 +350,4 @@ to_chat(H, "[pick(seen)] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") H.apply_status_effect(/datum/status_effect/trance, 200, TRUE) qdel(src) + */ From c8bcca5964877ee24a2ccd5db1326a24c9e01e9c Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 01:45:48 +0100 Subject: [PATCH 228/608] Staged hypnoflash removal. --- code/modules/uplink/uplink_items.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 05e9c68c7d..b6a936953e 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1580,11 +1580,14 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes cost = 2 //ported from tg as is along with functions, feel free to edit/remove +//Commented out, will remove when fixing merge conflicts +/* /datum/uplink_item/device_tools/hypnotic_flash name = "Hypnotic Flash" desc = "A modified flash able to hypnotize targets. If the target is not in a mentally vulnerable state, it will only confuse and pacify them temporarily." item = /obj/item/assembly/flash/hypnotic cost = 7 +*/ /datum/uplink_item/badass/balloon name = "Syndicate Balloon" From ad8c1593f6502db2ab71f8ecacfd242fbb072aa1 Mon Sep 17 00:00:00 2001 From: Thalpy <33956696+Thalpy@users.noreply.github.com> Date: Thu, 13 Jun 2019 01:47:29 +0100 Subject: [PATCH 229/608] Reduced medical jargon on scanners. --- code/game/objects/items/devices/scanners.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index c733b2086b..fdb4bc2e40 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -139,13 +139,13 @@ SLIME SCANNER to_chat(user, "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!") var/obj/item/organ/liver/L = M.getorganslot("liver") if(L.swelling > 20) - to_chat(user, "Subject is suffering from hyperhepatia.") //i.e. shrink their liver or give them a transplant. + to_chat(user, "Subject is suffering from an enlarged liver.") //i.e. shrink their liver or give them a transplant. var/obj/item/organ/tongue/T = M.getorganslot("tongue") if(!T || T.damage > 40) - to_chat(user, "Subject is suffering from caustic burns on their tongue./span>") //i.e. their tongue is shot + to_chat(user, "Subject is suffering from necrotic tissue on their tongue./span>") //i.e. their tongue is shot var/obj/item/organ/lungs/Lung = M.getorganslot("lungs") if(Lung.damage > 150) - to_chat(user, "Subject is suffering from an acute inhalation injury.") //i.e. Their lungs are shot + to_chat(user, "Subject is suffering from acute emphysema leading to trouble breathing.") //i.e. Their lungs are shot var/msg = "*---------*\nAnalyzing results for [M]:\n\tOverall status: [mob_status]\n" From 9effbb1e33e2e007cd2e44eb5384ae9218d8efd3 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 01:58:26 +0100 Subject: [PATCH 230/608] Removed increase/decrease blood var. --- code/datums/traits/negative.dm | 3 --- code/modules/mob/living/blood.dm | 1 - 2 files changed, 4 deletions(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index cc50bf2fff..a26e2149a2 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -324,7 +324,6 @@ gain_text = "There's a lot on your mind right now." lose_text = "Your mind finally feels calm." medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events." -<<<<<<< HEAD //For reviewers: If you think it's a bad idea, feel free to remove it. Removal requested, commented out until the end of review (will remove when fixing merge conflicts). /* @@ -352,5 +351,3 @@ H.apply_status_effect(/datum/status_effect/trance, 200, TRUE) qdel(src) */ -======= ->>>>>>> f3a3e4c47ae527bd576fcee254836e1c1d8bdfcb diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 77c0d4985f..5580057d8f 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -55,7 +55,6 @@ //Effects of bloodloss var/word = pick("dizzy","woozy","faint") - //switch(blood_volume) Used to be a switch statement; now it uses ifs (so blood ratio can work.) Check my logic please. switch(blood_volume * INVERSE(blood_ratio)) if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) if(prob(5)) From 70734b705a8e6d40471f6edb97398e2e8ddbc888 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 02:01:42 +0100 Subject: [PATCH 231/608] Forgot to commit to blood. --- code/modules/mob/living/blood.dm | 8 -------- 1 file changed, 8 deletions(-) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 5580057d8f..99b8b14ef6 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -318,14 +318,6 @@ if(!B) B = new(T) -//I think I had a plan, but it went out the window. -/mob/living/proc/IncreaseBloodVol(var/value) - blood_ratio += value - return - -/mob/living/proc/DecreaseBloodVol(var/value) - blood_ratio -= value - //This is a terrible way of handling it. /mob/living/proc/ResetBloodVol() if(ishuman(src)) From 099afc3c8eee6acf874cee2fc2b794e66d0f7ca8 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 02:21:37 +0100 Subject: [PATCH 232/608] Removed hypnoflash TC --- code/modules/uplink/uplink_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index b6a936953e..7c8c05bcff 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1579,7 +1579,7 @@ datum/uplink_item/stealthy_tools/taeclowndo_shoes item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate cost = 2 -//ported from tg as is along with functions, feel free to edit/remove +//ported from tg as is along with functions, removal requested. //Commented out, will remove when fixing merge conflicts /* /datum/uplink_item/device_tools/hypnotic_flash From 5e4ced1a60125153ec925738c4fa28d67afdf6f2 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 02:26:04 +0100 Subject: [PATCH 233/608] Sorta changes to say.dm --- code/modules/mob/living/carbon/say.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index c3f0750273..948a92daa3 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -3,11 +3,9 @@ message = trauma.on_say(message) message = ..(message) - var/obj/item/organ/vocal_cords/Vc = getorganslot(ORGAN_SLOT_VOICE) + /obj/item/organ/vocal_cords/velvet/Vc = getorganslot(ORGAN_SLOT_VOICE) if(Vc) - if(Vc.name == "velvet chords" ) - //..() - velvetspeech(message, src) + velvetspeech(message, src) var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) if(!T) //hoooooouaah! From 3368d3d98b457de0b6462fa165ec53080ec7e7eb Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 02:32:42 +0100 Subject: [PATCH 234/608] Fixed taste.dm --- code/modules/mob/living/taste.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index deb6884105..4d2eeb6c97 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -37,16 +37,16 @@ //TRAIT_AGEUSIA players can't taste, unless it's burning them. //10 sips of a strongly acidic substance will burn your tongue. /mob/living/carbon/taste(datum/reagents/from) - var/obj/item/organ/tongue/T = src.getorganslot("tongue") + var/obj/item/organ/tongue/T = getorganslot("tongue") if (!T) return - ..() + .=..() if ((from.pH > 12.5) || (from.pH < 1.5)) to_chat(src, "You taste chemical burns!") T.adjustTongueLoss(src, 4) if(istype(T, /obj/item/organ/tongue/cybernetic)) to_chat(src, "Your tongue moves on it's own in response to the liquid.") - src.say("The pH is appropriately [round(from.pH, 1)].") + say("The pH is appropriately [round(from.pH, 1)].") return if (!has_trait(TRAIT_AGEUSIA)) //I'll let you get away with not having 1 damage. switch(from.pH) From 981c1644c9ae91e6c6cea4ee229a2719e024b7c2 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 02:47:05 +0100 Subject: [PATCH 235/608] Holder changes; removed ferminew. --- code/modules/reagents/chemistry/holder.dm | 20 +++++++------------ .../chemistry/reagents/fermi_reagents.dm | 12 ++++------- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 49a04ca8ef..90bf1d61f0 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -127,7 +127,6 @@ update_total() handle_reactions() - //pH = REAGENT_NORMAL_PH //Maybe unnessicary? NO incredibly nessicary, blows the beaker up otherwise. YES 100% NOT REQUIRED, THIS IS FOR REAMOVING AN AMMOUNT, NOT ALL. return amount /datum/reagents/proc/get_master_reagent_name() @@ -848,7 +847,7 @@ //add the reagent to the existing if it exists for(var/A in cached_reagents) var/datum/reagent/R = A - if (R.id == reagent) + if (R.id == reagent) //IF MERGING //WIP_TAG //check my maths for purity calculations //Add amount and equalize purity R.volume += amount @@ -860,9 +859,9 @@ my_atom.on_reagent_change(ADD_REAGENT) R.on_merge(data, amount, my_atom, other_purity) if(istype(D, /datum/reagent/fermi))//Is this a fermichem? - var/datum/reagent/fermi/Ferm = D //It's Fermi time! - if(Ferm.OnMobMergeCheck == TRUE) //// Ooooooh fermifermifermi - R.on_mob_add(my_atom, amount) + var/datum/reagent/fermi/Ferm = D //It is a fermichem! + if(Ferm.OnMobMergeCheck == TRUE) //Does this fermichem split? + R.on_mob_add(my_atom, amount) //On mob add processes fermichems, splitting them into their impure and pure products. This allows them to split when merging fermichems in a mob. if(!no_react) handle_reactions() @@ -879,22 +878,17 @@ if(data) R.data = data R.on_new(data) - if(R.addProc == TRUE) + if(R.addProc == TRUE)//Allows on new without data overhead. R.on_new(pH) //Add more as desired. - if(istype(D, /datum/reagent/fermi))//Is this a fermichem? - var/datum/reagent/fermi/Ferm = D //It's Fermi time! - Ferm.FermiNew(my_atom) //Seriously what is "data" ???? - - //This is how I keep myself sane. + if(isliving(my_atom)) + R.on_mob_add(my_atom, amount) update_total() if(my_atom) my_atom.on_reagent_change(ADD_REAGENT) if(!no_react) handle_reactions() - if(isliving(my_atom)) - R.on_mob_add(my_atom, amount) return TRUE diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index a60c2f7549..8e3d29c69c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -12,21 +12,17 @@ var/OnMobMergeCheck = FALSE //var/addProc = FALSE //When this reagent is added to a new beaker, it does something. Implemented but unused. -//Called when added to a beaker without any of the reagent present. #add_reagent -/datum/reagent/fermi/proc/FermiNew(holder) - return - //This should process fermichems to find out how pure they are and what effect to do. //TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE /datum/reagent/fermi/on_mob_add(mob/living/carbon/M, amount) . = ..() if(!M) return - if(src.purity < 0) - CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") - if (src.purity == 1 || src.DoNotSplit == TRUE) + if(purity < 0) + CRASH("Purity below 0 for chem: [id], Please let Fermis Know!") + if (purity == 1 || DoNotSplit == TRUE) return - else if (src.InverseChemVal > src.purity)//Turns all of a added reagent into the inverse chem + else if (InverseChemVal > purity)//Turns all of a added reagent into the inverse chem M.reagents.remove_reagent(src.id, amount, FALSE) M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1) return From eab52a51e69b5529be56aa4083f4c191a751b0db Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 03:05:34 +0100 Subject: [PATCH 236/608] Fixed compile errors. --- code/datums/components/mood.dm | 2 +- code/modules/mob/living/carbon/say.dm | 2 +- code/modules/reagents/chemistry/reagents.dm | 8 ++++---- modular_citadel/code/datums/status_effects/chems.dm | 7 ++++--- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 6 +++--- modular_citadel/code/modules/reagents/objects/items.dm | 6 +++--- 6 files changed, 16 insertions(+), 15 deletions(-) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 11b3b19b65..68daf22791 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -179,7 +179,7 @@ amount = sanity - 0.5 // Disturbed stops you from getting any more sane - if(parent.has_trait(TRAIT_UNSTABLE)) + if(master.has_trait(TRAIT_UNSTABLE)) sanity = min(amount,sanity) else sanity = amount diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index 948a92daa3..f2866f6739 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -3,7 +3,7 @@ message = trauma.on_say(message) message = ..(message) - /obj/item/organ/vocal_cords/velvet/Vc = getorganslot(ORGAN_SLOT_VOICE) + var/obj/item/organ/vocal_cords/velvet/Vc = getorganslot(ORGAN_SLOT_VOICE) if(Vc) velvetspeech(message, src) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index d7fc347728..07da5ef6e6 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -34,10 +34,10 @@ var/overdosed = 0 // You fucked up and this is now triggering its overdose effects, purge that shit quick. var/self_consuming = FALSE //Fermichem vars: - var/purity = 1 - var/addProc = FALSE - var/loc = null //Should be the creation location! - var/pH = 7 + var/purity = 1 //How pure a chemical is from 0 - 1. + var/addProc = FALSE //If the chemical should force an on_new() call + var/turf/loc = null //Should be the creation location! + var/pH = 7 //pH of the specific reagent, used for calculating the sum pH of a holder. /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 36032edec4..cbf0c47d08 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -219,9 +219,10 @@ RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear) var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! mental_capacity = 500 - B.get_brain_damage() - if(M.ishuman)//Prefs - if(!M.canbearoused) - var/lewd = FALSE + var/mob/living/carbon/human/H = owner + if(H)//Prefs + if(!H.canbearoused) + H.lewd = FALSE var/message = "[(owner.lewd?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 8e3d29c69c..928456037f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1058,13 +1058,13 @@ Creating a chem with a low purity will make you permanently fall in love with so if(!creatorID) //This happens when the reaction explodes. return - var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) //Somehow a beaker got here? (what) + var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) if(E) - if(E.creatorID == M.ckey && creatorName != M.real_name)//If you're enthralled to yourself (from OD) and someone else tries to enthrall you, you become thralled to them instantly. + if(E.enthrallID == M.ckey && creatorName != M.real_name)//If you're enthralled to yourself (from OD) and someone else tries to enthrall you, you become thralled to them instantly. E.enthrallID = creatorID E.enthrallGender = creatorGender E.master = get_mob_by_key(creatorID) - to_chat(M, to_chat(M, "Your aldled, plastic, mind bends under the chemical influence of a new [(owner.lewd?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.")) //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE. + to_chat(M, to_chat(M, "Your aldled, plastic, mind bends under the chemical influence of a new [(M.lewd?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.")) //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE. return if(purity < 0.5)//Impure chems don't function as you expect return diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index a8ee276fb1..fb84db7d39 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -28,8 +28,8 @@ add_fingerprint(user) return . = ..() - if(. & COMPONENT_NO_INTERACT) - return + if(. & COMPONENT_NO_INTERACT) + return var/I = user.get_active_held_item() if(!I) user.put_in_active_hand(src) @@ -97,7 +97,7 @@ /obj/item/FermiChem/pHmeter/afterattack(atom/A, mob/user, proximity) . = ..() - if(!istype(A, obj/item/reagent_containers)) + if(!istype(A, /obj/item/reagent_containers)) return var/obj/item/reagent_containers/cont = A if(LAZYLEN(cont.reagents.reagent_list) == null) From b07f3b37ff4399eec3101e860bde6f6fb8c530fd Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 03:07:25 +0100 Subject: [PATCH 237/608] Saline edit --- .../modules/reagents/chemistry/reagents/medicine_reagents.dm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index cb21e353dd..a636a644ed 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -334,11 +334,6 @@ M.adjustBruteLoss(-0.5*REM, 0) M.adjustFireLoss(-0.5*REM, 0) . = TRUE - //Fermichem - if (M.reagents.pH < 5.5) - M.reagents.pH += 0.2 - else if (M.reagents.pH > 9.5) - M.reagents.pH -= 0.2 ..() /datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M) From 93973b630c101889a095ea1d0b4521d9de1fe5e3 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 03:08:01 +0100 Subject: [PATCH 238/608] Moonsugar edit. --- code/modules/reagents/chemistry/reagents/other_reagents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index c0255224f3..89846f760f 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1929,7 +1929,7 @@ /datum/reagent/moonsugar/on_mob_life(mob/living/carbon/M) if(prob(20)) to_chat(M, "You find yourself unable to supress the desire to meow!") - M.emote("nya") + M.emote("*nya") ..() //Kept for legacy, I think it will break everything if you enable it. From 91e58d896ee95683c1d974ab210e33f5b50aadbc Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 03:24:02 +0100 Subject: [PATCH 239/608] Spelling is hard. --- code/modules/reagents/reagent_containers.dm | 4 ++-- .../reagents/reagent_containers/bottle.dm | 2 +- .../reagents/reagent_containers/glass.dm | 18 +++++++++--------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 5a5a728a47..0bbad9d6c5 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -11,7 +11,7 @@ var/spawned_disease = null var/disease_amount = 20 var/spillable = FALSE - var/pH_immunne = TRUE//true for now, just so things that shouldn't melt don't. + var/pH_immune = TRUE//true for now, just so things that shouldn't melt don't. var/temp_immune = TRUE /obj/item/reagent_containers/Initialize(mapload, vol) @@ -152,7 +152,7 @@ //melts glass beakers /obj/item/reagent_containers/proc/pH_check() - if(pH_immunne == TRUE) + if(pH_immune == TRUE) return else if((reagents.pH < 0.5) || (reagents.pH > 13.5)) var/list/seen = viewers(5, get_turf(src)) diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index b0c759e005..d9ee228228 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -8,7 +8,7 @@ possible_transfer_amounts = list(5,10,15,25,30) volume = 30 temp_immune = TRUE //required so that things don't melt when you dispence them in the chem_master. - pH_immunne = TRUE + pH_immune = TRUE /obj/item/reagent_containers/glass/bottle/Initialize() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 2cb90e6cde..76bae38750 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -113,7 +113,7 @@ icon_state = "beaker" item_state = "beaker" materials = list(MAT_GLASS=500) - pH_immunne = FALSE + pH_immune = FALSE /obj/item/reagent_containers/glass/beaker/Initialize() . = ..() @@ -165,7 +165,7 @@ volume = 100 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100) - pH_immunne = FALSE + pH_immune = FALSE /obj/item/reagent_containers/glass/beaker/plastic name = "x-large beaker" @@ -176,7 +176,7 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,150) temp_immune = FALSE - pH_immunne = TRUE + pH_immune = TRUE /obj/item/reagent_containers/glass/beaker/plastic/update_icon() icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states @@ -192,7 +192,7 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,200) temp_immune = TRUE - pH_immunne = TRUE + pH_immune = TRUE /obj/item/reagent_containers/glass/beaker/noreact name = "cryostasis beaker" @@ -203,7 +203,7 @@ volume = 50 amount_per_transfer_from_this = 10 temp_immune = TRUE - pH_immunne = TRUE + pH_immune = TRUE /obj/item/reagent_containers/glass/beaker/noreact/Initialize() . = ..() @@ -219,7 +219,7 @@ volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300) - pH_immunne = FALSE + pH_immune = FALSE /obj/item/reagent_containers/glass/beaker/cryoxadone list_reagents = list("cryoxadone" = 30) @@ -276,7 +276,7 @@ SLOT_L_STORE, SLOT_R_STORE,\ SLOT_GENERC_DEXTROUS_STORAGE ) - pH_immunne = FALSE + pH_immune = FALSE /obj/item/reagent_containers/glass/bucket/attackby(obj/O, mob/user, params) if(istype(O, /obj/item/mop)) @@ -326,7 +326,7 @@ materials = list(MAT_GLASS=0) volume = 50 amount_per_transfer_from_this = 10 - pH_immunne = FALSE + pH_immune = FALSE temp_immune = FALSE /obj/item/reagent_containers/glass/beaker/waterbottle/empty @@ -339,7 +339,7 @@ list_reagents = list("water" = 100) volume = 100 amount_per_transfer_from_this = 20 - pH_immunne = FALSE + pH_immune = FALSE temp_immune = FALSE /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty From a6b211a4a30313c7f851e3418ac3c27af5bba0d2 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 03:25:16 +0100 Subject: [PATCH 240/608] Fixes for beakers. --- code/modules/reagents/reagent_containers.dm | 49 ++++++++++----------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 0bbad9d6c5..65ae4ce171 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -127,37 +127,34 @@ //melts plastic beakers /obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M) reagents.expose_temperature(1000) - if(temp_immune == TRUE) - return - var/list/seen = viewers(5, get_turf(src)) - var/iconhtml = icon2html(src, seen) - for(var/mob/H in seen) - to_chat(H, "[iconhtml] \The [src]'s melts from the temperature!") - playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) - qdel(src) + if(!temp_immune) + var/list/seen = viewers(5, get_turf(src)) + var/iconhtml = icon2html(src, seen) + for(var/mob/H in seen) + to_chat(H, "[iconhtml] \The [src]'s melts from the temperature!") + playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) + qdel(src) ..() //melts plastic beakers /obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) reagents.expose_temperature(exposed_temperature) - if(temp_immune == TRUE) - return - if(reagents.chem_temp > 444)//assuming polypropylene - var/list/seen = viewers(5, get_turf(src)) - var/iconhtml = icon2html(src, seen) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [src]'s melts from the temperature!") - playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) - qdel(src) + if(!temp_immune) + if(reagents.chem_temp > 444)//assuming polypropylene + var/list/seen = viewers(5, get_turf(src)) + var/iconhtml = icon2html(src, seen) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [src]'s melts from the temperature!") + playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) + qdel(src) //melts glass beakers /obj/item/reagent_containers/proc/pH_check() - if(pH_immune == TRUE) - return - else if((reagents.pH < 0.5) || (reagents.pH > 13.5)) - var/list/seen = viewers(5, get_turf(src)) - var/iconhtml = icon2html(src, seen) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [src]'s melts from the extreme pH!") - playsound(get_turf(src), 'sound/FermiChem/acidmelt.ogg', 80, 1) - qdel(src) + if(!pH_immune) + if((reagents.pH < 0.5) || (reagents.pH > 13.5)) + var/list/seen = viewers(5, get_turf(src)) + var/iconhtml = icon2html(src, seen) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [src]'s melts from the extreme pH!") + playsound(get_turf(src), 'sound/FermiChem/acidmelt.ogg', 80, 1) + qdel(src) From c3892db433163717f018f2edd7c6ba8c509a5626 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 03:34:33 +0100 Subject: [PATCH 241/608] Liver and lungs. --- code/modules/surgery/organs/liver.dm | 5 +++-- code/modules/surgery/organs/lungs.dm | 5 ++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index ada2c12b9a..d568d66d78 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -1,6 +1,7 @@ #define LIVER_DEFAULT_HEALTH 100 //amount of damage required for liver failure #define LIVER_DEFAULT_TOX_TOLERANCE 3 //amount of toxins the liver can filter out #define LIVER_DEFAULT_TOX_LETHALITY 0.01 //lower values lower how harmful toxins are to the liver +#define LIVER_SWELLING_MOVE_MODIFY "pharma" /obj/item/organ/liver name = "liver" @@ -57,7 +58,7 @@ //Just in case /obj/item/organ/liver/Remove(mob/living/carbon/M, special = 0) - M.remove_movespeed_modifier("pharma") + M.remove_movespeed_modifier(LIVER_SWELLING_MOVE_MODIFY) M.ResetBloodVol() //At the moment, this shouldn't allow application twice. You either have this OR a thirsty ferret. sizeMoveMod(1, M) @@ -69,7 +70,7 @@ if(prob(5)) to_chat(owner, "You feel a stange ache in your side, almost like a sitch. This pain is affecting your movements and making you feel lightheaded.") var/mob/living/carbon/human/H = owner - H.add_movespeed_modifier("pharma", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) + H.add_movespeed_modifier(LIVER_SWELLING_MOVE_MODIFY, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) H.AdjustBloodVol(moveCalc/3) sizeMoveMod(moveCalc, H) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index c13a7b249b..4e72693a68 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -62,8 +62,7 @@ //TODO: lung health affects lung function /obj/item/organ/lungs/proc/adjustLungLoss(damage_mod, mob/living/carbon/M) //damage might be too low atm. - message_admins("[M] lung damage: [damage_mod], damage: [damage]") - if (maxHealth == "plasma") + if (maxHealth == INFINITY) return if(damage+damage_mod < 0) damage = 0 @@ -446,7 +445,7 @@ safe_oxygen_max = 0 // Like, at all. safe_toxins_min = 16 //We breath THIS! safe_toxins_max = 0 - maxHealth = "plasma"//I don't understand how plamamen work, so I'm not going to try t give them special lungs atm + maxHealth = INFINITY//I don't understand how plamamen work, so I'm not going to try t give them special lungs atm /obj/item/organ/lungs/cybernetic name = "cybernetic lungs" From a3aa0408a3300dc4bca6b094389114c07d8414c4 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 03:37:15 +0100 Subject: [PATCH 242/608] Tongue --- code/modules/surgery/organs/tongue.dm | 7 +++---- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 8e366e54dd..99dec6c32c 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -1,4 +1,4 @@ -#define TONGUE_MAX_HEALTH 560 +#define TONGUE_MAX_HEALTH 60 /obj/item/organ/tongue name = "tongue" @@ -232,21 +232,20 @@ return ..() | SPAN_ROBOT //FermiChem -/obj/item/organ/tongue/OwO +/obj/item/organ/tongue/fluffy name = "fluffy tongue" desc = "OwO what's this?" icon_state = "tonguefluffy" taste_sensitivity = 10 // extra sensitive and inquisitive uwu maxHealth = 35 //Sensitive tongue! -/obj/item/organ/tongue/OwO/TongueSpeech(var/message) +/obj/item/organ/tongue/fluffy/TongueSpeech(var/message) if(copytext(message, 1, 2) != "*") message = replacetext(message, "ne", "nye") message = replacetext(message, "nu", "nyu") message = replacetext(message, "na", "nya") message = replacetext(message, "no", "nyo") message = replacetext(message, "ove", "uv") - //message = replacetext(message, "th", "ff") //too incoherent in practice message = replacetext(message, "l", "w") message = replacetext(message, "r", "w") if(prob(20)) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 928456037f..6c08ac1661 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1310,7 +1310,7 @@ Creating a chem with a low purity will make you permanently fall in love with so to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") if(16) T = M.getorganslot(ORGAN_SLOT_TONGUE) - var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO + var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/fluffy T.Remove(M) nT.Insert(M) T.moveToNullspace()//To the zelda room. From 026f29ba463313f5c43225f7d68974b25b795ee4 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 04:31:15 +0100 Subject: [PATCH 243/608] Comments and logs. --- code/modules/surgery/organs/vocal_cords.dm | 92 +------------------ .../code/datums/status_effects/chems.dm | 21 +++-- 2 files changed, 16 insertions(+), 97 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 7ba3d6e757..db94ff135a 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1225,102 +1225,12 @@ E.status = "charge" E.cooldown += 10 - - /* THE MAYBE PILE - //MOVE - else if((findtext(message, move_words))) - var/direction - if(findtext(message, up_words)) - direction = NORTH - else if(findtext(message, down_words)) - direction = SOUTH - else if(findtext(message, left_words)) - direction = WEST - else if(findtext(message, right_words)) - direction = EAST - for(var/iter in 1 to 5 * power_multiplier) - for(var/V in listeners) - var/mob/living/L = V - addtimer(CALLBACK(GLOBAL_PROC, .proc/_step, L, direction? direction : pick(GLOB.cardinals)), 10 * (iter - 1)) - - //HELP INTENT - else if((findtext(message, helpintent_words))) - cooldown = COOLDOWN_MEME - for(var/mob/living/carbon/human/H in listeners) - addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HELP), i * 2) - addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) - i++ - - //DISARM INTENT - else if((findtext(message, disarmintent_words))) - cooldown = COOLDOWN_MEME - for(var/mob/living/carbon/human/H in listeners) - addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_DISARM), i * 2) - addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) - i++ - - //GRAB INTENT - else if((findtext(message, grabintent_words))) - cooldown = COOLDOWN_MEME - for(var/mob/living/carbon/human/H in listeners) - addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_GRAB), i * 2) - addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2) - i++ - - //FLIP - else if((findtext(message, flip_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - L.emote("flip") - - //SPEAK (Check what this does) - else if((findtext(message, speak_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - addtimer(CALLBACK(L, /atom/movable/proc/say, pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage")), 5 * i) - i++ - - - //SIT - else if((findtext(message, sit_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - for(var/obj/structure/chair/chair in get_turf(L)) - chair.buckle_mob(L) - break - - //STAND UP - else if((findtext(message, stand_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - if(L.buckled && istype(L.buckled, /obj/structure/chair)) - L.buckled.unbuckle_mob(L) - - //DANCE - else if((findtext(message, dance_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - addtimer(CALLBACK(L, /mob/living/.proc/emote, "dance"), 5 * i) - i++ - - //PLAY DEAD - else if((findtext(message, deathgasp_words))) - cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i) - i++ - */ else return if(message_admins) message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") log_game("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") + investigate_log("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") //SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) If this is on, it fills the thing up and OOFs the server return diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index cbf0c47d08..fb8ffb7ba1 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -4,7 +4,7 @@ alert_type = null /datum/status_effect/chem/SGDF/on_apply() - message_admins("SGDF status appied") + investigate_log("SGDF status appied on [owner], ID: [owner.id]") var/typepath = owner.type fermi_Clone = new typepath(owner.loc) var/mob/living/carbon/M = owner @@ -20,6 +20,7 @@ if(owner.stat == DEAD) if((fermi_Clone && fermi_Clone.stat != DEAD) || (fermi_Clone == null)) if(owner.mind) + investigate_log("SGDF mind shift applied. [owner] is now playing as their clone and should not have memories after their clone split (look up SGDF status applied). ID: [owner.id]") owner.mind.transfer_to(fermi_Clone) to_chat(owner, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") to_chat(fermi_Clone, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") @@ -36,6 +37,7 @@ var/cachedmoveCalc = 1 /datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. + investigate_log("[owner]'s breasts has reached comical sizes. ID: [owner.id]") var/mob/living/carbon/human/o = owner var/items = o.get_contents() for(var/obj/item/W in items) @@ -44,7 +46,6 @@ playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") o.visible_message("[o]'s chest suddenly bursts forth, ripping their clothes off!'") - //message_admins("BElarge started!") else to_chat(o, "Your bountiful bosom is so rich with mass, you seriously doubt you'll be able to fit any clothes over it.") return ..() @@ -91,6 +92,7 @@ ..() /datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) + investigate_log("[owner]'s breasts has reduced to an acceptable size. ID: [owner.id]") owner.remove_movespeed_modifier("megamilk") sizeMoveMod(1) @@ -110,6 +112,7 @@ var/moveCalc /datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. + investigate_log("[owner]'s dick has reached comical sizes. ID: [owner.id]") var/mob/living/carbon/human/o = owner var/items = o.get_contents() if(o.w_uniform || o.wear_suit) @@ -152,6 +155,7 @@ ..() /datum/status_effect/chem/PElarger/on_remove(mob/living/carbon/human/o) + investigate_log("[owner]'s dick has reduced to an acceptable size. ID: [owner.id]") owner.remove_movespeed_modifier("hugedick") owner.ResetBloodVol() @@ -210,11 +214,12 @@ var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list if(!E) message_admins("WARNING: FermiChem: No master found in thrall, did you bus in the chem? You need to set up the vars manually if it's not reacted/bussed. Someone set up the reaction incorrectly if not (Don't use donor blood). Console them with a fermiplush maybe?") + remove(src) enthrallID = E.creatorID enthrallGender = E.creatorGender master = get_mob_by_key(enthrallID) //if(M.ckey == enthrallID) - // owner.remove_status_effect(src)//This shouldn't happen, but just in case, also it's not worth the overhead of giving someone themselves; they can't proc themselves as velvet removes them from the list. + // owner.remove_status_effect(src)//At the moment, a user can enthrall themselves, toggle this back in if that should be removed. redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear) var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! @@ -226,6 +231,7 @@ var/message = "[(owner.lewd?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") + investigate_log("MKULTRA: Status applied on [owner] ckey: [owner.id] with a master of [master] ckey: [enthrallID].") return ..() /datum/status_effect/chem/enthrall/tick() @@ -259,6 +265,7 @@ if(-1)//fully removed SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall") owner.remove_status_effect(src) + investigate_log("MKULTRA: Status REMOVED from [owner] ckey: [owner.id] with a master of [master] ckey: [enthrallID].") if(0)// sleeper agent if (cooldown > 0) cooldown -= 1 @@ -294,13 +301,13 @@ else to_chat(owner, "You are unable to put up a resistance any longer, and now are under the control of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [master] in death. ") owner.add_trait(TRAIT_PACIFISM, "MKUltra") //IMPORTANT + investigate_log("MKULTRA: Status on [owner] ckey: [owner.id] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].") else if (resistanceTally > 200) enthrallTally *= 0.5 phase -= 1 resistanceTally = 0 resistGrowth = 0 to_chat(owner, "You manage to shake some of the effects from your addled mind, however you can still feel yourself drawn towards [master].") - //owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment, if(prob(10)) if(owner.lewd) to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") @@ -533,6 +540,7 @@ var/cached_trigger = lowertext(trigger) if (findtext(raw_message, cached_trigger))//if trigger1 is the message cTriggered = TRUE + investigate_log("MKULTRA: [owner] ckey: [owner.id] has been triggered with [cached_trigger] from [speaker] saying: \"[message]\". (their master being [master] ckey: [enthrallID].)") //Speak (Forces player to talk) works if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2 @@ -541,6 +549,7 @@ saytext += " You find yourself fully believing in the validity of what you just said and don't think to question it." to_chat(C, "[saytext]") (C.say(customTriggers[trigger][2]))//trigger3 + investigate_log("MKULTRA: [owner] ckey: [owner.id] has been forced to say: \"[customTriggers[trigger][2]]\" from previous trigger.") //Echo (repeats message!) works @@ -586,6 +595,7 @@ var/mob/living/carbon/human/o = owner o.apply_status_effect(/datum/status_effect/trance, 200, TRUE) tranceTime = 50 + investigate_log("MKULTRA: [owner] ckey: [owner.id] has been tranced from previous trigger.") cTriggered = FALSE @@ -594,7 +604,6 @@ /datum/status_effect/chem/enthrall/proc/owner_resist() var/mob/living/carbon/M = owner to_chat(owner, "You attempt to fight against against [(owner.lewd?"[enthrallGender]":"[master]")]'s influence!'") - message_admins("Enthrall processing for [M]: enthrallTally: [enthrallTally], resistanceTally: [resistanceTally]") //Able to resist checks if (status == "Sleeper" || phase == 0) @@ -628,7 +637,7 @@ deltaResist += 0.1 //Though I commend your spamming efforts. return else - deltaResist = 1.7 + resistGrowth + deltaResist = 1.8 + resistGrowth resistGrowth += 0.05 //distance modifer From 097c338ded84fe01bcad1a37ddf90478d55ea2ef Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 04:32:52 +0100 Subject: [PATCH 244/608] PE replaced with... You know what. --- .../code/datums/status_effects/chems.dm | 8 ++++---- .../code/modules/arousal/organs/penis.dm | 20 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index fb8ffb7ba1..7f5c24b56f 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -105,13 +105,13 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/status_effect/chem/PElarger +/datum/status_effect/chem/penis_enlarger id = "PElarger" alert_type = null var/bloodCalc var/moveCalc -/datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. +/datum/status_effect/chem/penis_enlarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. investigate_log("[owner]'s dick has reached comical sizes. ID: [owner.id]") var/mob/living/carbon/human/o = owner var/items = o.get_contents() @@ -127,7 +127,7 @@ return ..() -/datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) +/datum/status_effect/chem/penis_enlarger/tick(mob/living/carbon/M) var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/penis/P = o.getorganslot("penis") moveCalc = 1+((round(P.length) - 21)/3) //effects how fast you can move @@ -154,7 +154,7 @@ o.AdjustBloodVol(bloodCalc) ..() -/datum/status_effect/chem/PElarger/on_remove(mob/living/carbon/human/o) +/datum/status_effect/chem/penis_enlarger/on_remove(mob/living/carbon/human/o) investigate_log("[owner]'s dick has reduced to an acceptable size. ID: [owner.id]") owner.remove_movespeed_modifier("hugedick") owner.ResetBloodVol() diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index a01e83fe8d..bf2923d643 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -36,28 +36,28 @@ if(0 to 4) //If modest size length = cached_length size = 1 - if(owner.has_status_effect(/datum/status_effect/chem/PElarger)) - o.remove_status_effect(/datum/status_effect/chem/PElarger) + if(owner.has_status_effect(/datum/status_effect/chem/penis_enlarger)) + o.remove_status_effect(/datum/status_effect/chem/penis_enlarger) if(5 to 10) //If modest size length = cached_length size = 2 - if(owner.has_status_effect(/datum/status_effect/chem/PElarger)) - o.remove_status_effect(/datum/status_effect/chem/PElarger) + if(owner.has_status_effect(/datum/status_effect/chem/penis_enlarger)) + o.remove_status_effect(/datum/status_effect/chem/penis_enlarger) if(11 to 20) //If massive length = cached_length size = 3 - if(owner.has_status_effect(/datum/status_effect/chem/PElarger)) - o.remove_status_effect(/datum/status_effect/chem/PElarger) + if(owner.has_status_effect(/datum/status_effect/chem/penis_enlarger)) + o.remove_status_effect(/datum/status_effect/chem/penis_enlarger) if(21 to 35) //If massive and due for large effects length = cached_length size = 3 - if(!owner.has_status_effect(/datum/status_effect/chem/PElarger)) - o.apply_status_effect(/datum/status_effect/chem/PElarger) + if(!owner.has_status_effect(/datum/status_effect/chem/penis_enlarger)) + o.apply_status_effect(/datum/status_effect/chem/penis_enlarger) if(36 to INFINITY) //If comical length = cached_length size = 4 //no new sprites for anything larger yet - if(!owner.has_status_effect(/datum/status_effect/chem/PElarger)) - o.apply_status_effect(/datum/status_effect/chem/PElarger) + if(!owner.has_status_effect(/datum/status_effect/chem/penis_enlarger)) + o.apply_status_effect(/datum/status_effect/chem/penis_enlarger) if (round(length) > round(prev_length)) to_chat(o, "Your [pick(GLOB.gentlemans_organ_names)] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.") From 452ff2ff5329dd9d1bef6fa801a71599846a4f4d Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 04:34:24 +0100 Subject: [PATCH 245/608] Description change on Pharmacokinesis --- modular_citadel/code/datums/traits/neutral.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/datums/traits/neutral.dm b/modular_citadel/code/datums/traits/neutral.dm index eb48a58c7f..197c9b94e1 100644 --- a/modular_citadel/code/datums/traits/neutral.dm +++ b/modular_citadel/code/datums/traits/neutral.dm @@ -34,7 +34,7 @@ /datum/quirk/pharmacokinesis //Prevents unwanted organ additions. name = "Acute hepatic pharmacokinesis" - desc = "You've a rare genetic disorder that causes certain chemicals to be absorbed by your liver instead." + desc = "You've a rare genetic disorder that causes Incubus draft and Sucubus milk to be absorbed by your liver instead." value = 0 mob_trait = TRAIT_PHARMA lose_text = "Your liver feels different." From 14aa7084a806e5241b156972935ed4c4fe8850dd Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 04:37:03 +0100 Subject: [PATCH 246/608] Breast rename. --- .../reagents/reagent_containers/pill.dm | 4 ++-- .../code/datums/status_effects/chems.dm | 14 ++++++------- .../code/modules/arousal/organs/breasts.dm | 12 +++++------ .../chemistry/reagents/fermi_reagents.dm | 20 +++++++++---------- .../reagents/chemistry/recipes/fermi.dm | 20 +++++++++---------- 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 211a9f3047..c3c98e0bd7 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -249,8 +249,8 @@ /obj/item/reagent_containers/pill/penis_enlargement name = "penis enlargement pill" - list_reagents = list("PElarger" = 10) + list_reagents = list("penis_enlarger" = 10) /obj/item/reagent_containers/pill/breast_enlargement name = "breast enlargement pill" - list_reagents = list("BElarger" = 10) + list_reagents = list("breast_enlarger" = 10) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 7f5c24b56f..4d1d8f70f0 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -30,13 +30,13 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/status_effect/chem/BElarger - id = "BElarger" +/datum/status_effect/chem/breast_enlarger + id = "breast_enlarger" alert_type = null var/moveCalc = 1 var/cachedmoveCalc = 1 -/datum/status_effect/chem/BElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. +/datum/status_effect/chem/breast_enlarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. investigate_log("[owner]'s breasts has reached comical sizes. ID: [owner.id]") var/mob/living/carbon/human/o = owner var/items = o.get_contents() @@ -50,7 +50,7 @@ to_chat(o, "Your bountiful bosom is so rich with mass, you seriously doubt you'll be able to fit any clothes over it.") return ..() -/datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge +/datum/status_effect/chem/breast_enlarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") moveCalc = 1+((round(B.cached_size) - 9)/3) //Afffects how fast you move, and how often you can click. @@ -91,12 +91,12 @@ to_chat(owner, "Your back is feeling a little sore.") ..() -/datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) +/datum/status_effect/chem/breast_enlarger/on_remove(mob/living/carbon/M) investigate_log("[owner]'s breasts has reduced to an acceptable size. ID: [owner.id]") owner.remove_movespeed_modifier("megamilk") sizeMoveMod(1) -/datum/status_effect/chem/BElarger/proc/sizeMoveMod(var/value) +/datum/status_effect/chem/breast_enlarger/proc/sizeMoveMod(var/value) if(cachedmoveCalc == value) return owner.next_move_modifier /= cachedmoveCalc @@ -106,7 +106,7 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /datum/status_effect/chem/penis_enlarger - id = "PElarger" + id = "penis_enlarger" alert_type = null var/bloodCalc var/moveCalc diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index ea2fe492f3..5b4b2302c9 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -91,18 +91,18 @@ switch(round(cached_size)) if(0) //If flatchested size = "flat" - if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) - owner.remove_status_effect(/datum/status_effect/chem/BElarger) + if(owner.has_status_effect(/datum/status_effect/chem/breast_enlarger)) + owner.remove_status_effect(/datum/status_effect/chem/breast_enlarger) statuscheck = FALSE if(1 to 8) //If modest size size = GLOB.breasts_size_list[round(cached_size)] - if(owner.has_status_effect(/datum/status_effect/chem/BElarger)) - owner.remove_status_effect(/datum/status_effect/chem/BElarger) + if(owner.has_status_effect(/datum/status_effect/chem/breast_enlarger)) + owner.remove_status_effect(/datum/status_effect/chem/breast_enlarger) statuscheck = FALSE if(9 to 15) //If massive size = GLOB.breasts_size_list[round(cached_size)] - if(!owner.has_status_effect(/datum/status_effect/chem/BElarger)) - owner.apply_status_effect(/datum/status_effect/chem/BElarger) + if(!owner.has_status_effect(/datum/status_effect/chem/breast_enlarger)) + owner.apply_status_effect(/datum/status_effect/chem/breast_enlarger) statuscheck = TRUE if(16 to INFINITY) //if Rediculous size = cached_size diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 6c08ac1661..2fbbb452de 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -501,9 +501,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Overdosing on (what is essentially space estrogen) makes you female, removes balls and shrinks your dick. //OD is low for a reason. I'd like fermichems to have low ODs, and dangerous ODs, and since this is a meme chem that everyone will rush to make, it'll be a lesson learnt early. -/datum/reagent/fermi/BElarger +/datum/reagent/fermi/breast_enlarger name = "Sucubus milk" - id = "BElarger" + id = "breast_enlarger" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." color = "#E60584" // rgb: 96, 0, 255 taste_description = "a milky ice cream like flavour." @@ -513,7 +513,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING InverseChemVal = 0.3 InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse -/datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M) +/datum/reagent/fermi/breast_enlarger/on_mob_add(mob/living/carbon/M) . = ..() if(!ishuman(M)) //The monkey clause if(volume >= 15) //To prevent monkey breast farms @@ -541,7 +541,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING B.prev_size = B.size B.cached_size = sizeConv[B.size] -/datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size +/datum/reagent/fermi/breast_enlarger/on_mob_life(mob/living/carbon/M) //Increases breast size if(!ishuman(M))//Just in case return..() @@ -582,7 +582,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING B.update() ..() -/datum/reagent/fermi/BElarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. +/datum/reagent/fermi/breast_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. //Acute hepatic pharmacokinesis. if(M.has_trait(TRAIT_PHARMA)) @@ -644,9 +644,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //See breast explanation, it's the same but with taliwhackers //instead of slower movement and attacks, it slows you and increases the total blood you need in your system. //Since someone else made this in the time it took me to PR it, I merged them. -/datum/reagent/fermi/PElarger // Due to popular demand...! +/datum/reagent/fermi/penis_enlarger // Due to popular demand...! name = "Incubus draft" - id = "PElarger" + id = "penis_enlarger" description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? dumb color = "#888888" // This is greyish..? taste_description = "chinese dragon powder" @@ -656,7 +656,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING InverseChemVal = 0.3 InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse and shrinks instead. -/datum/reagent/fermi/PElarger/on_mob_add(mob/living/carbon/M) +/datum/reagent/fermi/penis_enlarger/on_mob_add(mob/living/carbon/M) . = ..() if(!ishuman(M)) //Just monkeying around. if(volume >= 15) //to prevent monkey penis farms @@ -681,7 +681,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING P.prev_length = P.length P.cached_length = P.length -/datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch. +/datum/reagent/fermi/penis_enlarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch. if(!ishuman(M)) return var/mob/living/carbon/human/H = M @@ -715,7 +715,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING P.update() ..() -/datum/reagent/fermi/PElarger/overdose_process(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. +/datum/reagent/fermi/penis_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. //Acute hepatic pharmacokinesis. if(M.has_trait(TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 74a54bb87f..3950eb2623 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -131,10 +131,10 @@ for(var/mob/M in seen) to_chat(M, "The cells clump up into a horrifying tumour!") -/datum/chemical_reaction/fermi/BElarger +/datum/chemical_reaction/fermi/breast_enlarger name = "Sucubus milk" - id = "BElarger" - results = list("BElarger" = 0.6) + id = "breast_enlarger" + results = list("breast_enlarger" = 0.6) required_reagents = list("salglu_solution" = 0.1, "milk" = 0.5, "synthflesh" = 0.2, "silicon" = 0.2, "aphro" = 0.2) mix_message = "the reaction gives off a mist of milk." //FermiChem vars: @@ -154,19 +154,19 @@ FermiExplode = TRUE PurityMin = 0.1 -/datum/chemical_reaction/fermi/BElarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) +/datum/chemical_reaction/fermi/breast_enlarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) var/obj/item/organ/genital/breasts/B = new /obj/item/organ/genital/breasts(get_turf(my_atom)) var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a pair of breasts!")//OwO - var/datum/reagent/fermi/BElarger/BE = locate(/datum/reagent/fermi/BElarger) in my_atom.reagents.reagent_list + var/datum/reagent/fermi/breast_enlarger/BE = locate(/datum/reagent/fermi/breast_enlarger) in my_atom.reagents.reagent_list B.size = ((BE.volume * BE.purity) / 10) //half as effective. my_atom.reagents.clear_reagents() -/datum/chemical_reaction/fermi/PElarger +/datum/chemical_reaction/fermi/penis_enlarger name = "Incubus draft" - id = "PElarger" - results = list("PElarger" = 0.3) + id = "penis_enlarger" + results = list("penis_enlarger" = 0.3) required_reagents = list("blood" = 0.5, "synthflesh" = 0.2, "carbon" = 0.2, "aphro" = 0.2, "salglu_solution" = 0.1,) mix_message = "the reaction gives off a spicy mist." //FermiChem vars: @@ -186,12 +186,12 @@ FermiExplode = TRUE PurityMin = 0.1 -/datum/chemical_reaction/fermi/PElarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) +/datum/chemical_reaction/fermi/penis_enlarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) var/obj/item/organ/genital/penis/P = new /obj/item/organ/genital/penis(get_turf(my_atom)) var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a penis!")//OwO - var/datum/reagent/fermi/PElarger/PE = locate(/datum/reagent/fermi/PElarger) in my_atom.reagents.reagent_list + var/datum/reagent/fermi/penis_enlarger/PE = locate(/datum/reagent/fermi/penis_enlarger) in my_atom.reagents.reagent_list P.length = ((PE.volume * PE.purity) / 10)//half as effective. my_atom.reagents.clear_reagents() From da6f1da6245605397d2da93cea03b579a1db2978 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 04:53:33 +0100 Subject: [PATCH 247/608] The great src cull --- .../code/datums/status_effects/chems.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 127 +++++++++--------- 2 files changed, 63 insertions(+), 66 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 4d1d8f70f0..0cea91a500 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -214,7 +214,7 @@ var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list if(!E) message_admins("WARNING: FermiChem: No master found in thrall, did you bus in the chem? You need to set up the vars manually if it's not reacted/bussed. Someone set up the reaction incorrectly if not (Don't use donor blood). Console them with a fermiplush maybe?") - remove(src) + owner.remove_status_effect(src) enthrallID = E.creatorID enthrallGender = E.creatorGender master = get_mob_by_key(enthrallID) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 2fbbb452de..11a36ee5f1 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -2,8 +2,8 @@ //Fun chems for all the family /datum/reagent/fermi - name = "Fermi" //Why did I putthis here? - id = "fermi" //It's meeee + name = "Fermi" //This should never exist, but it does so that it can exist in the case of errors.. + id = "fermi" taste_description = "affection and love!" var/ImpureChem = "fermiTox" // What chemical is metabolised with an inpure reaction var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising @@ -23,14 +23,14 @@ if (purity == 1 || DoNotSplit == TRUE) return else if (InverseChemVal > purity)//Turns all of a added reagent into the inverse chem - M.reagents.remove_reagent(src.id, amount, FALSE) - M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1) + M.reagents.remove_reagent(id, amount, FALSE) + M.reagents.add_reagent(InverseChem, amount, FALSE, other_purity = 1) return else //var/pureVol = amount * puritys var/impureVol = amount * (1 - purity) //turns impure ratio into impure chem - M.reagents.remove_reagent(src.id, (impureVol), FALSE) - M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) + M.reagents.remove_reagent(id, (impureVol), FALSE) + M.reagents.add_reagent(ImpureChem, impureVol, FALSE, other_purity = 1) return //When merging two fermichems, see above @@ -39,23 +39,23 @@ if(!ishuman(M)) return if (purity < 0) - CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") - if (purity == 1 || src.DoNotSplit == TRUE) + CRASH("Purity below 0 for chem: [id], Please let Fermis Know!") + if (purity == 1 || DoNotSplit == TRUE) return - else if (src.InverseChemVal > purity) - M.reagents.remove_reagent(src.id, amount, FALSE) - M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1) + else if (InverseChemVal > purity) + M.reagents.remove_reagent(id, amount, FALSE) + M.reagents.add_reagent(InverseChem, amount, FALSE, other_purity = 1) for(var/datum/reagent/fermi/R in M.reagents.reagent_list) if(R.name == "") - R.name = src.name//Negative effects are hidden + R.name = name//Negative effects are hidden return else var/impureVol = amount * (1 - purity) - M.reagents.remove_reagent(src.id, impureVol, FALSE) - M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) + M.reagents.remove_reagent(id, impureVol, FALSE) + M.reagents.add_reagent(ImpureChem, impureVol, FALSE, other_purity = 1) for(var/datum/reagent/fermi/R in M.reagents.reagent_list) if(R.name == "") - R.name = src.name//Negative effects are hidden + R.name = name//Negative effects are hidden return @@ -83,7 +83,6 @@ addiction_stage3_end = 41 addiction_stage4_end = 44 //Incase it's too long var/location_created - //var/turf/open/location_created var/turf/open/location_return = null var/addictCyc1 = 0 var/addictCyc2 = 0 @@ -91,7 +90,6 @@ var/addictCyc4 = 0 var/mob/living/fermi_Tclone = null var/teleBool = FALSE - mob/living/carbon/purgeBody pH = 3.7 //Main functions @@ -125,21 +123,21 @@ do_sparks(5,FALSE,src) do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) - M.reagents.remove_reagent(src.id, 0.5)//So you're not stuck for 10 minutes teleporting + M.reagents.remove_reagent(id, 0.5)//So you're not stuck for 10 minutes teleporting ..() //Addiction /datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride. - switch(src.addictCyc1) + switch(addictCyc1) if(1) to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") M.Jitter(10) M.nutrition = M.nutrition - (M.nutrition/15) - src.addictCyc1++ + addictCyc1++ ..() /datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M) - switch(src.addictCyc2) + switch(addictCyc2) if(0) to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") M.Jitter(50) @@ -154,13 +152,13 @@ do_sparks(5,FALSE,I) do_teleport(I, get_turf(I), 5, no_effects=TRUE); do_sparks(5,FALSE,I) - src.addictCyc2++ + addictCyc2++ ..() /datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in - switch(src.addictCyc3) + switch(addictCyc3) if(0) M.Jitter(100) to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the eigenstate event horizon.") @@ -182,34 +180,33 @@ do_sparks(5,FALSE,C) qdel(C) //Deletes CLONE, or at least I hope it is. M.visible_message("[M] is snapped across to a different alternative reality!") - src.addictCyc3 = 0 //counter + addictCyc3 = 0 //counter fermi_Tclone = null - src.addictCyc3++ + addictCyc3++ do_teleport(M, get_turf(M), 2, no_effects=TRUE) //Teleports player randomly do_sparks(5,FALSE,M) ..() /datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. - switch(src.addictCyc4) - if(0) - do_sparks(5,FALSE,M) - do_teleport(M, get_turf(M), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! - do_sparks(5,FALSE,M) - M.Sleeping(50, 0) - M.Jitter(50) - M.Knockdown(0) - to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") - M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) - M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) - for(var/datum/mood_event/Me in M) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, Me) //Why does this not work? - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) + if(addictCyc4 == 0) + do_sparks(5,FALSE,M) + do_teleport(M, get_turf(M), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! + do_sparks(5,FALSE,M) + M.Sleeping(50, 0) + M.Jitter(50) + M.Knockdown(0) + to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") + M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) + M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) + for(var/datum/mood_event/Me in M) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, Me) //Why does this not work? + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) if(prob(20)) do_sparks(5,FALSE,M) - src.addictCyc4++ - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[src.id]_overdose")//holdover until above fix works + addictCyc4++ + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[id]_overdose")//holdover until above fix works ..() //eigenstate END @@ -283,7 +280,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING pollStarted = TRUE candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") if(20 to INFINITY) - if(LAZYLEN(candies) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! + if(LAZYLEN(candies) && playerClone == FALSE) //If there's candidates, clone the person and put them in there! message_admins("Ghost candidate found! [candies] is becoming a clone of [M]! Hee~!! Exciting!!") to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") var/typepath = M.type @@ -321,11 +318,11 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Transfer remaining reagent to clone. I think around 30u will make a healthy clone, otherwise they'll have clone damage, blood loss, brain damage and hunger. SM.reagents.add_reagent("SDGFheal", volume) - M.reagents.remove_reagent(src.id, src.volume) + M.reagents.remove_reagent(id, volume) return - else if(src.playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). - src.unitCheck = TRUE + else if(playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). + unitCheck = TRUE if(M.has_status_effect(/datum/status_effect/chem/SGDF)) // Heal the user if they went to all this trouble to make it and can't get a clone, the poor fellow. switch(current_cycle) if(21) @@ -336,7 +333,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.adjustBruteLoss(-1, 0) M.adjustFireLoss(-1, 0) M.heal_bodypart_damage(1,1) - M.reagents.remove_reagent(src.id, 1)//faster rate of loss. + M.reagents.remove_reagent(id, 1)//faster rate of loss. else //If there's no ghosts, but they've made a large amount, then proceed to make flavourful clone, where you become fat and useless until you split. switch(current_cycle) if(21) @@ -363,7 +360,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) if(87 to INFINITY) - M.reagents.remove_reagent(src.id, src.volume)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. + M.reagents.remove_reagent(id, volume)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. ..() @@ -383,8 +380,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.next_move_modifier = 1 if (M.nutrition < 1500) M.nutrition += 250 - else if (src.unitCheck == TRUE && !M.has_status_effect(/datum/status_effect/chem/SGDF))// If they're ingested a little bit (10u minimum), then give them a little healing. - src.unitCheck = FALSE + else if (unitCheck == TRUE && !M.has_status_effect(/datum/status_effect/chem/SGDF))// If they're ingested a little bit (10u minimum), then give them a little healing. + unitCheck = FALSE to_chat(M, "the cells fail to hold enough mass to generate a clone, instead diffusing into your system.") M.adjustBruteLoss(-10, 0) M.adjustFireLoss(-10, 0) @@ -465,7 +462,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ZI.name = M.real_name ZI.desc = "[M]'s clone, gone horribly wrong." - M.reagents.remove_reagent(src.id, 20) + M.reagents.remove_reagent(id, 20) else//easier to deal with to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour!") M.nutrition = startHunger - 500 @@ -475,7 +472,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING S.real_name = "Living teratoma"//horrifying!! S.rabid = 1//Make them an angery boi //S.updateappearance(mutcolor_update=1) - M.reagents.remove_reagent(src.id, src.volume) + M.reagents.remove_reagent(id, volume) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. TODO: turn tumour slime into real variant. M.adjustToxLoss(1, 0) @@ -528,7 +525,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.Knockdown(50) M.Stun(50) B.throw_at(T2, 8, 1) - M.reagents.remove_reagent(src.id, src.volume) + M.reagents.remove_reagent(id, volume) return var/mob/living/carbon/human/H = M H.genital_override = TRUE @@ -569,7 +566,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING nB.cached_size = 0 nB.prev_size = 0 to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") - M.reagents.remove_reagent(src.id, 5) + M.reagents.remove_reagent(id, 5) B = nB //If they have them, increase size. If size is comically big, limit movement and rip clothes. B.cached_size = B.cached_size + 0.1 @@ -670,7 +667,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.Knockdown(50) M.Stun(50) P.throw_at(T2, 8, 1) - M.reagents.remove_reagent(src.id, src.volume) + M.reagents.remove_reagent(id, volume) return var/mob/living/carbon/human/H = M H.genital_override = TRUE @@ -702,7 +699,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.") nP.cached_length = 1 nP.prev_length = 1 - M.reagents.remove_reagent(src.id, 5) + M.reagents.remove_reagent(id, 5) P = nP P.cached_length = P.cached_length + 0.1 @@ -821,7 +818,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die if(prob(50)) to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") do_teleport(G, M.loc) - M.reagents.remove_reagent(src.id, current_cycle/2, FALSE) + M.reagents.remove_reagent(id, current_cycle/2, FALSE) ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) @@ -1095,7 +1092,7 @@ Creating a chem with a low purity will make you permanently fall in love with so seen = seen - victim if(!seen) return - M.reagents.remove_reagent(src.id, src.volume) + M.reagents.remove_reagent(id, volume) FallInLove(M, pick(seen)) return else // If someone else drinks it, the creator falls in love with them! @@ -1103,7 +1100,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(M.has_status_effect(STATUS_EFFECT_INLOVE)) return if((C in viewers(7, get_turf(M))) && (C.client)) - M.reagents.remove_reagent(src.id, src.volume) + M.reagents.remove_reagent(id, volume) FallInLove(C, M) return if(volume < 1)//You don't get to escape that easily @@ -1454,7 +1451,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(LAZYLEN(holder.reagent_list) == 1) return else - holder.remove_reagent("fermiTest", src.volume)//Avoiding recurrsion + holder.remove_reagent("fermiTest", volume)//Avoiding recurrsion var/location = get_turf(holder.my_atom) if(purity < 0.34 || purity == 1) var/datum/effect_system/foam_spread/s = new() @@ -1502,15 +1499,15 @@ Creating a chem with a low purity will make you permanently fall in love with so //Consumes self on addition and shifts pH /datum/reagent/fermi/fermiABuffer/on_new(datapH) - src.data = datapH + data = datapH if(LAZYLEN(holder.reagent_list) == 1) return - holder.pH = ((holder.pH * holder.total_volume)+(pH * (src.volume*3)))/(holder.total_volume + (src.volume*3)) //Shouldn't be required + holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume*3)))/(holder.total_volume + (volume*3)) //Shouldn't be required var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The beaker fizzes as the pH changes!") playsound(get_turf(holder), 'sound/FermiChem/bufferadd.ogg', 50, 1) - holder.remove_reagent(src.id, src.volume) + holder.remove_reagent(id, volume) ..() /datum/reagent/fermi/fermiBBuffer @@ -1522,15 +1519,15 @@ Creating a chem with a low purity will make you permanently fall in love with so pH = 11 /datum/reagent/fermi/fermiBBuffer/on_new(datapH) - src.data = datapH + data = datapH if(LAZYLEN(holder.reagent_list) == 1) return - holder.pH = ((holder.pH * holder.total_volume)+(pH * (src.volume*3)))/(holder.total_volume + (src.volume*3)) //Shouldn't be required Might be..? + holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume*3)))/(holder.total_volume + (volume*3)) //Shouldn't be required Might be..? var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The beaker froths as the pH changes!") playsound(get_turf(holder.my_atom), 'sound/FermiChem/bufferadd.ogg', 50, 1) - holder.remove_reagent(src.id, src.volume) + holder.remove_reagent(id, volume) ..() //ReagentVars From 378af882d3dfd4cd30224968976ac5c2dc2a1d76 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 05:51:28 +0100 Subject: [PATCH 248/608] Ramping up to logging and a few more fixes. --- code/__DEFINES/logging.dm | 1 + code/modules/mob/living/taste.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 2 +- .../code/datums/status_effects/chems.dm | 28 ++++----- .../chemistry/reagents/fermi_reagents.dm | 52 +++++++---------- .../reagents/chemistry/recipes/fermi.dm | 58 +++++++++---------- 6 files changed, 66 insertions(+), 77 deletions(-) diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 55131a26ed..8d7eae8468 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -16,6 +16,7 @@ #define INVESTIGATE_EXONET "exonet" #define INVESTIGATE_NANITES "nanites" #define INVESTIGATE_CIRCUIT "circuit" +#define INVESTIGATE_FERMICHEM "fermichem" // Logging types for log_message() #define LOG_ATTACK (1 << 0) diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index 4d2eeb6c97..5363b1a14e 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -35,7 +35,7 @@ //FermiChem - How to check pH of a beaker without a meter/pH paper. //Basically checks the pH of the holder and burns your poor tongue if it's too acidic! //TRAIT_AGEUSIA players can't taste, unless it's burning them. -//10 sips of a strongly acidic substance will burn your tongue. +//taking sips of a strongly acidic/alkaline substance will burn your tongue. /mob/living/carbon/taste(datum/reagents/from) var/obj/item/organ/tongue/T = getorganslot("tongue") if (!T) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index db94ff135a..e8b6b12ede 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1230,7 +1230,7 @@ if(message_admins) message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") log_game("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") - investigate_log("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") + investigate_log("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].", INVESTIGATE_FERMICHEM) //SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) If this is on, it fills the thing up and OOFs the server return diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 0cea91a500..3c1cd72ff2 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -4,7 +4,7 @@ alert_type = null /datum/status_effect/chem/SGDF/on_apply() - investigate_log("SGDF status appied on [owner], ID: [owner.id]") + investigate_log("SGDF status appied on [owner], ID: [owner.key]", INVESTIGATE_FERMICHEM) var/typepath = owner.type fermi_Clone = new typepath(owner.loc) var/mob/living/carbon/M = owner @@ -20,7 +20,7 @@ if(owner.stat == DEAD) if((fermi_Clone && fermi_Clone.stat != DEAD) || (fermi_Clone == null)) if(owner.mind) - investigate_log("SGDF mind shift applied. [owner] is now playing as their clone and should not have memories after their clone split (look up SGDF status applied). ID: [owner.id]") + investigate_log("SGDF mind shift applied. [owner] is now playing as their clone and should not have memories after their clone split (look up SGDF status applied). ID: [owner.key]", INVESTIGATE_FERMICHEM) owner.mind.transfer_to(fermi_Clone) to_chat(owner, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") to_chat(fermi_Clone, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") @@ -37,7 +37,7 @@ var/cachedmoveCalc = 1 /datum/status_effect/chem/breast_enlarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. - investigate_log("[owner]'s breasts has reached comical sizes. ID: [owner.id]") + investigate_log("[owner]'s breasts has reached comical sizes. ID: [owner.key]", INVESTIGATE_FERMICHEM) var/mob/living/carbon/human/o = owner var/items = o.get_contents() for(var/obj/item/W in items) @@ -92,7 +92,7 @@ ..() /datum/status_effect/chem/breast_enlarger/on_remove(mob/living/carbon/M) - investigate_log("[owner]'s breasts has reduced to an acceptable size. ID: [owner.id]") + investigate_log("[owner]'s breasts has reduced to an acceptable size. ID: [owner.key]", INVESTIGATE_FERMICHEM) owner.remove_movespeed_modifier("megamilk") sizeMoveMod(1) @@ -112,7 +112,7 @@ var/moveCalc /datum/status_effect/chem/penis_enlarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. - investigate_log("[owner]'s dick has reached comical sizes. ID: [owner.id]") + investigate_log("[owner]'s dick has reached comical sizes. ID: [owner.key]", INVESTIGATE_FERMICHEM) var/mob/living/carbon/human/o = owner var/items = o.get_contents() if(o.w_uniform || o.wear_suit) @@ -155,7 +155,7 @@ ..() /datum/status_effect/chem/penis_enlarger/on_remove(mob/living/carbon/human/o) - investigate_log("[owner]'s dick has reduced to an acceptable size. ID: [owner.id]") + investigate_log("[owner]'s dick has reduced to an acceptable size. ID: [owner.key]", INVESTIGATE_FERMICHEM) owner.remove_movespeed_modifier("hugedick") owner.ResetBloodVol() @@ -231,7 +231,7 @@ var/message = "[(owner.lewd?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") - investigate_log("MKULTRA: Status applied on [owner] ckey: [owner.id] with a master of [master] ckey: [enthrallID].") + investigate_log("MKULTRA: Status applied on [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].", INVESTIGATE_FERMICHEM) return ..() /datum/status_effect/chem/enthrall/tick() @@ -265,7 +265,7 @@ if(-1)//fully removed SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall") owner.remove_status_effect(src) - investigate_log("MKULTRA: Status REMOVED from [owner] ckey: [owner.id] with a master of [master] ckey: [enthrallID].") + investigate_log("MKULTRA: Status REMOVED from [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].", INVESTIGATE_FERMICHEM) if(0)// sleeper agent if (cooldown > 0) cooldown -= 1 @@ -301,7 +301,7 @@ else to_chat(owner, "You are unable to put up a resistance any longer, and now are under the control of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [master] in death. ") owner.add_trait(TRAIT_PACIFISM, "MKUltra") //IMPORTANT - investigate_log("MKULTRA: Status on [owner] ckey: [owner.id] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].") + investigate_log("MKULTRA: Status on [owner] ckey: [owner.key] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].", INVESTIGATE_FERMICHEM) else if (resistanceTally > 200) enthrallTally *= 0.5 phase -= 1 @@ -540,7 +540,7 @@ var/cached_trigger = lowertext(trigger) if (findtext(raw_message, cached_trigger))//if trigger1 is the message cTriggered = TRUE - investigate_log("MKULTRA: [owner] ckey: [owner.id] has been triggered with [cached_trigger] from [speaker] saying: \"[message]\". (their master being [master] ckey: [enthrallID].)") + investigate_log("MKULTRA: [owner] ckey: [owner.key] has been triggered with [cached_trigger] from [speaker] saying: \"[message]\". (their master being [master] ckey: [enthrallID].)", INVESTIGATE_FERMICHEM) //Speak (Forces player to talk) works if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2 @@ -549,14 +549,14 @@ saytext += " You find yourself fully believing in the validity of what you just said and don't think to question it." to_chat(C, "[saytext]") (C.say(customTriggers[trigger][2]))//trigger3 - investigate_log("MKULTRA: [owner] ckey: [owner.id] has been forced to say: \"[customTriggers[trigger][2]]\" from previous trigger.") + investigate_log("MKULTRA: [owner] ckey: [owner.key] has been forced to say: \"[customTriggers[trigger][2]]\" from previous trigger.", INVESTIGATE_FERMICHEM) - //Echo (repeats message!) works + //Echo (repeats message!) else if (lowertext(customTriggers[trigger][1]) == "echo")//trigger2 (to_chat(owner, "[customTriggers[trigger][2]]"))//trigger3 - //Shocking truth! works + //Shocking truth! else if (lowertext(customTriggers[trigger]) == "shock") if (C.canbearoused) C.electrocute_act(10, src, 1, FALSE, FALSE, FALSE, TRUE)//I've no idea how strong this is @@ -595,7 +595,7 @@ var/mob/living/carbon/human/o = owner o.apply_status_effect(/datum/status_effect/trance, 200, TRUE) tranceTime = 50 - investigate_log("MKULTRA: [owner] ckey: [owner.id] has been tranced from previous trigger.") + investigate_log("MKULTRA: [owner] ckey: [owner.key] has been tranced from previous trigger.", INVESTIGATE_FERMICHEM) cTriggered = FALSE diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 11a36ee5f1..3e387381f9 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1235,31 +1235,30 @@ Creating a chem with a low purity will make you permanently fall in love with so /datum/reagent/fermi/hatmium //for hatterhat name = "Hat growth serium" id = "hatmium" - description = "A strange substance that draws in a hat from the hat dimention, " + description = "A strange substance that draws in a hat from the hat dimention." color = "#A080H4" // rgb: , 0, 255 - taste_description = "like jerky, whiskey and an off aftertaste of a crypt" + taste_description = "like jerky, whiskey and an off aftertaste of a crypt." overdose_threshold = 25 - var/obj/item/clothing/head/hattip/hat DoNotSplit = TRUE pH = 4 /datum/reagent/fermi/hatmium/on_mob_add(mob/living/carbon/human/M) . = ..() - var/items = M.get_contents() - for(var/obj/item/W in items) - if(W == M.head) - if(W == /obj/item/clothing/head/hattip) - qdel(W) - else - M.dropItemToGround(W, TRUE) + if(M.head) + var/obj/item/W = M.head + if(W == /obj/item/clothing/head/hattip) + qdel(W) + else + M.dropItemToGround(W, TRUE) hat = new /obj/item/clothing/head/hattip() M.equip_to_slot(hat, SLOT_HEAD, 1, 1) /datum/reagent/fermi/hatmium/on_mob_life(mob/living/carbon/human/M) - //hat.armor = list("melee" = (1+(current_cycle/20)), "bullet" = (1+(current_cycle/20)), "laser" = (1+(current_cycle/20)), "energy" = (1+(current_cycle/20)), "bomb" = (1+(current_cycle/20)), "bio" = (1+(current_cycle/20)), "rad" = (1+(current_cycle/20)), "fire" = (1+(current_cycle/20)), "acid" = (1+(current_cycle/20))) + M.head var/hatArmor = (1+(current_cycle/30))*purity + for(var/datum/armor in ) if(!overdosed) hat.armor = list("melee" = hatArmor, "bullet" = hatArmor, "laser" = hatArmor, "energy" = hatArmor, "bomb" = hatArmor, "bio" = hatArmor, "rad" = hatArmor, "fire" = hatArmor) else @@ -1341,19 +1340,19 @@ Creating a chem with a low purity will make you permanently fall in love with so //Nanite removal //Writen by Trilby!! Embellsished a little by me. -/datum/reagent/fermi/naninte_b_gone +/datum/reagent/fermi/nanite_b_gone name = "Naninte bain" - id = "naninte_b_gone" + id = "nanite_b_gone" description = "A rather simple toxin to small nano machines that will kill them off at a rapid rate well in system." color = "#5a7267" // rgb: 90, 114, 103 overdose_threshold = 15 - ImpureChem = "naninte_b_goneTox" //If you make an inpure chem, it stalls growth + ImpureChem = "nanite_b_goneTox" //If you make an inpure chem, it stalls growth InverseChemVal = 0.25 - InverseChem = "naninte_b_goneTox" //At really impure vols, it just becomes 100% inverse + InverseChem = "nanite_b_goneTox" //At really impure vols, it just becomes 100% inverse taste_description = "what can only be described as licking a battery." pH = 9 -/datum/reagent/fermi/naninte_b_gone/on_mob_life(mob/living/carbon/C) +/datum/reagent/fermi/nanite_b_gone/on_mob_life(mob/living/carbon/C) //var/component/nanites/N = M.GetComponent(/datum/component/nanites) GET_COMPONENT_FROM(N, /datum/component/nanites, C) if(isnull(N)) @@ -1361,7 +1360,7 @@ Creating a chem with a low purity will make you permanently fall in love with so N.nanite_volume = -0.55//0.5 seems to be the default to me, so it'll neuter them. ..() -/datum/reagent/fermi/naninte_b_gone/overdose_process(mob/living/carbon/C) +/datum/reagent/fermi/nanite_b_gone/overdose_process(mob/living/carbon/C) //var/component/nanites/N = M.GetComponent(/datum/component/nanites) GET_COMPONENT_FROM(N, /datum/component/nanites, C) if(prob(5)) @@ -1371,21 +1370,21 @@ Creating a chem with a low purity will make you permanently fall in love with so //empulse((get_turf(C)), 3, 2)//So the nanites randomize var/atom/T = C T.emp_act(EMP_HEAVY) - to_chat(C, "The nanintes short circuit within your system!") + to_chat(C, "The nanites short circuit within your system!") if(isnull(N)) return ..() N.nanite_volume = -2//12.5 seems crazy high? ..() //Unobtainable, used if SDGF is impure but not too impure -/datum/reagent/fermi/naninte_b_goneTox +/datum/reagent/fermi/nanite_b_goneTox name = "Naninte bain" - id = "naninte_b_goneTox" + id = "nanite_b_goneTox" description = "Poorly made, and shocks you!" metabolization_rate = 1 //Increases shock events. -/datum/reagent/fermi/naninte_b_goneTox/on_mob_life(mob/living/carbon/C)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good) +/datum/reagent/fermi/nanite_b_goneTox/on_mob_life(mob/living/carbon/C)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good) if(prob(15)) to_chat(C, "The residual voltage in your system causes you to seize up!") C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) @@ -1548,19 +1547,10 @@ Creating a chem with a low purity will make you permanently fall in love with so /datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H) . = ..() var/current_species = H.dna.species.type - var/datum/species/mutation = /datum/species/human/felinid if((mutation != current_species) && (purity >= 0.8))//ONLY if purity is high, and given the stuff is random. It's very unlikely to get this to 1. It already requires felind too, so no new functionality there. - H.set_species(mutation) - H.gender = FEMALE //exception(al) handler: - H.dna.features["mam_tail"] = "Cat" - H.dna.features["tail_human"] = "Cat" H.dna.features["ears"] = "Cat" H.dna.features["mam_ears"] = "Cat" - H.dna.features["tail_lizard"] = "Cat" - H.dna.features["mam_tail"] = "Cat" - H.dna.features["mam_tail_animated"] = "Cat" - H.facial_hair_style = "Shaved" H.verb_say = "mewls" catshift = TRUE playsound(get_turf(H), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) @@ -1583,7 +1573,7 @@ Creating a chem with a low purity will make you permanently fall in love with so H.forceMove(catto.loc) catto.mind.transfer_to(H) if(catshift == TRUE) - words += " ...But wait, are those ears and a tail?" + words += " ...But wait, are those cat ears?" H.say("*wag")//force update sprites. to_chat(H, "[words]") qdel(catto) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 3950eb2623..af6673de22 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -1,22 +1,20 @@ -//TO TWEAK: - /datum/chemical_reaction/fermi mix_sound = 'sound/effects/bubbles.ogg' //Called for every reaction step -/datum/chemical_reaction/fermi/proc/FermiCreate(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? +/datum/chemical_reaction/fermi/proc/FermiCreate(holder) return //Called when reaction STOP_PROCESSING -/datum/chemical_reaction/fermi/proc/FermiFinish(datum/reagents/holder, multipler) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? +/datum/chemical_reaction/fermi/proc/FermiFinish(datum/reagents/holder, multipler) return //Called when temperature is above a certain threshold, or if purity is too low. -/datum/chemical_reaction/fermi/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? +/datum/chemical_reaction/fermi/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) if (Exploding == TRUE) return - if(!pH)//Dunno how things got here without a pH. + if(!pH)//Dunno how things got here without a pH, but just in case pH = 7 var/ImpureTot = 0 //var/pHmod = 1 @@ -66,27 +64,27 @@ my_atom.reagents.clear_reagents() //just in case return -/datum/chemical_reaction/fermi/eigenstate//done +/datum/chemical_reaction/fermi/eigenstate name = "Eigenstasium" id = "eigenstate" results = list("eigenstate" = 0.1) required_reagents = list("bluespace" = 0.1, "stable_plasma" = 0.1, "sugar" = 0.1) mix_message = "the reaction zaps suddenly!" //FermiChem vars: - OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions - OptimalTempMax = 600 // Upper end for above - ExplodeTemp = 750 //Temperature at which reaction explodes - OptimalpHMin = 6 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) - OptimalpHMax = 8 // Higest value for above - ReactpHLim = 4 // How far out pH wil react, giving impurity place (Exponential phase) - CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharpT = 0.6 // How sharp the temperature exponential curve is (to the power of value) - CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) - ThermicConstant = 5 //Temperature change per 1u produced - HIonRelease = -0.05 //pH change per 1u reaction - RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect - FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics - FermiExplode = FALSE //If the chemical explodes in a special way + OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions + OptimalTempMax = 600 // Upper end for above + ExplodeTemp = 750 //Temperature at which reaction explodes + OptimalpHMin = 6 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 8 // Higest value for above + ReactpHLim = 4 // How far out pH wil react, giving impurity place (Exponential phase) + CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) + CurveSharpT = 0.6 // How sharp the temperature exponential curve is (to the power of value) + CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) + ThermicConstant = 5 //Temperature change per 1u produced + HIonRelease = -0.05 //pH change per 1u reaction + RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect + FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics + FermiExplode = FALSE //If the chemical explodes in a special way /datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. var/turf/open/location = get_turf(my_atom) @@ -95,7 +93,7 @@ //serum -/datum/chemical_reaction/fermi/SDGF //DONE +/datum/chemical_reaction/fermi/SDGF name = "Synthetic-derived growth factor" id = "SDGF" results = list("SDGF" = 0.3) @@ -118,7 +116,7 @@ FermiExplode = TRUE // If the chemical explodes in a special way PurityMin = 0.2 -/datum/chemical_reaction/fermi/SDGF/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies +/datum/chemical_reaction/fermi/SDGF/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//Spawns an angery teratoma! var/turf/T = get_turf(my_atom) var/mob/living/simple_animal/slime/S = new(T,"grey") S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) @@ -158,7 +156,7 @@ var/obj/item/organ/genital/breasts/B = new /obj/item/organ/genital/breasts(get_turf(my_atom)) var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) - to_chat(M, "The reaction suddenly condenses, creating a pair of breasts!")//OwO + to_chat(M, "The reaction suddenly condenses, creating a pair of breasts!") var/datum/reagent/fermi/breast_enlarger/BE = locate(/datum/reagent/fermi/breast_enlarger) in my_atom.reagents.reagent_list B.size = ((BE.volume * BE.purity) / 10) //half as effective. my_atom.reagents.clear_reagents() @@ -190,7 +188,7 @@ var/obj/item/organ/genital/penis/P = new /obj/item/organ/genital/penis(get_turf(my_atom)) var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) - to_chat(M, "The reaction suddenly condenses, creating a penis!")//OwO + to_chat(M, "The reaction suddenly condenses, creating a penis!") var/datum/reagent/fermi/penis_enlarger/PE = locate(/datum/reagent/fermi/penis_enlarger) in my_atom.reagents.reagent_list P.length = ((PE.volume * PE.purity) / 10)//half as effective. my_atom.reagents.clear_reagents() @@ -249,7 +247,7 @@ if(!B.data) var/list/seen = viewers(5, get_turf(my_atom)) for(var/mob/M in seen) - to_chat(M, "The reaction splutters and fails to react.") //if this appears, WHAT?! + to_chat(M, "The reaction splutters and fails to react.") //Just in case E.purity = 0 if (B.data.["gender"] == "female") E.data.["creatorGender"] = "Mistress" @@ -272,7 +270,7 @@ if(!B.data) var/list/seen = viewers(5, get_turf(my_atom)) for(var/mob/M in seen) - to_chat(M, "The reaction splutters and fails to react.") //if this appears, WHAT?! + to_chat(M, "The reaction splutters and fails to react.") //Just in case E.purity = 0 if (B.data.["gender"] == "female") E.data.["creatorGender"] = "Mistress" @@ -351,10 +349,10 @@ //There's a weird rounding error or something ugh. //Nano-b-gone -/datum/chemical_reaction/fermi/naninte_b_gone//done test +/datum/chemical_reaction/fermi/nanite_b_gone//done test name = "Naninte bain" - id = "naninte_b_gone" - results = list("naninte_b_gone" = 4) + id = "nanite_b_gone" + results = list("nanite_b_gone" = 4) required_reagents = list("synthflesh" = 1, "uranium" = 1, "iron" = 1, "salglu_solution" = 1) mix_message = "the reaction gurgles, encapsulating the reagents in flesh before the emp can be set off." required_temp = 499//To force fermireactions before EMP. From aa7805eaa440d584063ae6fdbe952ea50add74b0 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 06:35:12 +0100 Subject: [PATCH 249/608] Fixes. --- code/modules/reagents/chemistry/holder.dm | 11 ++--- code/modules/reagents/chemistry/reagents.dm | 1 + code/modules/reagents/reagent_containers.dm | 14 +++--- code/modules/surgery/organs/vocal_cords.dm | 3 +- .../code/datums/status_effects/chems.dm | 45 ++++++++++--------- .../chemistry/reagents/fermi_reagents.dm | 21 ++++----- 6 files changed, 48 insertions(+), 47 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 90bf1d61f0..a32ea45a01 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -786,7 +786,7 @@ var/S = specific_heat() chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), min_temp, max_temp) -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, other_purity = 1, other_pH, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, other_purity = 1, other_pH, no_react = 0) if(!isnum(amount) || !amount) return FALSE @@ -803,7 +803,7 @@ if (pH <= 2) var/datum/effect_system/smoke_spread/chem/s = new var/turf/T = get_turf(my_atom) - var/datum/reagents/R = new/datum/reagents(3000)//I don't want to hold it back..! + var/datum/reagents/R = new/datum/reagents(3000) R.add_reagent("fermiAcid", amount) for (var/datum/reagent/reagentgas in reagent_list) R.add_reagent(reagentgas, amount/5) @@ -836,7 +836,6 @@ specific_heat += D.specific_heat * (amount / new_total) thermal_energy += D.specific_heat * amount * reagtemp chem_temp = thermal_energy / (specific_heat * new_total) - //// //cacluate reagent based pH shift. pH = ((cached_pH * cached_total)+(D.pH * amount))/(cached_total + amount)//should be right @@ -858,10 +857,8 @@ if(my_atom) my_atom.on_reagent_change(ADD_REAGENT) R.on_merge(data, amount, my_atom, other_purity) - if(istype(D, /datum/reagent/fermi))//Is this a fermichem? - var/datum/reagent/fermi/Ferm = D //It is a fermichem! - if(Ferm.OnMobMergeCheck == TRUE) //Does this fermichem split? - R.on_mob_add(my_atom, amount) //On mob add processes fermichems, splitting them into their impure and pure products. This allows them to split when merging fermichems in a mob. + if(R.OnMobMergeCheck == TRUE)//Forces on_mob_add proc when a chem is merged + R.on_mob_add(my_atom, amount) if(!no_react) handle_reactions() diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 07da5ef6e6..54dc136560 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -38,6 +38,7 @@ var/addProc = FALSE //If the chemical should force an on_new() call var/turf/loc = null //Should be the creation location! var/pH = 7 //pH of the specific reagent, used for calculating the sum pH of a holder. + var/OnMobMergeCheck = FALSE /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 65ae4ce171..afc93a99b4 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -1,3 +1,8 @@ +#define FLAG_STATUS_NONE (1<<0) +#define FLAG_STATUS_PH_IMMUNE (1<<1) +#define FLAG_STATUS_TEMP_IMMUNE (1<<2) + + /obj/item/reagent_containers name = "Container" desc = "..." @@ -11,8 +16,7 @@ var/spawned_disease = null var/disease_amount = 20 var/spillable = FALSE - var/pH_immune = TRUE//true for now, just so things that shouldn't melt don't. - var/temp_immune = TRUE + var/beaker_resistances |= 1<<3 /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() @@ -127,7 +131,7 @@ //melts plastic beakers /obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M) reagents.expose_temperature(1000) - if(!temp_immune) + if(!beaker_resistances = FLAG_STATUS_TEMP_IMMUNE) var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) for(var/mob/H in seen) @@ -139,7 +143,7 @@ //melts plastic beakers /obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) reagents.expose_temperature(exposed_temperature) - if(!temp_immune) + if(!beaker_resistances = FLAG_STATUS_TEMP_IMMUNE) if(reagents.chem_temp > 444)//assuming polypropylene var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) @@ -150,7 +154,7 @@ //melts glass beakers /obj/item/reagent_containers/proc/pH_check() - if(!pH_immune) + if(!beaker_resistances = FLAG_STATUS_PH_IMMUNE) if((reagents.pH < 0.5) || (reagents.pH > 13.5)) var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index e8b6b12ede..31c68d2ba8 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1229,8 +1229,7 @@ return if(message_admins) message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") - log_game("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") - investigate_log("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].", INVESTIGATE_FERMICHEM) + log_game("FERMICHEM: [key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") //SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) If this is on, it fills the thing up and OOFs the server return diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 3c1cd72ff2..b201f394cc 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -1,10 +1,13 @@ +#define DICK_MOVEMENT_SPEED "hugedick" +#define BREAST_MOVEMENT_SPEED "megamilk" + /datum/status_effect/chem/SGDF id = "SGDF" var/mob/living/fermi_Clone alert_type = null /datum/status_effect/chem/SGDF/on_apply() - investigate_log("SGDF status appied on [owner], ID: [owner.key]", INVESTIGATE_FERMICHEM) + log_game("FERMICHEM: SGDF status appied on [owner], ID: [owner.key]") var/typepath = owner.type fermi_Clone = new typepath(owner.loc) var/mob/living/carbon/M = owner @@ -20,7 +23,7 @@ if(owner.stat == DEAD) if((fermi_Clone && fermi_Clone.stat != DEAD) || (fermi_Clone == null)) if(owner.mind) - investigate_log("SGDF mind shift applied. [owner] is now playing as their clone and should not have memories after their clone split (look up SGDF status applied). ID: [owner.key]", INVESTIGATE_FERMICHEM) + log_game("FERMICHEM: SGDF mind shift applied. [owner] is now playing as their clone and should not have memories after their clone split (look up SGDF status applied). ID: [owner.key]") owner.mind.transfer_to(fermi_Clone) to_chat(owner, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") to_chat(fermi_Clone, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") @@ -37,7 +40,7 @@ var/cachedmoveCalc = 1 /datum/status_effect/chem/breast_enlarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. - investigate_log("[owner]'s breasts has reached comical sizes. ID: [owner.key]", INVESTIGATE_FERMICHEM) + log_game("FERMICHEM: [owner]'s breasts has reached comical sizes. ID: [owner.key]") var/mob/living/carbon/human/o = owner var/items = o.get_contents() for(var/obj/item/W in items) @@ -55,7 +58,7 @@ var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") moveCalc = 1+((round(B.cached_size) - 9)/3) //Afffects how fast you move, and how often you can click. if(!B) - o.remove_movespeed_modifier("megamilk") + o.remove_movespeed_modifier(BREAST_MOVEMENT_SPEED) sizeMoveMod(1) owner.remove_status_effect(src) var/items = o.get_contents() @@ -70,14 +73,14 @@ var/target = o.get_bodypart(BODY_ZONE_CHEST) o.apply_damage(0.1, BRUTE, target) if(!B.cached_size == B.breast_values[B.prev_size]) - o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) + o.add_movespeed_modifier(BREAST_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) sizeMoveMod(moveCalc) return ..() else if (B.breast_values[B.size] > B.breast_values[B.prev_size]) - o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) + o.add_movespeed_modifier(BREAST_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) sizeMoveMod(moveCalc) else if (B.breast_values[B.size] < B.breast_values[B.prev_size]) - o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) + o.add_movespeed_modifier(BREAST_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) sizeMoveMod(moveCalc) if((B.cached_size) < 16) switch(round(B.cached_size)) @@ -92,8 +95,8 @@ ..() /datum/status_effect/chem/breast_enlarger/on_remove(mob/living/carbon/M) - investigate_log("[owner]'s breasts has reduced to an acceptable size. ID: [owner.key]", INVESTIGATE_FERMICHEM) - owner.remove_movespeed_modifier("megamilk") + log_game("FERMICHEM: [owner]'s breasts has reduced to an acceptable size. ID: [owner.key]") + owner.remove_movespeed_modifier(BREAST_MOVEMENT_SPEED) sizeMoveMod(1) /datum/status_effect/chem/breast_enlarger/proc/sizeMoveMod(var/value) @@ -112,7 +115,7 @@ var/moveCalc /datum/status_effect/chem/penis_enlarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. - investigate_log("[owner]'s dick has reached comical sizes. ID: [owner.key]", INVESTIGATE_FERMICHEM) + log_game("FERMICHEM: [owner]'s dick has reached comical sizes. ID: [owner.key]") var/mob/living/carbon/human/o = owner var/items = o.get_contents() if(o.w_uniform || o.wear_suit) @@ -133,7 +136,7 @@ moveCalc = 1+((round(P.length) - 21)/3) //effects how fast you can move bloodCalc = 1+((round(P.length) - 21)/10) //effects how much blood you need (I didn' bother adding an arousal check because I'm spending too much time on this organ already.) if(!P) - o.remove_movespeed_modifier("hugedick") + o.remove_movespeed_modifier(DICK_MOVEMENT_SPEED) o.ResetBloodVol() owner.remove_status_effect(src) var/items = o.get_contents() @@ -145,18 +148,18 @@ switch(round(P.cached_length)) if(21) to_chat(o, "Your rascally willy has become a more managable size, liberating your movements.") - o.remove_movespeed_modifier("hugedick") + o.remove_movespeed_modifier(DICK_MOVEMENT_SPEED) o.AdjustBloodVol(bloodCalc) if(22 to INFINITY) if(prob(2)) to_chat(o, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!") - o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) + o.add_movespeed_modifier(DICK_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) o.AdjustBloodVol(bloodCalc) ..() /datum/status_effect/chem/penis_enlarger/on_remove(mob/living/carbon/human/o) - investigate_log("[owner]'s dick has reduced to an acceptable size. ID: [owner.key]", INVESTIGATE_FERMICHEM) - owner.remove_movespeed_modifier("hugedick") + log_game("FERMICHEM: [owner]'s dick has reduced to an acceptable size. ID: [owner.key]") + owner.remove_movespeed_modifier(DICK_MOVEMENT_SPEED) owner.ResetBloodVol() @@ -231,7 +234,7 @@ var/message = "[(owner.lewd?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") - investigate_log("MKULTRA: Status applied on [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].", INVESTIGATE_FERMICHEM) + log_game("FERMICHEM: MKULTRA: Status applied on [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].") return ..() /datum/status_effect/chem/enthrall/tick() @@ -265,7 +268,7 @@ if(-1)//fully removed SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall") owner.remove_status_effect(src) - investigate_log("MKULTRA: Status REMOVED from [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].", INVESTIGATE_FERMICHEM) + log_game("FERMICHEM: MKULTRA: Status REMOVED from [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].") if(0)// sleeper agent if (cooldown > 0) cooldown -= 1 @@ -301,7 +304,7 @@ else to_chat(owner, "You are unable to put up a resistance any longer, and now are under the control of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [master] in death. ") owner.add_trait(TRAIT_PACIFISM, "MKUltra") //IMPORTANT - investigate_log("MKULTRA: Status on [owner] ckey: [owner.key] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].", INVESTIGATE_FERMICHEM) + log_game("FERMICHEM: MKULTRA: Status on [owner] ckey: [owner.key] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].") else if (resistanceTally > 200) enthrallTally *= 0.5 phase -= 1 @@ -540,7 +543,7 @@ var/cached_trigger = lowertext(trigger) if (findtext(raw_message, cached_trigger))//if trigger1 is the message cTriggered = TRUE - investigate_log("MKULTRA: [owner] ckey: [owner.key] has been triggered with [cached_trigger] from [speaker] saying: \"[message]\". (their master being [master] ckey: [enthrallID].)", INVESTIGATE_FERMICHEM) + log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been triggered with [cached_trigger] from [speaker] saying: \"[message]\". (their master being [master] ckey: [enthrallID].)") //Speak (Forces player to talk) works if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2 @@ -549,7 +552,7 @@ saytext += " You find yourself fully believing in the validity of what you just said and don't think to question it." to_chat(C, "[saytext]") (C.say(customTriggers[trigger][2]))//trigger3 - investigate_log("MKULTRA: [owner] ckey: [owner.key] has been forced to say: \"[customTriggers[trigger][2]]\" from previous trigger.", INVESTIGATE_FERMICHEM) + log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been forced to say: \"[customTriggers[trigger][2]]\" from previous trigger.") //Echo (repeats message!) @@ -595,7 +598,7 @@ var/mob/living/carbon/human/o = owner o.apply_status_effect(/datum/status_effect/trance, 200, TRUE) tranceTime = 50 - investigate_log("MKULTRA: [owner] ckey: [owner.key] has been tranced from previous trigger.", INVESTIGATE_FERMICHEM) + log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been tranced from previous trigger.") cTriggered = FALSE diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 3e387381f9..5601b7d97f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -9,11 +9,8 @@ var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising var/InverseChem = "fermiTox" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. var/DoNotSplit = FALSE // If impurity is handled within the main chem itself - var/OnMobMergeCheck = FALSE - //var/addProc = FALSE //When this reagent is added to a new beaker, it does something. Implemented but unused. //This should process fermichems to find out how pure they are and what effect to do. -//TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE /datum/reagent/fermi/on_mob_add(mob/living/carbon/M, amount) . = ..() if(!M) @@ -1251,18 +1248,19 @@ Creating a chem with a low purity will make you permanently fall in love with so qdel(W) else M.dropItemToGround(W, TRUE) - hat = new /obj/item/clothing/head/hattip() + var/hat = new /obj/item/clothing/head/hattip() M.equip_to_slot(hat, SLOT_HEAD, 1, 1) /datum/reagent/fermi/hatmium/on_mob_life(mob/living/carbon/human/M) - M.head + if(!M.head == /obj/item/clothing/head/hattip) + return ..() var/hatArmor = (1+(current_cycle/30))*purity - for(var/datum/armor in ) - if(!overdosed) - hat.armor = list("melee" = hatArmor, "bullet" = hatArmor, "laser" = hatArmor, "energy" = hatArmor, "bomb" = hatArmor, "bio" = hatArmor, "rad" = hatArmor, "fire" = hatArmor) - else - hat.armor = list("melee" = -hatArmor, "bullet" = -hatArmor, "laser" = -hatArmor, "energy" = -hatArmor, "bomb" = -hatArmor, "bio" = -hatArmor, "rad" = -hatArmor, "fire" = -hatArmor) + for(var/datum/armor/i in M.head) + if(!overdosed) + i = hatArmor + else + i = -hatArmor ..() //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1546,8 +1544,7 @@ Creating a chem with a low purity will make you permanently fall in love with so /datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H) . = ..() - var/current_species = H.dna.species.type - if((mutation != current_species) && (purity >= 0.8))//ONLY if purity is high, and given the stuff is random. It's very unlikely to get this to 1. It already requires felind too, so no new functionality there. + if(purity >= 0.8)//ONLY if purity is high, and given the stuff is random. It's very unlikely to get this to 1. It already requires felind too, so no new functionality there. //exception(al) handler: H.dna.features["ears"] = "Cat" H.dna.features["mam_ears"] = "Cat" From c9a66544bcd437383b08ec383c717931b6868539 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 06:45:29 +0100 Subject: [PATCH 250/608] pH and temp immune bitflagging. --- code/modules/reagents/reagent_containers.dm | 8 +++--- .../reagents/reagent_containers/bottle.dm | 2 -- .../reagents/reagent_containers/glass.dm | 26 +++++++++---------- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index afc93a99b4..45cf95dacb 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -16,7 +16,7 @@ var/spawned_disease = null var/disease_amount = 20 var/spillable = FALSE - var/beaker_resistances |= 1<<3 + var/beaker_resistances |= (1<<3) /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() @@ -131,7 +131,7 @@ //melts plastic beakers /obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M) reagents.expose_temperature(1000) - if(!beaker_resistances = FLAG_STATUS_TEMP_IMMUNE) + if(!beaker_resistances == FLAG_STATUS_TEMP_IMMUNE) var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) for(var/mob/H in seen) @@ -143,7 +143,7 @@ //melts plastic beakers /obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) reagents.expose_temperature(exposed_temperature) - if(!beaker_resistances = FLAG_STATUS_TEMP_IMMUNE) + if(!beaker_resistances == FLAG_STATUS_TEMP_IMMUNE) if(reagents.chem_temp > 444)//assuming polypropylene var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) @@ -154,7 +154,7 @@ //melts glass beakers /obj/item/reagent_containers/proc/pH_check() - if(!beaker_resistances = FLAG_STATUS_PH_IMMUNE) + if(!beaker_resistances == FLAG_STATUS_PH_IMMUNE) if((reagents.pH < 0.5) || (reagents.pH > 13.5)) var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index d9ee228228..249ed56d20 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -7,8 +7,6 @@ item_state = "atoxinbottle" possible_transfer_amounts = list(5,10,15,25,30) volume = 30 - temp_immune = TRUE //required so that things don't melt when you dispence them in the chem_master. - pH_immune = TRUE /obj/item/reagent_containers/glass/bottle/Initialize() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 76bae38750..83a9b81884 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -113,7 +113,7 @@ icon_state = "beaker" item_state = "beaker" materials = list(MAT_GLASS=500) - pH_immune = FALSE + beaker_resistances &= ~FLAG_STATUS_PH_IMMUNE /obj/item/reagent_containers/glass/beaker/Initialize() . = ..() @@ -165,7 +165,7 @@ volume = 100 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100) - pH_immune = FALSE + beaker_resistances &= ~FLAG_STATUS_PH_IMMUNE /obj/item/reagent_containers/glass/beaker/plastic name = "x-large beaker" @@ -175,8 +175,8 @@ volume = 150 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,150) - temp_immune = FALSE - pH_immune = TRUE + beaker_resistances &= ~FLAG_STATUS_TEMP_IMMUNE + beaker_resistances |= FLAG_STATUS_PH_IMMUNE /obj/item/reagent_containers/glass/beaker/plastic/update_icon() icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states @@ -191,8 +191,7 @@ volume = 200 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,200) - temp_immune = TRUE - pH_immune = TRUE + beaker_resistances |= (1<<3) /obj/item/reagent_containers/glass/beaker/noreact name = "cryostasis beaker" @@ -202,8 +201,7 @@ materials = list(MAT_METAL=3000) volume = 50 amount_per_transfer_from_this = 10 - temp_immune = TRUE - pH_immune = TRUE + beaker_resistances |= (1<<3) /obj/item/reagent_containers/glass/beaker/noreact/Initialize() . = ..() @@ -219,7 +217,7 @@ volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300) - pH_immune = FALSE + beaker_resistances &= ~FLAG_STATUS_PH_IMMUNE /obj/item/reagent_containers/glass/beaker/cryoxadone list_reagents = list("cryoxadone" = 30) @@ -276,7 +274,7 @@ SLOT_L_STORE, SLOT_R_STORE,\ SLOT_GENERC_DEXTROUS_STORAGE ) - pH_immune = FALSE + beaker_resistances &= ~FLAG_STATUS_PH_IMMUNE /obj/item/reagent_containers/glass/bucket/attackby(obj/O, mob/user, params) if(istype(O, /obj/item/mop)) @@ -326,8 +324,8 @@ materials = list(MAT_GLASS=0) volume = 50 amount_per_transfer_from_this = 10 - pH_immune = FALSE - temp_immune = FALSE + beaker_resistances &= ~FLAG_STATUS_PH_IMMUNE + beaker_resistances &= ~FLAG_STATUS_TEMP_IMMUNE /obj/item/reagent_containers/glass/beaker/waterbottle/empty list_reagents = list() @@ -339,8 +337,8 @@ list_reagents = list("water" = 100) volume = 100 amount_per_transfer_from_this = 20 - pH_immune = FALSE - temp_immune = FALSE + beaker_resistances &= ~FLAG_STATUS_PH_IMMUNE + beaker_resistances &= ~FLAG_STATUS_TEMP_IMMUNE /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty list_reagents = list() From 0f5d47c03f2bf1bfd471f5f4558d3e5275ad238d Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 06:51:11 +0100 Subject: [PATCH 251/608] Velvet speech reconfig. --- code/modules/mob/living/carbon/say.dm | 4 ---- code/modules/surgery/organs/vocal_cords.dm | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index f2866f6739..798e14db23 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -3,10 +3,6 @@ message = trauma.on_say(message) message = ..(message) - var/obj/item/organ/vocal_cords/velvet/Vc = getorganslot(ORGAN_SLOT_VOICE) - if(Vc) - velvetspeech(message, src) - var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) if(!T) //hoooooouaah! var/regex/tongueless_lower = new("\[gdntke]+", "g") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 31c68d2ba8..4dd6dd374d 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -622,6 +622,10 @@ var/base_multiplier = 1 //spans = list("say","yell") +/obj/item/organ/vocal_cords/proc/handle_speech(message) //actually say the message + owner.say(message, spans = spans, sanitize = FALSE) + velvetspeech(message, owner) + ////////////////////////////////////// ///////////FermiChem////////////////// ////////////////////////////////////// From 9fb7c9866de039ae66495fde5d20b123a1366eb6 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 06:59:46 +0100 Subject: [PATCH 252/608] Splitting larger fermi_reagents. --- code/modules/reagents/chemistry/reagents.dm | 14 +- .../reagents/chemistry/reagents/MKUltra.dm | 345 +++++ .../reagents/chemistry/reagents/SDGF.dm | 266 ++++ .../reagents/chemistry/reagents/astrogen.dm | 112 ++ .../chemistry/reagents/eigentstasium.dm | 151 +++ .../chemistry/reagents/enlargement.dm | 286 ++++ .../chemistry/reagents/fermi_reagents.dm | 1168 ----------------- 7 files changed, 1169 insertions(+), 1173 deletions(-) create mode 100644 modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm create mode 100644 modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm create mode 100644 modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm create mode 100644 modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm create mode 100644 modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 54dc136560..6349ed02eb 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -34,11 +34,15 @@ var/overdosed = 0 // You fucked up and this is now triggering its overdose effects, purge that shit quick. var/self_consuming = FALSE //Fermichem vars: - var/purity = 1 //How pure a chemical is from 0 - 1. - var/addProc = FALSE //If the chemical should force an on_new() call - var/turf/loc = null //Should be the creation location! - var/pH = 7 //pH of the specific reagent, used for calculating the sum pH of a holder. - var/OnMobMergeCheck = FALSE + var/purity = 1 //How pure a chemical is from 0 - 1. + var/addProc = FALSE //If the chemical should force an on_new() call + var/turf/loc = null //Should be the creation location! + var/pH = 7 //pH of the specific reagent, used for calculating the sum pH of a holder. + var/ImpureChem = "fermiTox"// What chemical is metabolised with an inpure reaction + var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising + var/InverseChem = "fermiTox"// What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. + var/DoNotSplit = FALSE // If impurity is handled within the main chem itself + var/OnMobMergeCheck = FALSE //Call on_mob_life proc when reagents are merging. /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm new file mode 100644 index 0000000000..fb57a22664 --- /dev/null +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -0,0 +1,345 @@ +/* +//////////////////////////////////////// +// MKULTA // +//////////////////////////////////////// +The magnum opus of FermiChem - +Long and complicated, I highly recomend you look at the two other files heavily involved in this +modular_citadel/code/datums/status_effects/chems.dm - handles the subject's reactions +code/modules/surgery/organs/vocal_cords.dm - handles the enchanter speaking + +HOW IT WORKS +Fermis_Reagent.dm +There's 3 main ways this chemical works; I'll start off with discussing how it's set up. +Upon reacting with blood as a catalyst, the blood is used to define who the enthraller is - thus only the creator is/can choose who the master will be. As a side note, you can't adminbus this chem, even admins have to earn it. +This uses the fermichem only proc; FermiCreate, which is basically the same as On_new, except it doesn't require "data" which is something to do with blood and breaks everything so I said bugger it and made my own proc. It basically sets up vars. +When it's first made, the creator has to drink some of it, in order to give them the vocal chords needed. +When it's given to someone, it gives them the status effect and kicks off that side of things. For every metabolism tick, it increases the enthrall tally. +Finally, if you manage to pump 100u into some poor soul, you overload them, and mindbreak them. Making them your willing, but broken slave. Which can only be reversed by; fixing their brain with mannitol and neurine (100 / 50u respectively) (or less with both), + +vocal_cords.dm +This handles when the enchanter speaks - basically uses code from voice of god, but only for people with the staus effect. Most of the words are self explainitory, and has a smaller range of commands. If you're not sure what one does, it likely affects the enthrall tally, or the resist tally. +list of commands: + +-mixables- +enthral_words +reward_words +punish_words +0 +saymyname_words +wakeup_words +1 +silence_words +antiresist_words +resist_words +forget_words +attract_words +orgasm_words +2 +awoo_words +nya_words +sleep_words +strip_words +walk_words +run_words +knockdown_words +3 +statecustom_words +custom_words +objective_words +heal_words +stun_words +hallucinate_words +hot_words +cold_words +getup_words +pacify_words +charge_words + +Mixables can be used intersperced with other commands, 0 is commands that work on sleeper against (i.e. players enthralled to state 3, then ordered to wake up and forget, they can be triggered back instantly) +1 is for players who immediately are injected with the chem - no stuns, only a silence and something that draws them towrds them. This is the best time to try to fight it and you're likely to win by spamming resist, unless the enchantress has plans. +2 is the seconds stage, which allows removal of clothes, slowdown and light stunning. You can also make them nya and awoo, because cute. +3 is the finaly state, which allows application of a few status effects (see chem.dm) and allows custom triggers to be installed (kind of like nanites), again, see chem.dm +In a nutshell, this is the way you enthrall people, by typing messages into chat and managing cooldowns on the stronger words. You have to type words and your message strength is increases with the number of characters - if you type short messages the cooldown will be too much and the other player will overcome the chem. +I suppose people could spam gdjshogndjoadphgiuaodp but, the truth of this chem is that it mostly allows a casus beli for subs to give in, and everyones a sub on cit (mostly), so if you aujigbnadjgipagdsjk then they might resist harder cause you're a baddie and baddies don't deserve pets. +Also, the use of this chem as a murder aid is antithetic to it's design, the subject gains bonus resistance if they're hurt or hungry (I'd like to expland this more, I like the idea that you have to look after all of them otherwise they aren't as effective, kind of like tamagachis!). If this becomes a problem, I'll deal with it, I'm not happy with people abusing this chem for an easy murder. (I might make it so you an't strike your pet when health is too low.) +Additionaly, in lieu of previous statement - the pet is ordered to not kill themselves, even if ordered to. + +chem.dm +oof +There's a few basic things that have to be understood with this status effect +1. There is a min loop which calculates the enthrall state of the subject, when the entrall tally is over a certain amount, it will push you up 1 phase. +0 - Sleeper +1 - initial +2 - enthralled +3 - Fully entranced +4 - mindbroken +4 can only be reached via OD, whereas you can increment up from 1 > 2 > 3. 0 is only obtainable on a state 3 pet, and it toggles between the two. + +1.5 Chem warfare +Since this is a chem, it's expected that you will use all of the chemicals at your disposal. Using aphro and aphro+ will weaken the resistance of the subject, while ananphro, anaphro+, mannitol and neurine will strengthen it. +Additionally, the more aroused you are, the weaker your resistance will be, as a result players immune to aphro and anaphro give a flat bonus to the enthraller. +using furranium and hatmium on the enchanter weakens their power considerably, because they sound rediculous. "Youwe fweewing wery sweepy uwu" This completely justifies their existance. +The impure toxin for this chem increases resistance too, so if they're a bad chemist it'll be unlikely they have a good ratio (and as a secret bonus, really good chemists cann purposely make the impure chem, to use either to combat the use of it against them, or as smoke grenades to deal with a large party) + +2. There is a resistance proc which occurs whenever the player presses resist. You have to press it a lot, this is intentional. If you're trying to fight the enchanter, then you can't click both. You usually will win if you just mash resist and the enchanter does nothing, so you've got to react. +Each step futher it becomes harder to resist, in state 2 it's longer, but resisting is still worthwhile. If you're not in state 3, and you've not got MKultra inside of you, you generate resistance very fast. So in some cases the better option will be to stall out any attempts to entrance you. +At the moment, resistance doesn't affect the commands - mostly because it's a way to tell if a state 3 is trying to resist. But this might change if it gets too hard to fight them off. +Durign state 3, it's impossible to resist if the enthraller is in your presence (8 tiles), you generate no resistance if so. If they're out of your range, then you start to go into the addiction processed +As your resistance is tied to your arousal, sometimes your best option is to wah + +3. The addition process starts when the enthraller is out of range, it roughtly follows the five stages of grief; denial, anger, bargaining, depression and acceptance. +What it mostly does makes you sad, hurts your brain, and sometimes you lash out in anger. +Denial - minor brain damaged +bargaining - 50:50 chance of brain damage and brain healing +anger - randomly lashing out and hitting people +depression - massive mood loss, stuttering, jittering, hallucinations and brain damage +depression, again - random stunning and crying, brain damage, and resistance +acceptance - minor brain damage and resistance. +You can also resist while out of range, but you can only break free of a stange 3 enthrallment by hitting the acceptance phase with a high enough resistance. +Finally, being near your enthraller reverts the damages caused. +It is expected that if you intend to break free you'll need to use psicodine and mannitol or you'll end up in a bad, but not dead, state. This gives more work for medical!! Finally the true rational of this complicated chem comes out. + +4. Status effects in status effects. +There's a few commands that give status effects, such as antiresist, which will cause resistance presses to increase the enthrallment instead, theses are called from the vocal chords. +They're mostly self explainitory; antiresist, charge, pacify and heal. Heals quite weak for obvious reasons. I'd like to add more, maybe some weak adneals with brute/exhaustion costs after the status is over. A truth serum might be neat too. +State 4 pets don't get status effects. + +5. Custom triggers +Because it wasnt complicated enough already. +Custom triggers are set by stating a trigger word, which will call a sub proc, which is also defined when the trigger is Called +The effects avalible at the moment are: +Speak - forces pet to say a preallocated phrase in response to the trigger +Echo - sends a message to that player only (i.e. makes them think something) +Shock - gives them a seizure/zaps them +You can look this one up yourself - it's what you expect, it's cit +kneel - gives a short knockdown +strip - strips jumpsuit only +objective - gives the pet a new objective. This requires a high ammount of mental capasity - which is determined by how much you resist. If you resist enough during phase 1 and 2, then they can't give you an objective. +Feel free to add more. +triggers work when said by ANYONE, not just the enchanter. +This is only state 3 pets, state 4 pets cannot get custom triggers, you broke them you bully. + +7. If you're an antage you get a bonus to resistance AND to enthralling. Thus it can be worth using this on both sides. It shouldn't be hard to resist as an antag. There are futher bonuses to command, Chaplains and chemist. +If you give your pet a collar then their resistance reduced too. +(I think thats everything?) + +Failstates: +Blowing up the reaction produces a gas that causes everyone to fall in love with one another. + +Creating a chem with a low purity will make you permanently fall in love with someone, and tasked with keeping them safe. If someone else drinks it, you fall for them. +*/ + +/datum/reagent/fermi/enthrall + name = "MKUltra" + id = "enthrall" + description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." + color = "#2C051A" // rgb: , 0, 255 + taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" + overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. + DoNotSplit = TRUE + metabolization_rate = 0.1//It has to be slow, so there's time for the effect. + data = list("creatorID" = null, "creatorGender" = null, "creatorName" = null) + var/creatorID //ckey + var/creatorGender + var/creatorName + var/mob/living/creator + pH = 10 + OnMobMergeCheck = TRUE //Procs on_mob_add when merging into a human + +/datum/reagent/fermi/enthrall/test + name = "MKUltraTest" + id = "enthrallTest" + description = "A forbidden deep red mixture that overwhelms a foreign body with waves of joy, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." + color = "#2C051A" // rgb: , 0, 255 + data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Fermis Yakumo") + creatorID = "honkatonkbramblesnatch"//ckey + creatorGender = "Mistress" + creatorName = "Fermis Yakumo" + purity = 1 + DoNotSplit = TRUE + +/datum/reagent/fermi/enthrall/test/on_new() + id = "enthrall" + ..() + creator = get_mob_by_key(creatorID) + +/datum/reagent/fermi/enthrall/on_new(list/data) + creatorID = data.["creatorID"] + creatorGender = data.["creatorGender"] + creatorName = data.["creatorName"] + creator = get_mob_by_key(creatorID) + +/datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) + . = ..() + if(!ishuman(M))//Just to make sure screwy stuff doesn't happen. + return + if(!creatorID) + //This happens when the reaction explodes. + return + var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + if(E) + if(E.enthrallID == M.ckey && creatorName != M.real_name)//If you're enthralled to yourself (from OD) and someone else tries to enthrall you, you become thralled to them instantly. + E.enthrallID = creatorID + E.enthrallGender = creatorGender + E.master = get_mob_by_key(creatorID) + to_chat(M, to_chat(M, "Your aldled, plastic, mind bends under the chemical influence of a new [(M.lewd?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.")) //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE. + return + if(purity < 0.5)//Impure chems don't function as you expect + return + if((M.ckey == creatorID) && (creatorName == M.real_name)) //same name AND same player - same instance of the player. (should work for clones?) + /*if(M.has_status_effect(STATUS_EFFECT_INLOVE) //Not sure if I need/want this. + to_chat(M, "You are too captivated by your love to think about anything else") + return*/ + var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) + var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet + if(Vc) + Vc.Remove(M) + nVc.Insert(M) + qdel(Vc) + to_chat(M, "You feel your vocal chords tingle as your voice comes out in a more sultry tone.") + else + message_admins("MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]") + M.apply_status_effect(/datum/status_effect/chem/enthrall) + +/datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) + . = ..() + if(purity < 0.5)//DO NOT SPLIT INTO DIFFERENT CHEM: This relies on DoNotSplit - has to be done this way. + if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. + if(M.has_status_effect(STATUS_EFFECT_INLOVE))//Can't be enthralled when enthralled, so to speak. + return + var/list/seen = viewers(7, get_turf(M)) + for(var/victim in seen) + if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (!M.client) || (M.stat == DEAD)) + seen = seen - victim + if(!seen) + return + M.reagents.remove_reagent(id, volume) + FallInLove(M, pick(seen)) + return + else // If someone else drinks it, the creator falls in love with them! + var/mob/living/carbon/C = get_mob_by_key(creatorID) + if(M.has_status_effect(STATUS_EFFECT_INLOVE)) + return + if((C in viewers(7, get_turf(M))) && (C.client)) + M.reagents.remove_reagent(id, volume) + FallInLove(C, M) + return + if(volume < 1)//You don't get to escape that easily + FallInLove(pick(GLOB.player_list), M) + if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it does nothing. + return + if(!M.client) + metabolization_rate = 0 //Stops powergamers from quitting to avoid affects. but prevents affects on players that don't exist for performance. + return + if(metabolization_rate == 0) + metabolization_rate = 0.5 + var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)//If purity is over 5, works as intended + if(!E) + return + else + E.enthrallTally += 1 + if(prob(1)) + M.adjustBrainLoss(1)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it. + ..() + +/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I made it so the creator is set to gain the status for someone random. + . = ..() + if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 100u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.) + to_chat(M, "You are unable to resist your own charms anymore, and become a full blown narcissist.") + /*Old way of handling, left in as an option B + var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers + for(var/mob/living/carbon/victim in seen) + if(victim == M)//as much as I want you to fall for beepsky, he doesn't have a ckey + seen = seen - victim + if(!victim.ckey) + seen = seen - victim + var/mob/living/carbon/chosen = pick(seen) + creatorID = chosen.ckey + if (chosen.gender == "female") + creatorGender = "Mistress" + else + creatorGender = "Master" + creatorName = chosen.real_name + creator = get_mob_by_key(creatorID) + */ + M.add_trait(TRAIT_PACIFISM, "MKUltra") + var/datum/status_effect/chem/enthrall/E + if (!M.has_status_effect(/datum/status_effect/chem/enthrall)) + M.apply_status_effect(/datum/status_effect/chem/enthrall) + E = M.has_status_effect(/datum/status_effect/chem/enthrall) + E.enthrallID = creatorID + E.enthrallGender = creatorGender + E.master = creator + else + E = M.has_status_effect(/datum/status_effect/chem/enthrall) + to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side at all costs.") + M.slurring = 100 + M.confused = 100 + E.phase = 4 + E.mental_capacity = 0 + E.customTriggers = list() + +/datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M) + M.adjustBrainLoss(0.1)//should be 15 in total + ..() + +//Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system. +/datum/reagent/fermi/enthrallExplo//Created in a gas cloud when it explodes + name = "MKUltra" + id = "enthrallExplo" + description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." + color = "#2C051A" // rgb: , 0, 255 + metabolization_rate = 0.1 + taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses." + DoNotSplit = TRUE + var/mob/living/carbon/love + +/datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system,Gives a positive moodlet if close, gives brain damagea and a negative moodlet if not close enough. + if(!M.has_status_effect(STATUS_EFFECT_INLOVE)) + var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers + for(var/victim in seen) + if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (M.stat == DEAD)) + seen = seen - victim + if(seen.len == 0) + return + love = pick(seen) + if(!love) + return + M.apply_status_effect(STATUS_EFFECT_INLOVE, love) + to_chat(M, "You develop overwhelmingly deep feelings for [love], your heart beginning to race as you look upon them with new eyes. You are determined to keep them safe above all other priorities.") + else + if(get_dist(M, love) < 8) + if(M.has_trait(TRAIT_NYMPHO)) //Add this back when merged/updated. + M.adjustArousalLoss(5) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") + else + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") + if(prob(10)) + M.Stun(10) + M.emote("whimper")//does this exist? + to_chat(M, " You're overcome with a desire to see [love].") + M.adjustBrainLoss(1)//I found out why everyone was so damaged! + ..() + +/datum/reagent/fermi/enthrallExplo/on_mob_delete(mob/living/carbon/M) + M.remove_status_effect(STATUS_EFFECT_INLOVE) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") + to_chat(M, "Your feelings for [love] suddenly vanish!") + ..() + +/datum/reagent/fermi/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love) + if(Lover.has_status_effect(STATUS_EFFECT_INLOVE)) + to_chat(Lover, "You are already fully devoted to someone else!") + return + to_chat(Lover, "You develop deep feelings for [Love], your heart beginning to race as you look upon them with new eyes.") + if(Lover.mind) + Lover.mind.store_memory("You are in love with [Love].") + Lover.faction |= "[REF(Love)]" + Lover.apply_status_effect(STATUS_EFFECT_INLOVE, Love) + forge_valentines_objective(Lover, Love, TRUE) + return + +//For addiction see chem.dm diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm new file mode 100644 index 0000000000..688b2a865f --- /dev/null +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -0,0 +1,266 @@ +/*SDGF +//////////////////////////////////////////////////// +// synthetic-derived growth factor // +////////////////////////////////////////////////// +other files that are relivant: +modular_citadel/code/datums/status_effects/chems.dm - SDGF +WHAT IT DOES + +Several outcomes are possible (in priority order): + +Before the chem is even created, there is a risk of the reaction "exploding", which produces an angry teratoma that attacks the player. +0. Before the chem is activated, the purity is checked, if the purity of the reagent is less than 0.5, then sythetic-derived zombie factor is metabolised instead + 0.1 If SDZF is injected, the chem appears to act the same as normal, with nutrition gain, until the end, where it becomes toxic instead, giving a short window of warning to the player + 0.1.2 If the player can take pent in time, the player will spawn a hostile teratoma on them (less damaging), if they don't, then a zombie is spawned instead, with a small defence increase propotional to the volume + 0.2 If the purity is above 0.5, then the remaining impure volume created SDGFtox instead, which reduces blood volume and causes clone damage +1.Normal function creates a (another)player controlled clone of the player, which is spawned nude, with damage to the clone + 1.1 The remaining volume is transferred to the clone, which heals it over time, thus the player has to make a substantial ammount of the chem in order to produce a healthy clone + 1.2 If the player is infected with a zombie tumor, the tumor is transferred to the ghost controlled clone ONLY. +2. If no player can be found, a brainless clone is created over a long period of time, this body has no controller. + 2.1 If the player dies with a clone, then they play as the clone instead. However no memories are retained after splitting. +3. If there is already a clone, then SDGF heals clone, fire and brute damage slowly. This shouldn't normalise this chem as the de facto clone healing chem, as it will always try to make a ghost clone, and then a brainless clone first. +4. If there is insuffient volume to complete the cloning process, there are two outcomes + 4.1 At lower volumes, the players nutrition and blood is refunded, with light healing + 4.2 At higher volumes a stronger heal is applied to the user + +IMPORTANT FACTORS TO CONSIDER WHILE BALANCING +1. The most important factor is the required volume, this is easily edited with the metabolism rate, this chem is HARD TO MAKE, You need to make a lot of it and it's a substantial effort on the players part. There is also a substantial risk; you could spawn a hotile teratoma during the reation, you could damage yourself with clone damage, you could accidentally spawn a zombie... Basically, you've a good chance of killing yourself. + 1.1 Additionally, if you're trying to make SDZF purposely, you've no idea if you have or not, and that reaction is even harder to do. Plus, the player has a huge time window to get to medical to deal with it. If you take pent while it's in you, it'll be removed before it can spawn, and only spawns a teratoma if it's late stage. +2. The rate in which the clone is made, This thing takes time to produce fruits, it slows you down and makes you useless in combat/working. Basically you can't do anything during it. It will only get you killed if you use it in combat, If you do use it and you spawn a player clone, they're gimped for a long time, as they have to heal off the clone damage. +3. The healing - it's pretty low and a cyropod is more Useful +4. If you're an antag, you've a 50% chance of making a clone that will help you with your efforts, and you've no idea if they will or not. While clones can't directly harm you and care for you, they can hinder your efforts. +5. If people are being arses when they're a clone, slap them for it, they are told to NOT bugger around with someone else character, if it gets bad I'll add a blacklist, or do a check to see if you've played X amount of hours. + 5.1 Another solution I'm okay with is to rename the clone to [M]'s clone, so it's obvious, this obviously ruins anyone trying to clone themselves to get an alibi however. I'd prefer this to not be the case. + 5.2 Additionally, this chem is a soft buff to changelings, which apparently need a buff! + 5.3 Other similar things exist already though in the codebase; impostors, split personalites, abductors, ect. +6. Giving this to someone without concent is against space law and gets you sent to gulag. +*/ + +//Clone serum #chemClone +/datum/reagent/fermi/SDGF //vars, mostly only care about keeping track if there's a player in the clone or not. + name = "synthetic-derived growth factor" + id = "SDGF" + description = "A rapidly diving mass of Embryonic stem cells. These cells are missing a nucleus and quickly replicate a host’s DNA before growing to form an almost perfect clone of the host. In some cases neural replication takes longer, though the underlying reason underneath has yet to be determined." + color = "#60A584" // rgb: 96, 0, 255 + var/playerClone = FALSE + var/unitCheck = FALSE + metabolization_rate = 0.5 * REAGENTS_METABOLISM + //var/datum/status_effect/chem/SDGF/candidates/candies + var/list/candies = list() + //var/polling = FALSE + var/list/result = list() + var/list/group = null + var/pollStarted = FALSE + var/location_created + var/startHunger + ImpureChem = "SDGFtox" + InverseChemVal = 0.5 + InverseChem = "SDZF" + +//Main SDGF chemical +/datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. + //Setup clone + switch(current_cycle) + if(1) + startHunger = M.nutrition + if(pollStarted == FALSE) + pollStarted = TRUE + candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") + if(20 to INFINITY) + if(LAZYLEN(candies) && playerClone == FALSE) //If there's candidates, clone the person and put them in there! + message_admins("Ghost candidate found! [candies] is becoming a clone of [M]! Hee~!! Exciting!!") + to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") + var/typepath = M.type + var/mob/living/carbon/human/fermi_Gclone = new typepath(M.loc) + var/mob/living/carbon/human/SM = fermi_Gclone + if(istype(SM) && istype(M)) + SM.real_name = M.real_name + M.dna.transfer_identity(SM) + SM.updateappearance(mutcolor_update=1) + var/mob/dead/observer/C = pick(candies) + SM.key = C.key + SM.mind.enslave_mind_to_creator(M) + + //If they're a zombie, they can try to negate it with this. + //I seriously wonder if anyone will ever use this function. + if(M.getorganslot(ORGAN_SLOT_ZOMBIE))//sure, it "treats" it, but "you've" still got it. Doesn't always work as well; needs a ghost. + var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE) + ZI.Remove(M) + ZI.Insert(SM) + + to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") + to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") + to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") + M.visible_message("[M] suddenly shudders, and splits into two identical twins!") + SM.copy_known_languages_from(M, FALSE) + playerClone = TRUE + M.next_move_modifier = 1 + M.nutrition -= 500 + + //Damage the clone + SM.blood_volume = (BLOOD_VOLUME_NORMAL*SM.blood_ratio)/2 + SM.adjustCloneLoss(60, 0) + SM.setBrainLoss(40) + SM.nutrition = startHunger/2 + + //Transfer remaining reagent to clone. I think around 30u will make a healthy clone, otherwise they'll have clone damage, blood loss, brain damage and hunger. + SM.reagents.add_reagent("SDGFheal", volume) + M.reagents.remove_reagent(id, volume) + return + + else if(playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). + unitCheck = TRUE + if(M.has_status_effect(/datum/status_effect/chem/SGDF)) // Heal the user if they went to all this trouble to make it and can't get a clone, the poor fellow. + switch(current_cycle) + if(21) + to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). + M.remove_trait(TRAIT_DISFIGURED, TRAIT_GENERIC) + if(22 to INFINITY) + M.adjustCloneLoss(-1, 0) + M.adjustBruteLoss(-1, 0) + M.adjustFireLoss(-1, 0) + M.heal_bodypart_damage(1,1) + M.reagents.remove_reagent(id, 1)//faster rate of loss. + else //If there's no ghosts, but they've made a large amount, then proceed to make flavourful clone, where you become fat and useless until you split. + switch(current_cycle) + if(21) + to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") + if(22 to 29) + M.nutrition = M.nutrition + (M.nutrition/10) + if(30) + to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") + if(31 to 49) + M.nutrition = M.nutrition + (M.nutrition/5) + if(50) + to_chat(M, "The synthetic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") + M.next_move_modifier += 4//If this makes you fast then please fix it, it should make you slow!! + //candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies + if(51 to 79) + M.nutrition = M.nutrition + (M.nutrition/2) + if(80) + to_chat(M, "The cells begin to precipitate outwards of your body, you feel like you'll split soon...") + if (M.nutrition < 20000) + M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI + if(86)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. + M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE + M.next_move_modifier -= 4 + to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") + M.apply_status_effect(/datum/status_effect/chem/SGDF) + if(87 to INFINITY) + M.reagents.remove_reagent(id, volume)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. + + + ..() + +/datum/reagent/fermi/SDGF/on_mob_delete(mob/living/M) //When the chem is removed, a few things can happen, mostly consolation prizes. + pollStarted = FALSE + if (playerClone == TRUE)//If the player made a clone with it, then thats all they get. + playerClone = FALSE + return + if (M.next_move_modifier == 4 && !M.has_status_effect(/datum/status_effect/chem/SGDF))//checks if they're ingested over 20u of the stuff, but fell short of the required 30u to make a clone. + to_chat(M, "You feel the cells begin to merge with your body, unable to reach nucleation, they instead merge with your body, healing any wounds.") + M.adjustCloneLoss(-10, 0) //I don't want to make Rezadone obsolete. + M.adjustBruteLoss(-25, 0)// Note that this takes a long time to apply and makes you fat and useless when it's in you, I don't think this small burst of healing will be useful considering how long it takes to get there. + M.adjustFireLoss(-25, 0) + M.blood_volume += 250 + M.heal_bodypart_damage(1,1) + M.next_move_modifier = 1 + if (M.nutrition < 1500) + M.nutrition += 250 + else if (unitCheck == TRUE && !M.has_status_effect(/datum/status_effect/chem/SGDF))// If they're ingested a little bit (10u minimum), then give them a little healing. + unitCheck = FALSE + to_chat(M, "the cells fail to hold enough mass to generate a clone, instead diffusing into your system.") + M.adjustBruteLoss(-10, 0) + M.adjustFireLoss(-10, 0) + M.blood_volume += 100 + M.next_move_modifier = 1 + if (M.nutrition < 1500) + M.nutrition += 500 + +//Unobtainable, used in clone spawn. +/datum/reagent/fermi/SDGFheal + name = "synthetic-derived growth factor" + id = "SDGFheal" + metabolization_rate = 1 + +/datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) + if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) + M.blood_volume += 10 + M.adjustCloneLoss(-2, 0) + M.setBrainLoss(-1) + M.nutrition += 10 + ..() + +//Unobtainable, used if SDGF is impure but not too impure +/datum/reagent/fermi/SDGFtox + name = "synthetic-derived growth factor" + id = "SDGFtox" + description = "A chem that makes Fermis angry at you if you're reading this, how did you get this???" + metabolization_rate = 1 + +/datum/reagent/fermi/SDGFtox/on_mob_life(mob/living/carbon/M)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good) + M.blood_volume -= 10 + M.adjustCloneLoss(2, 0) + ..() + +//Fail state of SDGF +/datum/reagent/fermi/SDZF + name = "synthetic-derived growth factor" + id = "SDZF" + description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" + color = "#60A584" // rgb: 96, 0, 255 + metabolization_rate = 0.5 * REAGENTS_METABOLISM + var/startHunger + +/datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. + switch(current_cycle)//Pretends to be normal + if(20) + to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") + startHunger = M.nutrition + if(21 to 29) + M.nutrition = M.nutrition + (M.nutrition/10) + if(30) + to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") + if(31 to 49) + M.nutrition = M.nutrition + (M.nutrition/5) + if(50) + to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") + M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! + if(51 to 73) + M.nutrition = M.nutrition + (M.nutrition/2) + if(74) + to_chat(M, "The cells begin to precipitate outwards of your body, but... something is wrong, the sythetic cells are beginnning to rot...") + if (M.nutrition < 20000) //whoever knows the maxcap, please let me know, this seems a bit low. + M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI + if(75 to 85) + M.adjustToxLoss(1, 0)// the warning! + if(86)//mean clone time! + if (!M.reagents.has_reagent("pen_acid"))//Counterplay is pent.) + message_admins("(non-infectious) Zombie spawned at [M.loc], produced by impure chem, wah!") + M.nutrition = startHunger - 500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE + M.next_move_modifier = 1 + to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") + M.visible_message("[M] suddenly shudders, and splits into a funky smelling copy of themselves!") + M.emote("scream") + M.adjustToxLoss(30, 0) + var/mob/living/simple_animal/hostile/unemployedclone/ZI = new(get_turf(M.loc)) + ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + ZI.real_name = M.real_name//Give your offspring a big old kiss. + ZI.name = M.real_name + ZI.desc = "[M]'s clone, gone horribly wrong." + + M.reagents.remove_reagent(id, 20) + else//easier to deal with + to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour!") + M.nutrition = startHunger - 500 + var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") //TODO: replace slime as own simplemob/add tumour slime cores for science/chemistry interplay + S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + S.name = "Living teratoma" + S.real_name = "Living teratoma"//horrifying!! + S.rabid = 1//Make them an angery boi + //S.updateappearance(mutcolor_update=1) + M.reagents.remove_reagent(id, volume) + to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") + if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. TODO: turn tumour slime into real variant. + M.adjustToxLoss(1, 0) + ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm new file mode 100644 index 0000000000..0df29af693 --- /dev/null +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -0,0 +1,112 @@ +/* +//////////////////////////////////////////////////////////////////////////////////////////////////// +// ASTROGEN +/////////////////////////////////////////////////////////////////////////////////////////////////// +More fun chems! +When you take it, it spawns a ghost that the player controls. (No access to deadchat) +This ghost moves pretty quickly and is mostly invisible, but is still visible for people with eyes. +When it's out of your system, you return back to yourself. It doesn't last long and metabolism of the chem is exponential. +Addiction is particularlly brutal, it slowly turns you invisible with flavour text, then kills you at a low enough alpha. (i've also added something to prevent geneticists speeding this up) +There's afairly major catch regarding the death though. I'm not gonna say here, go read the code, it explains it and puts my comments on it in context. I know that anyone reading it without understanding it is going to freak out so, this is my attempt to get you to read it and understand it. +I'd like to point out from my calculations it'll take about 60-80 minutes to die this way too. Plenty of time to visit me and ask for some pills to quench your addiction. +*/ + +/datum/reagent/fermi/astral // Gives you the ability to astral project for a moment! + name = "Astrogen" + id = "astral" + description = "An opalescent murky liquid that is said to distort your soul from your being." + color = "#A080H4" // rgb: , 0, 255 + taste_description = "velvety brambles" + metabolization_rate = 0//Removal is exponential, see code + overdose_threshold = 20 + addiction_threshold = 24.5 + addiction_stage1_end = 9999//Should never end. There is no escape make your time + var/mob/living/carbon/origin + var/mob/living/simple_animal/hostile/retaliate/ghost/G = null + var/antiGenetics = 255 + var/sleepytime = 0 + InverseChemVal = 0.25 + +/datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! + M.alpha = 255 + switch(current_cycle) + if(0)//Require a minimum + origin = M + if (G == null) + G = new(get_turf(M.loc)) + G.attacktext = "raises the hairs on the neck of" + G.response_harm = "disrupts the concentration of" + G.response_disarm = "wafts" + G.loot = null + G.maxHealth = 5 + G.health = 5 + G.melee_damage_lower = 0 + G.melee_damage_upper = 0 + G.deathmessage = "disappears as if it was never really there to begin with" + G.incorporeal_move = 1 + G.alpha = 35 + G.name = "[M]'s astral projection" + M.mind.transfer_to(G) + sleepytime = 15*volume + if(overdosed) + if(prob(50)) + to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") + do_teleport(G, M.loc) + M.reagents.remove_reagent(id, current_cycle/2, FALSE) + ..() + +/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) + G.mind.transfer_to(origin) + qdel(G) + if(overdosed) + to_chat(M, "The high volume of Astrogren you just took causes you to black out momentarily as your mind snaps back to your body.") + M.Sleeping(sleepytime, 0) + antiGenetics = 255 + ..() + +//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. +/datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) + if(addiction_stage < 2) + antiGenetics = 255//Doesn't reset when you take more, which is weird for me, it should. + M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them. + if(prob(65)) + M.alpha-- + antiGenetics-- + switch(antiGenetics) + if(245) + to_chat(M, "You notice your body starting to disappear, maybe you took too much Astrogen...?") + M.alpha-- + antiGenetics-- + if(220) + to_chat(M, "Your addiction is only getting worse as your body disappears. Maybe you should get some more, and fast?") + M.alpha-- + antiGenetics-- + if(180) + to_chat(M, "You feel fear build up in yourself as more and more of your body and consciousness begins to fade.") + M.alpha-- + antiGenetics-- + if(120) + to_chat(M, "As you lose more and more of yourself, you start to think that maybe shedding your mortality isn't too bad.") + M.alpha-- + antiGenetics-- + if(100) + to_chat(M, "You feel a substantial part of your soul flake off into the ethereal world, rendering yourself unclonable.") + M.alpha-- + antiGenetics-- + M.add_trait(TRAIT_NOCLONE) //So you can't scan yourself, then die, to metacomm. You can only use your memories if you come back as something else. + if(80) + to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates your forthcoming oblivion.") + M.alpha-- + antiGenetics-- + if(45) + to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.") + M.alpha-- + antiGenetics-- + if(0 to 30) + to_chat(M, "Your body disperses from existence, as you become one with the universe.") + to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag, you do not remember the afterlife IC)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. + deadchat_broadcast("[M] has become one with the universe, meaning that their IC conciousness is continuous in a new life. If they find a way back to life, they are allowed to remember their previous life. Be careful what you say. If they abuse this, bwoink the FUCK outta them.") + M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") + message_admins("[M] (ckey: [M.ckey]) has become one with the universe, and have continuous memories thoughout their lives should they find a way to come back to life (such as an inteligence potion, midround antag, ghost role).") + qdel(M) //Approx 60minutes till death from initial addiction + ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm new file mode 100644 index 0000000000..fa677ade9c --- /dev/null +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -0,0 +1,151 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////// +// EIGENSTASIUM +/////////////////////////////////////////////////////////////////////////////////////////////////// +//eigenstate Chem +//Teleports you to chemistry and back +//OD teleports you randomly around the Station +//Addiction send you on a wild ride and replaces you with an alternative reality version of yourself. +//During the process you get really hungry, then your items start teleporting randomly, +//then alternative versions of yourself are brought in from a different universe and they yell at you. +//and finally you yourself get teleported to an alternative universe, and character your playing is replaced with said alternative + +/datum/reagent/fermi/eigenstate + name = "Eigenstasium" + id = "eigenstate" + description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" + taste_description = "wiggly cosmic dust." + color = "#5020H4" // rgb: 50, 20, 255 + overdose_threshold = 15 + addiction_threshold = 15 + metabolization_rate = 0.5 * REAGENTS_METABOLISM + addiction_stage2_end = 30 + addiction_stage3_end = 41 + addiction_stage4_end = 44 //Incase it's too long + var/location_created + var/turf/open/location_return = null + var/addictCyc1 = 0 + var/addictCyc2 = 0 + var/addictCyc3 = 0 + var/addictCyc4 = 0 + var/mob/living/fermi_Tclone = null + var/teleBool = FALSE + pH = 3.7 + +//Main functions +/datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! + switch(current_cycle) + if(0) + location_return = get_turf(M) //sets up return point + to_chat(M, "You feel your wavefunction split!") + if(purity > 0.75) //Teleports you home if it's pure enough + var/turf/open/creation = location_created + do_sparks(5,FALSE,M) + do_teleport(M, creation, 0, asoundin = 'sound/effects/phasein.ogg') + do_sparks(5,FALSE,M) + if(prob(20)) + do_sparks(5,FALSE,M) + ..() + +/datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location + do_sparks(5,FALSE,M) + to_chat(M, "You feel your wavefunction collapse!") + do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home + do_sparks(5,FALSE,M) + ..() + +/datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly + . = ..() + to_chat(M, "Oh god, you feel like your wavefunction is about to tear.") + M.Jitter(10) + +/datum/reagent/fermi/eigenstate/overdose_process(mob/living/M) //Overdose, makes you teleport randomly, probably one of my favourite effects. Sometimes kills you. + do_sparks(5,FALSE,src) + do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') + do_sparks(5,FALSE,src) + M.reagents.remove_reagent(id, 0.5)//So you're not stuck for 10 minutes teleporting + ..() + +//Addiction +/datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride. + switch(addictCyc1) + if(1) + to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") + M.Jitter(10) + M.nutrition = M.nutrition - (M.nutrition/15) + addictCyc1++ + ..() + +/datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M) + switch(addictCyc2) + if(0) + to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") + M.Jitter(50) + M.Knockdown(100) + M.Stun(40) + + var/items = M.get_contents() + if(!LAZYLEN(items)) + return ..() + var/obj/item/I = pick(items) + M.dropItemToGround(I, TRUE) + do_sparks(5,FALSE,I) + do_teleport(I, get_turf(I), 5, no_effects=TRUE); + do_sparks(5,FALSE,I) + addictCyc2++ + ..() + +/datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! + + //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in + switch(addictCyc3) + if(0) + M.Jitter(100) + to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the eigenstate event horizon.") + if(1) + var/typepath = M.type + fermi_Tclone = new typepath(M.loc) + var/mob/living/carbon/C = fermi_Tclone + fermi_Tclone.appearance = M.appearance + C.real_name = M.real_name + M.visible_message("[M] collapses in from an alternative reality!") + do_teleport(C, get_turf(C), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! + do_sparks(5,FALSE,C) + C.emote("spin") + M.emote("spin") + M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) + C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! O� suis-je?!", "Yee haw! This is one hell of a hootenanny!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "I've come from the future to warn you to not take eigenstasium! Oh no! I'm too late!", "You fool! You took too much eigenstasium! You've doomed us all!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Fermichem was a mistake", "This is one hell of a beepsky smash.", "Now neither of us will be virgins!")]\"") + if(2) + var/mob/living/carbon/C = fermi_Tclone + do_sparks(5,FALSE,C) + qdel(C) //Deletes CLONE, or at least I hope it is. + M.visible_message("[M] is snapped across to a different alternative reality!") + addictCyc3 = 0 //counter + fermi_Tclone = null + addictCyc3++ + do_teleport(M, get_turf(M), 2, no_effects=TRUE) //Teleports player randomly + do_sparks(5,FALSE,M) + ..() + +/datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. + if(addictCyc4 == 0) + do_sparks(5,FALSE,M) + do_teleport(M, get_turf(M), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! + do_sparks(5,FALSE,M) + M.Sleeping(50, 0) + M.Jitter(50) + M.Knockdown(0) + to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") + M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) + M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) + for(var/datum/mood_event/Me in M) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, Me) //Why does this not work? + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) + + + if(prob(20)) + do_sparks(5,FALSE,M) + addictCyc4++ + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[id]_overdose")//holdover until above fix works + ..() + +//eigenstate END diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm new file mode 100644 index 0000000000..c4b819f2fe --- /dev/null +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -0,0 +1,286 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////// +// BREAST ENLARGE +/////////////////////////////////////////////////////////////////////////////////////////////////// +//Other files that are relivant: +//modular_citadel/code/datums/status_effects/chems.dm +//modular_citadel/code/modules/arousal/organs/breasts.dm + +//breast englargement +//Honestly the most requested chems +//I'm not a very kinky person, sorry if it's not great +//I tried to make it interesting..!! + +//Normal function increases your breast size by 0.1, 5units = 1 cup. +//If you get stupid big, it presses against your clothes, causing brute and oxydamage. Then rips them off. +//If you keep going, it makes you slower, in speed and action. +//decreasing your size will return you to normal. +//(see the status effect in chem.dm) +//Overdosing on (what is essentially space estrogen) makes you female, removes balls and shrinks your dick. +//OD is low for a reason. I'd like fermichems to have low ODs, and dangerous ODs, and since this is a meme chem that everyone will rush to make, it'll be a lesson learnt early. + +/datum/reagent/fermi/breast_enlarger + name = "Sucubus milk" + id = "breast_enlarger" + description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." + color = "#E60584" // rgb: 96, 0, 255 + taste_description = "a milky ice cream like flavour." + overdose_threshold = 12 + metabolization_rate = 0.5 + ImpureChem = "BEsmaller" //If you make an inpure chem, it stalls growth + InverseChemVal = 0.3 + InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse + +/datum/reagent/fermi/breast_enlarger/on_mob_add(mob/living/carbon/M) + . = ..() + if(!ishuman(M)) //The monkey clause + if(volume >= 15) //To prevent monkey breast farms + var/turf/T = get_turf(M) + var/obj/item/organ/genital/breasts/B = new /obj/item/organ/genital/breasts(T) + var/list/seen = viewers(8, T) + for(var/mob/S in seen) + to_chat(S, "A pair of breasts suddenly fly out of the [M]!") + //var/turf/T2 = pick(turf in view(5, M)) + var/T2 = get_random_station_turf() + M.adjustBruteLoss(25) + M.Knockdown(50) + M.Stun(50) + B.throw_at(T2, 8, 1) + M.reagents.remove_reagent(id, volume) + return + var/mob/living/carbon/human/H = M + H.genital_override = TRUE + var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") + if(!B) + H.emergent_genital_call() + return + if(!B.size == "huge") + var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) + B.prev_size = B.size + B.cached_size = sizeConv[B.size] + +/datum/reagent/fermi/breast_enlarger/on_mob_life(mob/living/carbon/M) //Increases breast size + if(!ishuman(M))//Just in case + return..() + + var/mob/living/carbon/human/H = M + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + if(!B) //If they don't have breasts, give them breasts. + + //If they have Acute hepatic pharmacokinesis, then route processing though liver. + if(M.has_trait(TRAIT_PHARMA)) + var/obj/item/organ/liver/L = M.getorganslot("liver") + L.swelling+= 0.1 + return..() + + //otherwise proceed as normal + var/obj/item/organ/genital/breasts/nB = new + nB.Insert(M) + if(nB) + if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) + nB.color = skintone2hex(H.skin_tone) + else if(M.dna.features["breasts_color"]) + nB.color = "#[M.dna.features["breasts_color"]]" + else + nB.color = skintone2hex(H.skin_tone) + nB.size = "flat" + nB.cached_size = 0 + nB.prev_size = 0 + to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") + M.reagents.remove_reagent(id, 5) + B = nB + //If they have them, increase size. If size is comically big, limit movement and rip clothes. + B.cached_size = B.cached_size + 0.1 + if (B.cached_size >= 8.5 && B.cached_size < 9) + if(H.w_uniform || H.wear_suit) + var/target = M.get_bodypart(BODY_ZONE_CHEST) + to_chat(M, "Your breasts begin to strain against your clothes tightly!") + M.adjustOxyLoss(10, 0) + M.apply_damage(2, BRUTE, target) + B.update() + ..() + +/datum/reagent/fermi/breast_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. + + //Acute hepatic pharmacokinesis. + if(M.has_trait(TRAIT_PHARMA)) + var/obj/item/organ/liver/L = M.getorganslot("liver") + L.swelling+= 0.05 + return ..() + + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") + var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") + var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") + var/obj/item/organ/genital/womb/W = M.getorganslot("womb") + + if(M.gender == MALE) + M.gender = FEMALE + M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") + + if(P) + P.cached_length = P.cached_length - 0.1 + P.update() + if(T) + T.Remove(M) + if(!V) + var/obj/item/organ/genital/vagina/nV = new + nV.Insert(M) + V = nV + if(!W) + var/obj/item/organ/genital/womb/nW = new + nW.Insert(M) + W = nW + ..() + +/datum/reagent/fermi/BEsmaller + name = "Sucubus milk" + id = "BEsmaller" + description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." + color = "#E60584" // rgb: 96, 0, 255 + taste_description = "a milky ice cream like flavour." + metabolization_rate = 0.5 + +/datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M) + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + if(!B) + //Acute hepatic pharmacokinesis. + if(M.has_trait(TRAIT_PHARMA)) + var/obj/item/organ/liver/L = M.getorganslot("liver") + L.swelling-= 0.1 + return ..() + + //otherwise proceed as normal + return..() + B.cached_size = B.cached_size - 0.1 + B.update() + ..() + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// PENIS ENLARGE +/////////////////////////////////////////////////////////////////////////////////////////////////// +//See breast explanation, it's the same but with taliwhackers +//instead of slower movement and attacks, it slows you and increases the total blood you need in your system. +//Since someone else made this in the time it took me to PR it, I merged them. +/datum/reagent/fermi/penis_enlarger // Due to popular demand...! + name = "Incubus draft" + id = "penis_enlarger" + description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? dumb + color = "#888888" // This is greyish..? + taste_description = "chinese dragon powder" + overdose_threshold = 12 //ODing makes you male and removes female genitals + metabolization_rate = 0.5 + ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth + InverseChemVal = 0.3 + InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse and shrinks instead. + +/datum/reagent/fermi/penis_enlarger/on_mob_add(mob/living/carbon/M) + . = ..() + if(!ishuman(M)) //Just monkeying around. + if(volume >= 15) //to prevent monkey penis farms + var/turf/T = get_turf(M) + var/obj/item/organ/genital/penis/P = new /obj/item/organ/genital/penis(T) + var/list/seen = viewers(8, T) + for(var/mob/S in seen) + to_chat(S, "A penis suddenly flies out of the [M]!") + var/T2 = get_random_station_turf() + M.adjustBruteLoss(25) + M.Knockdown(50) + M.Stun(50) + P.throw_at(T2, 8, 1) + M.reagents.remove_reagent(id, volume) + return + var/mob/living/carbon/human/H = M + H.genital_override = TRUE + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") + if(!P) + H.emergent_genital_call() + return + P.prev_length = P.length + P.cached_length = P.length + +/datum/reagent/fermi/penis_enlarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch. + if(!ishuman(M)) + return + var/mob/living/carbon/human/H = M + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") + if(!P)//They do have a preponderance for escapism, or so I've heard. + + //If they have Acute hepatic pharmacokinesis, then route processing though liver. + if(M.has_trait(TRAIT_PHARMA)) + var/obj/item/organ/liver/L = M.getorganslot("liver") + L.swelling+= 0.1 + return..() + + //otherwise proceed as normal + var/obj/item/organ/genital/penis/nP = new + nP.Insert(M) + if(nP) + nP.length = 1 + to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.") + nP.cached_length = 1 + nP.prev_length = 1 + M.reagents.remove_reagent(id, 5) + P = nP + + P.cached_length = P.cached_length + 0.1 + if (P.cached_length >= 20.5 && P.cached_length < 21) + if(H.w_uniform || H.wear_suit) + var/target = M.get_bodypart(BODY_ZONE_CHEST) + to_chat(M, "Your cock begin to strain against your clothes tightly!") + M.apply_damage(5, BRUTE, target) + + P.update() + ..() + +/datum/reagent/fermi/penis_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. + //Acute hepatic pharmacokinesis. + if(M.has_trait(TRAIT_PHARMA)) + var/obj/item/organ/liver/L = M.getorganslot("liver") + L.swelling+= 0.05 + return..() + + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") + var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") + var/obj/item/organ/genital/womb/W = M.getorganslot("womb") + + if(M.gender == FEMALE) + M.gender = MALE + M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") + + if(B) + B.cached_size = B.cached_size - 0.1 + B.update() + if(V) + V.Remove(M) + if(W) + W.Remove(M) + if(!T) + var/obj/item/organ/genital/testicles/nT = new + nT.Insert(M) + T = nT + ..() + +/datum/reagent/fermi/PEsmaller // Due to cozmo's request...! + name = "Incubus draft" + id = "PEsmaller" + description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? dumb + color = "#888888" // This is greyish..? + taste_description = "chinese dragon powder" + metabolization_rate = 0.5 + +/datum/reagent/fermi/PEsmaller/on_mob_life(mob/living/carbon/M) + var/mob/living/carbon/human/H = M + var/obj/item/organ/genital/penis/P = H.getorganslot("penis") + if(!P) + //Acute hepatic pharmacokinesis. + if(M.has_trait(TRAIT_PHARMA)) + var/obj/item/organ/liver/L = M.getorganslot("liver") + L.swelling-= 0.1 + return..() + + //otherwise proceed as normal + return..() + P.cached_length = P.cached_length - 0.1 + P.update() + ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 5601b7d97f..392a22fd16 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -5,10 +5,6 @@ name = "Fermi" //This should never exist, but it does so that it can exist in the case of errors.. id = "fermi" taste_description = "affection and love!" - var/ImpureChem = "fermiTox" // What chemical is metabolised with an inpure reaction - var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising - var/InverseChem = "fermiTox" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. - var/DoNotSplit = FALSE // If impurity is handled within the main chem itself //This should process fermichems to find out how pure they are and what effect to do. /datum/reagent/fermi/on_mob_add(mob/living/carbon/M, amount) @@ -56,1170 +52,6 @@ return -//////////////////////////////////////////////////////////////////////////////////////////////////// -// EIGENSTASIUM -/////////////////////////////////////////////////////////////////////////////////////////////////// -//eigenstate Chem -//Teleports you to chemistry and back -//OD teleports you randomly around the Station -//Addiction send you on a wild ride and replaces you with an alternative reality version of yourself. -//During the process you get really hungry, then your items start teleporting randomly, -//then alternative versions of yourself are brought in from a different universe and they yell at you. -//and finally you yourself get teleported to an alternative universe, and character your playing is replaced with said alternative - -/datum/reagent/fermi/eigenstate - name = "Eigenstasium" - id = "eigenstate" - description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" - taste_description = "wiggly cosmic dust." - color = "#5020H4" // rgb: 50, 20, 255 - overdose_threshold = 15 - addiction_threshold = 15 - metabolization_rate = 0.5 * REAGENTS_METABOLISM - addiction_stage2_end = 30 - addiction_stage3_end = 41 - addiction_stage4_end = 44 //Incase it's too long - var/location_created - var/turf/open/location_return = null - var/addictCyc1 = 0 - var/addictCyc2 = 0 - var/addictCyc3 = 0 - var/addictCyc4 = 0 - var/mob/living/fermi_Tclone = null - var/teleBool = FALSE - pH = 3.7 - -//Main functions -/datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! - switch(current_cycle) - if(0) - location_return = get_turf(M) //sets up return point - to_chat(M, "You feel your wavefunction split!") - if(purity > 0.75) //Teleports you home if it's pure enough - var/turf/open/creation = location_created - do_sparks(5,FALSE,M) - do_teleport(M, creation, 0, asoundin = 'sound/effects/phasein.ogg') - do_sparks(5,FALSE,M) - if(prob(20)) - do_sparks(5,FALSE,M) - ..() - -/datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location - do_sparks(5,FALSE,M) - to_chat(M, "You feel your wavefunction collapse!") - do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home - do_sparks(5,FALSE,M) - ..() - -/datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly - . = ..() - to_chat(M, "Oh god, you feel like your wavefunction is about to tear.") - M.Jitter(10) - -/datum/reagent/fermi/eigenstate/overdose_process(mob/living/M) //Overdose, makes you teleport randomly, probably one of my favourite effects. Sometimes kills you. - do_sparks(5,FALSE,src) - do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') - do_sparks(5,FALSE,src) - M.reagents.remove_reagent(id, 0.5)//So you're not stuck for 10 minutes teleporting - ..() - -//Addiction -/datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride. - switch(addictCyc1) - if(1) - to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") - M.Jitter(10) - M.nutrition = M.nutrition - (M.nutrition/15) - addictCyc1++ - ..() - -/datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M) - switch(addictCyc2) - if(0) - to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") - M.Jitter(50) - M.Knockdown(100) - M.Stun(40) - - var/items = M.get_contents() - if(!LAZYLEN(items)) - return ..() - var/obj/item/I = pick(items) - M.dropItemToGround(I, TRUE) - do_sparks(5,FALSE,I) - do_teleport(I, get_turf(I), 5, no_effects=TRUE); - do_sparks(5,FALSE,I) - addictCyc2++ - ..() - -/datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! - - //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in - switch(addictCyc3) - if(0) - M.Jitter(100) - to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the eigenstate event horizon.") - if(1) - var/typepath = M.type - fermi_Tclone = new typepath(M.loc) - var/mob/living/carbon/C = fermi_Tclone - fermi_Tclone.appearance = M.appearance - C.real_name = M.real_name - M.visible_message("[M] collapses in from an alternative reality!") - do_teleport(C, get_turf(C), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! - do_sparks(5,FALSE,C) - C.emote("spin") - M.emote("spin") - M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) - C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! O� suis-je?!", "Yee haw! This is one hell of a hootenanny!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "I've come from the future to warn you to not take eigenstasium! Oh no! I'm too late!", "You fool! You took too much eigenstasium! You've doomed us all!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Fermichem was a mistake", "This is one hell of a beepsky smash.", "Now neither of us will be virgins!")]\"") - if(2) - var/mob/living/carbon/C = fermi_Tclone - do_sparks(5,FALSE,C) - qdel(C) //Deletes CLONE, or at least I hope it is. - M.visible_message("[M] is snapped across to a different alternative reality!") - addictCyc3 = 0 //counter - fermi_Tclone = null - addictCyc3++ - do_teleport(M, get_turf(M), 2, no_effects=TRUE) //Teleports player randomly - do_sparks(5,FALSE,M) - ..() - -/datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. - if(addictCyc4 == 0) - do_sparks(5,FALSE,M) - do_teleport(M, get_turf(M), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! - do_sparks(5,FALSE,M) - M.Sleeping(50, 0) - M.Jitter(50) - M.Knockdown(0) - to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") - M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) - M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) - for(var/datum/mood_event/Me in M) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, Me) //Why does this not work? - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) - - - if(prob(20)) - do_sparks(5,FALSE,M) - addictCyc4++ - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[id]_overdose")//holdover until above fix works - ..() - -//eigenstate END - -/*SDGF -//////////////////////////////////////////////////// -// synthetic-derived growth factor // -////////////////////////////////////////////////// -other files that are relivant: -modular_citadel/code/datums/status_effects/chems.dm - SDGF -WHAT IT DOES - -Several outcomes are possible (in priority order): - -Before the chem is even created, there is a risk of the reaction "exploding", which produces an angry teratoma that attacks the player. -0. Before the chem is activated, the purity is checked, if the purity of the reagent is less than 0.5, then sythetic-derived zombie factor is metabolised instead - 0.1 If SDZF is injected, the chem appears to act the same as normal, with nutrition gain, until the end, where it becomes toxic instead, giving a short window of warning to the player - 0.1.2 If the player can take pent in time, the player will spawn a hostile teratoma on them (less damaging), if they don't, then a zombie is spawned instead, with a small defence increase propotional to the volume - 0.2 If the purity is above 0.5, then the remaining impure volume created SDGFtox instead, which reduces blood volume and causes clone damage -1.Normal function creates a (another)player controlled clone of the player, which is spawned nude, with damage to the clone - 1.1 The remaining volume is transferred to the clone, which heals it over time, thus the player has to make a substantial ammount of the chem in order to produce a healthy clone - 1.2 If the player is infected with a zombie tumor, the tumor is transferred to the ghost controlled clone ONLY. -2. If no player can be found, a brainless clone is created over a long period of time, this body has no controller. - 2.1 If the player dies with a clone, then they play as the clone instead. However no memories are retained after splitting. -3. If there is already a clone, then SDGF heals clone, fire and brute damage slowly. This shouldn't normalise this chem as the de facto clone healing chem, as it will always try to make a ghost clone, and then a brainless clone first. -4. If there is insuffient volume to complete the cloning process, there are two outcomes - 4.1 At lower volumes, the players nutrition and blood is refunded, with light healing - 4.2 At higher volumes a stronger heal is applied to the user - -IMPORTANT FACTORS TO CONSIDER WHILE BALANCING -1. The most important factor is the required volume, this is easily edited with the metabolism rate, this chem is HARD TO MAKE, You need to make a lot of it and it's a substantial effort on the players part. There is also a substantial risk; you could spawn a hotile teratoma during the reation, you could damage yourself with clone damage, you could accidentally spawn a zombie... Basically, you've a good chance of killing yourself. - 1.1 Additionally, if you're trying to make SDZF purposely, you've no idea if you have or not, and that reaction is even harder to do. Plus, the player has a huge time window to get to medical to deal with it. If you take pent while it's in you, it'll be removed before it can spawn, and only spawns a teratoma if it's late stage. -2. The rate in which the clone is made, This thing takes time to produce fruits, it slows you down and makes you useless in combat/working. Basically you can't do anything during it. It will only get you killed if you use it in combat, If you do use it and you spawn a player clone, they're gimped for a long time, as they have to heal off the clone damage. -3. The healing - it's pretty low and a cyropod is more Useful -4. If you're an antag, you've a 50% chance of making a clone that will help you with your efforts, and you've no idea if they will or not. While clones can't directly harm you and care for you, they can hinder your efforts. -5. If people are being arses when they're a clone, slap them for it, they are told to NOT bugger around with someone else character, if it gets bad I'll add a blacklist, or do a check to see if you've played X amount of hours. - 5.1 Another solution I'm okay with is to rename the clone to [M]'s clone, so it's obvious, this obviously ruins anyone trying to clone themselves to get an alibi however. I'd prefer this to not be the case. - 5.2 Additionally, this chem is a soft buff to changelings, which apparently need a buff! - 5.3 Other similar things exist already though in the codebase; impostors, split personalites, abductors, ect. -6. Giving this to someone without concent is against space law and gets you sent to gulag. -*/ - -//Clone serum #chemClone -/datum/reagent/fermi/SDGF //vars, mostly only care about keeping track if there's a player in the clone or not. - name = "synthetic-derived growth factor" - id = "SDGF" - description = "A rapidly diving mass of Embryonic stem cells. These cells are missing a nucleus and quickly replicate a host’s DNA before growing to form an almost perfect clone of the host. In some cases neural replication takes longer, though the underlying reason underneath has yet to be determined." - color = "#60A584" // rgb: 96, 0, 255 - var/playerClone = FALSE - var/unitCheck = FALSE - metabolization_rate = 0.5 * REAGENTS_METABOLISM - //var/datum/status_effect/chem/SDGF/candidates/candies - var/list/candies = list() - //var/polling = FALSE - var/list/result = list() - var/list/group = null - var/pollStarted = FALSE - var/location_created - var/startHunger - ImpureChem = "SDGFtox" - InverseChemVal = 0.5 - InverseChem = "SDZF" - -//Main SDGF chemical -/datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. - //Setup clone - switch(current_cycle) - if(1) - startHunger = M.nutrition - if(pollStarted == FALSE) - pollStarted = TRUE - candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") - if(20 to INFINITY) - if(LAZYLEN(candies) && playerClone == FALSE) //If there's candidates, clone the person and put them in there! - message_admins("Ghost candidate found! [candies] is becoming a clone of [M]! Hee~!! Exciting!!") - to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") - var/typepath = M.type - var/mob/living/carbon/human/fermi_Gclone = new typepath(M.loc) - var/mob/living/carbon/human/SM = fermi_Gclone - if(istype(SM) && istype(M)) - SM.real_name = M.real_name - M.dna.transfer_identity(SM) - SM.updateappearance(mutcolor_update=1) - var/mob/dead/observer/C = pick(candies) - SM.key = C.key - SM.mind.enslave_mind_to_creator(M) - - //If they're a zombie, they can try to negate it with this. - //I seriously wonder if anyone will ever use this function. - if(M.getorganslot(ORGAN_SLOT_ZOMBIE))//sure, it "treats" it, but "you've" still got it. Doesn't always work as well; needs a ghost. - var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE) - ZI.Remove(M) - ZI.Insert(SM) - - to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") - to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") - to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") - M.visible_message("[M] suddenly shudders, and splits into two identical twins!") - SM.copy_known_languages_from(M, FALSE) - playerClone = TRUE - M.next_move_modifier = 1 - M.nutrition -= 500 - - //Damage the clone - SM.blood_volume = (BLOOD_VOLUME_NORMAL*SM.blood_ratio)/2 - SM.adjustCloneLoss(60, 0) - SM.setBrainLoss(40) - SM.nutrition = startHunger/2 - - //Transfer remaining reagent to clone. I think around 30u will make a healthy clone, otherwise they'll have clone damage, blood loss, brain damage and hunger. - SM.reagents.add_reagent("SDGFheal", volume) - M.reagents.remove_reagent(id, volume) - return - - else if(playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). - unitCheck = TRUE - if(M.has_status_effect(/datum/status_effect/chem/SGDF)) // Heal the user if they went to all this trouble to make it and can't get a clone, the poor fellow. - switch(current_cycle) - if(21) - to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). - M.remove_trait(TRAIT_DISFIGURED, TRAIT_GENERIC) - if(22 to INFINITY) - M.adjustCloneLoss(-1, 0) - M.adjustBruteLoss(-1, 0) - M.adjustFireLoss(-1, 0) - M.heal_bodypart_damage(1,1) - M.reagents.remove_reagent(id, 1)//faster rate of loss. - else //If there's no ghosts, but they've made a large amount, then proceed to make flavourful clone, where you become fat and useless until you split. - switch(current_cycle) - if(21) - to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") - if(22 to 29) - M.nutrition = M.nutrition + (M.nutrition/10) - if(30) - to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") - if(31 to 49) - M.nutrition = M.nutrition + (M.nutrition/5) - if(50) - to_chat(M, "The synthetic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") - M.next_move_modifier += 4//If this makes you fast then please fix it, it should make you slow!! - //candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies - if(51 to 79) - M.nutrition = M.nutrition + (M.nutrition/2) - if(80) - to_chat(M, "The cells begin to precipitate outwards of your body, you feel like you'll split soon...") - if (M.nutrition < 20000) - M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI - if(86)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. - M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE - M.next_move_modifier -= 4 - to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") - M.apply_status_effect(/datum/status_effect/chem/SGDF) - if(87 to INFINITY) - M.reagents.remove_reagent(id, volume)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. - - - ..() - -/datum/reagent/fermi/SDGF/on_mob_delete(mob/living/M) //When the chem is removed, a few things can happen, mostly consolation prizes. - pollStarted = FALSE - if (playerClone == TRUE)//If the player made a clone with it, then thats all they get. - playerClone = FALSE - return - if (M.next_move_modifier == 4 && !M.has_status_effect(/datum/status_effect/chem/SGDF))//checks if they're ingested over 20u of the stuff, but fell short of the required 30u to make a clone. - to_chat(M, "You feel the cells begin to merge with your body, unable to reach nucleation, they instead merge with your body, healing any wounds.") - M.adjustCloneLoss(-10, 0) //I don't want to make Rezadone obsolete. - M.adjustBruteLoss(-25, 0)// Note that this takes a long time to apply and makes you fat and useless when it's in you, I don't think this small burst of healing will be useful considering how long it takes to get there. - M.adjustFireLoss(-25, 0) - M.blood_volume += 250 - M.heal_bodypart_damage(1,1) - M.next_move_modifier = 1 - if (M.nutrition < 1500) - M.nutrition += 250 - else if (unitCheck == TRUE && !M.has_status_effect(/datum/status_effect/chem/SGDF))// If they're ingested a little bit (10u minimum), then give them a little healing. - unitCheck = FALSE - to_chat(M, "the cells fail to hold enough mass to generate a clone, instead diffusing into your system.") - M.adjustBruteLoss(-10, 0) - M.adjustFireLoss(-10, 0) - M.blood_volume += 100 - M.next_move_modifier = 1 - if (M.nutrition < 1500) - M.nutrition += 500 - -//Unobtainable, used in clone spawn. -/datum/reagent/fermi/SDGFheal - name = "synthetic-derived growth factor" - id = "SDGFheal" - metabolization_rate = 1 - -/datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) - if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) - M.blood_volume += 10 - M.adjustCloneLoss(-2, 0) - M.setBrainLoss(-1) - M.nutrition += 10 - ..() - -//Unobtainable, used if SDGF is impure but not too impure -/datum/reagent/fermi/SDGFtox - name = "synthetic-derived growth factor" - id = "SDGFtox" - description = "A chem that makes Fermis angry at you if you're reading this, how did you get this???" - metabolization_rate = 1 - -/datum/reagent/fermi/SDGFtox/on_mob_life(mob/living/carbon/M)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good) - M.blood_volume -= 10 - M.adjustCloneLoss(2, 0) - ..() - -//Fail state of SDGF -/datum/reagent/fermi/SDZF - name = "synthetic-derived growth factor" - id = "SDZF" - description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" - color = "#60A584" // rgb: 96, 0, 255 - metabolization_rate = 0.5 * REAGENTS_METABOLISM - var/startHunger - -/datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. - switch(current_cycle)//Pretends to be normal - if(20) - to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") - startHunger = M.nutrition - if(21 to 29) - M.nutrition = M.nutrition + (M.nutrition/10) - if(30) - to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") - if(31 to 49) - M.nutrition = M.nutrition + (M.nutrition/5) - if(50) - to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") - M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! - if(51 to 73) - M.nutrition = M.nutrition + (M.nutrition/2) - if(74) - to_chat(M, "The cells begin to precipitate outwards of your body, but... something is wrong, the sythetic cells are beginnning to rot...") - if (M.nutrition < 20000) //whoever knows the maxcap, please let me know, this seems a bit low. - M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI - if(75 to 85) - M.adjustToxLoss(1, 0)// the warning! - if(86)//mean clone time! - if (!M.reagents.has_reagent("pen_acid"))//Counterplay is pent.) - message_admins("(non-infectious) Zombie spawned at [M.loc], produced by impure chem, wah!") - M.nutrition = startHunger - 500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE - M.next_move_modifier = 1 - to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") - M.visible_message("[M] suddenly shudders, and splits into a funky smelling copy of themselves!") - M.emote("scream") - M.adjustToxLoss(30, 0) - var/mob/living/simple_animal/hostile/unemployedclone/ZI = new(get_turf(M.loc)) - ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - ZI.real_name = M.real_name//Give your offspring a big old kiss. - ZI.name = M.real_name - ZI.desc = "[M]'s clone, gone horribly wrong." - - M.reagents.remove_reagent(id, 20) - else//easier to deal with - to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour!") - M.nutrition = startHunger - 500 - var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") //TODO: replace slime as own simplemob/add tumour slime cores for science/chemistry interplay - S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - S.name = "Living teratoma" - S.real_name = "Living teratoma"//horrifying!! - S.rabid = 1//Make them an angery boi - //S.updateappearance(mutcolor_update=1) - M.reagents.remove_reagent(id, volume) - to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") - if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. TODO: turn tumour slime into real variant. - M.adjustToxLoss(1, 0) - ..() - -//////////////////////////////////////////////////////////////////////////////////////////////////// -// BREAST ENLARGE -/////////////////////////////////////////////////////////////////////////////////////////////////// -//Other files that are relivant: -//modular_citadel/code/datums/status_effects/chems.dm -//modular_citadel/code/modules/arousal/organs/breasts.dm - -//breast englargement -//Honestly the most requested chems -//I'm not a very kinky person, sorry if it's not great -//I tried to make it interesting..!! - -//Normal function increases your breast size by 0.1, 5units = 1 cup. -//If you get stupid big, it presses against your clothes, causing brute and oxydamage. Then rips them off. -//If you keep going, it makes you slower, in speed and action. -//decreasing your size will return you to normal. -//(see the status effect in chem.dm) -//Overdosing on (what is essentially space estrogen) makes you female, removes balls and shrinks your dick. -//OD is low for a reason. I'd like fermichems to have low ODs, and dangerous ODs, and since this is a meme chem that everyone will rush to make, it'll be a lesson learnt early. - -/datum/reagent/fermi/breast_enlarger - name = "Sucubus milk" - id = "breast_enlarger" - description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." - color = "#E60584" // rgb: 96, 0, 255 - taste_description = "a milky ice cream like flavour." - overdose_threshold = 12 - metabolization_rate = 0.5 - ImpureChem = "BEsmaller" //If you make an inpure chem, it stalls growth - InverseChemVal = 0.3 - InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse - -/datum/reagent/fermi/breast_enlarger/on_mob_add(mob/living/carbon/M) - . = ..() - if(!ishuman(M)) //The monkey clause - if(volume >= 15) //To prevent monkey breast farms - var/turf/T = get_turf(M) - var/obj/item/organ/genital/breasts/B = new /obj/item/organ/genital/breasts(T) - var/list/seen = viewers(8, T) - for(var/mob/S in seen) - to_chat(S, "A pair of breasts suddenly fly out of the [M]!") - //var/turf/T2 = pick(turf in view(5, M)) - var/T2 = get_random_station_turf() - M.adjustBruteLoss(25) - M.Knockdown(50) - M.Stun(50) - B.throw_at(T2, 8, 1) - M.reagents.remove_reagent(id, volume) - return - var/mob/living/carbon/human/H = M - H.genital_override = TRUE - var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") - if(!B) - H.emergent_genital_call() - return - if(!B.size == "huge") - var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) - B.prev_size = B.size - B.cached_size = sizeConv[B.size] - -/datum/reagent/fermi/breast_enlarger/on_mob_life(mob/living/carbon/M) //Increases breast size - if(!ishuman(M))//Just in case - return..() - - var/mob/living/carbon/human/H = M - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - if(!B) //If they don't have breasts, give them breasts. - - //If they have Acute hepatic pharmacokinesis, then route processing though liver. - if(M.has_trait(TRAIT_PHARMA)) - var/obj/item/organ/liver/L = M.getorganslot("liver") - L.swelling+= 0.1 - return..() - - //otherwise proceed as normal - var/obj/item/organ/genital/breasts/nB = new - nB.Insert(M) - if(nB) - if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) - nB.color = skintone2hex(H.skin_tone) - else if(M.dna.features["breasts_color"]) - nB.color = "#[M.dna.features["breasts_color"]]" - else - nB.color = skintone2hex(H.skin_tone) - nB.size = "flat" - nB.cached_size = 0 - nB.prev_size = 0 - to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") - M.reagents.remove_reagent(id, 5) - B = nB - //If they have them, increase size. If size is comically big, limit movement and rip clothes. - B.cached_size = B.cached_size + 0.1 - if (B.cached_size >= 8.5 && B.cached_size < 9) - if(H.w_uniform || H.wear_suit) - var/target = M.get_bodypart(BODY_ZONE_CHEST) - to_chat(M, "Your breasts begin to strain against your clothes tightly!") - M.adjustOxyLoss(10, 0) - M.apply_damage(2, BRUTE, target) - B.update() - ..() - -/datum/reagent/fermi/breast_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. - - //Acute hepatic pharmacokinesis. - if(M.has_trait(TRAIT_PHARMA)) - var/obj/item/organ/liver/L = M.getorganslot("liver") - L.swelling+= 0.05 - return ..() - - var/obj/item/organ/genital/penis/P = M.getorganslot("penis") - var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") - var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") - var/obj/item/organ/genital/womb/W = M.getorganslot("womb") - - if(M.gender == MALE) - M.gender = FEMALE - M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") - - if(P) - P.cached_length = P.cached_length - 0.1 - P.update() - if(T) - T.Remove(M) - if(!V) - var/obj/item/organ/genital/vagina/nV = new - nV.Insert(M) - V = nV - if(!W) - var/obj/item/organ/genital/womb/nW = new - nW.Insert(M) - W = nW - ..() - -/datum/reagent/fermi/BEsmaller - name = "Sucubus milk" - id = "BEsmaller" - description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." - color = "#E60584" // rgb: 96, 0, 255 - taste_description = "a milky ice cream like flavour." - metabolization_rate = 0.5 - -/datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M) - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - if(!B) - //Acute hepatic pharmacokinesis. - if(M.has_trait(TRAIT_PHARMA)) - var/obj/item/organ/liver/L = M.getorganslot("liver") - L.swelling-= 0.1 - return ..() - - //otherwise proceed as normal - return..() - B.cached_size = B.cached_size - 0.1 - B.update() - ..() - - -//////////////////////////////////////////////////////////////////////////////////////////////////// -// PENIS ENLARGE -/////////////////////////////////////////////////////////////////////////////////////////////////// -//See breast explanation, it's the same but with taliwhackers -//instead of slower movement and attacks, it slows you and increases the total blood you need in your system. -//Since someone else made this in the time it took me to PR it, I merged them. -/datum/reagent/fermi/penis_enlarger // Due to popular demand...! - name = "Incubus draft" - id = "penis_enlarger" - description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? dumb - color = "#888888" // This is greyish..? - taste_description = "chinese dragon powder" - overdose_threshold = 12 //ODing makes you male and removes female genitals - metabolization_rate = 0.5 - ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth - InverseChemVal = 0.3 - InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse and shrinks instead. - -/datum/reagent/fermi/penis_enlarger/on_mob_add(mob/living/carbon/M) - . = ..() - if(!ishuman(M)) //Just monkeying around. - if(volume >= 15) //to prevent monkey penis farms - var/turf/T = get_turf(M) - var/obj/item/organ/genital/penis/P = new /obj/item/organ/genital/penis(T) - var/list/seen = viewers(8, T) - for(var/mob/S in seen) - to_chat(S, "A penis suddenly flies out of the [M]!") - var/T2 = get_random_station_turf() - M.adjustBruteLoss(25) - M.Knockdown(50) - M.Stun(50) - P.throw_at(T2, 8, 1) - M.reagents.remove_reagent(id, volume) - return - var/mob/living/carbon/human/H = M - H.genital_override = TRUE - var/obj/item/organ/genital/penis/P = M.getorganslot("penis") - if(!P) - H.emergent_genital_call() - return - P.prev_length = P.length - P.cached_length = P.length - -/datum/reagent/fermi/penis_enlarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch. - if(!ishuman(M)) - return - var/mob/living/carbon/human/H = M - var/obj/item/organ/genital/penis/P = M.getorganslot("penis") - if(!P)//They do have a preponderance for escapism, or so I've heard. - - //If they have Acute hepatic pharmacokinesis, then route processing though liver. - if(M.has_trait(TRAIT_PHARMA)) - var/obj/item/organ/liver/L = M.getorganslot("liver") - L.swelling+= 0.1 - return..() - - //otherwise proceed as normal - var/obj/item/organ/genital/penis/nP = new - nP.Insert(M) - if(nP) - nP.length = 1 - to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.") - nP.cached_length = 1 - nP.prev_length = 1 - M.reagents.remove_reagent(id, 5) - P = nP - - P.cached_length = P.cached_length + 0.1 - if (P.cached_length >= 20.5 && P.cached_length < 21) - if(H.w_uniform || H.wear_suit) - var/target = M.get_bodypart(BODY_ZONE_CHEST) - to_chat(M, "Your cock begin to strain against your clothes tightly!") - M.apply_damage(5, BRUTE, target) - - P.update() - ..() - -/datum/reagent/fermi/penis_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. - //Acute hepatic pharmacokinesis. - if(M.has_trait(TRAIT_PHARMA)) - var/obj/item/organ/liver/L = M.getorganslot("liver") - L.swelling+= 0.05 - return..() - - var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") - var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") - var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina") - var/obj/item/organ/genital/womb/W = M.getorganslot("womb") - - if(M.gender == FEMALE) - M.gender = MALE - M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") - - if(B) - B.cached_size = B.cached_size - 0.1 - B.update() - if(V) - V.Remove(M) - if(W) - W.Remove(M) - if(!T) - var/obj/item/organ/genital/testicles/nT = new - nT.Insert(M) - T = nT - ..() - -/datum/reagent/fermi/PEsmaller // Due to cozmo's request...! - name = "Incubus draft" - id = "PEsmaller" - description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? dumb - color = "#888888" // This is greyish..? - taste_description = "chinese dragon powder" - metabolization_rate = 0.5 - -/datum/reagent/fermi/PEsmaller/on_mob_life(mob/living/carbon/M) - var/mob/living/carbon/human/H = M - var/obj/item/organ/genital/penis/P = H.getorganslot("penis") - if(!P) - //Acute hepatic pharmacokinesis. - if(M.has_trait(TRAIT_PHARMA)) - var/obj/item/organ/liver/L = M.getorganslot("liver") - L.swelling-= 0.1 - return..() - - //otherwise proceed as normal - return..() - P.cached_length = P.cached_length - 0.1 - P.update() - ..() -/* -//////////////////////////////////////////////////////////////////////////////////////////////////// -// ASTROGEN -/////////////////////////////////////////////////////////////////////////////////////////////////// -More fun chems! -When you take it, it spawns a ghost that the player controls. (No access to deadchat) -This ghost moves pretty quickly and is mostly invisible, but is still visible for people with eyes. -When it's out of your system, you return back to yourself. It doesn't last long and metabolism of the chem is exponential. -Addiction is particularlly brutal, it slowly turns you invisible with flavour text, then kills you at a low enough alpha. (i've also added something to prevent geneticists speeding this up) -There's afairly major catch regarding the death though. I'm not gonna say here, go read the code, it explains it and puts my comments on it in context. I know that anyone reading it without understanding it is going to freak out so, this is my attempt to get you to read it and understand it. -I'd like to point out from my calculations it'll take about 60-80 minutes to die this way too. Plenty of time to visit me and ask for some pills to quench your addiction. -*/ - -/datum/reagent/fermi/astral // Gives you the ability to astral project for a moment! - name = "Astrogen" - id = "astral" - description = "An opalescent murky liquid that is said to distort your soul from your being." - color = "#A080H4" // rgb: , 0, 255 - taste_description = "velvety brambles" - metabolization_rate = 0//Removal is exponential, see code - overdose_threshold = 20 - addiction_threshold = 24.5 - addiction_stage1_end = 9999//Should never end. There is no escape make your time - var/mob/living/carbon/origin - var/mob/living/simple_animal/hostile/retaliate/ghost/G = null - var/antiGenetics = 255 - var/sleepytime = 0 - InverseChemVal = 0.25 - -/datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! - M.alpha = 255 - switch(current_cycle) - if(0)//Require a minimum - origin = M - if (G == null) - G = new(get_turf(M.loc)) - G.attacktext = "raises the hairs on the neck of" - G.response_harm = "disrupts the concentration of" - G.response_disarm = "wafts" - G.loot = null - G.maxHealth = 5 - G.health = 5 - G.melee_damage_lower = 0 - G.melee_damage_upper = 0 - G.deathmessage = "disappears as if it was never really there to begin with" - G.incorporeal_move = 1 - G.alpha = 35 - G.name = "[M]'s astral projection" - M.mind.transfer_to(G) - sleepytime = 15*volume - if(overdosed) - if(prob(50)) - to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") - do_teleport(G, M.loc) - M.reagents.remove_reagent(id, current_cycle/2, FALSE) - ..() - -/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) - G.mind.transfer_to(origin) - qdel(G) - if(overdosed) - to_chat(M, "The high volume of Astrogren you just took causes you to black out momentarily as your mind snaps back to your body.") - M.Sleeping(sleepytime, 0) - antiGenetics = 255 - ..() - -//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. -/datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) - if(addiction_stage < 2) - antiGenetics = 255//Doesn't reset when you take more, which is weird for me, it should. - M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them. - if(prob(65)) - M.alpha-- - antiGenetics-- - switch(antiGenetics) - if(245) - to_chat(M, "You notice your body starting to disappear, maybe you took too much Astrogen...?") - M.alpha-- - antiGenetics-- - if(220) - to_chat(M, "Your addiction is only getting worse as your body disappears. Maybe you should get some more, and fast?") - M.alpha-- - antiGenetics-- - if(180) - to_chat(M, "You feel fear build up in yourself as more and more of your body and consciousness begins to fade.") - M.alpha-- - antiGenetics-- - if(120) - to_chat(M, "As you lose more and more of yourself, you start to think that maybe shedding your mortality isn't too bad.") - M.alpha-- - antiGenetics-- - if(100) - to_chat(M, "You feel a substantial part of your soul flake off into the ethereal world, rendering yourself unclonable.") - M.alpha-- - antiGenetics-- - M.add_trait(TRAIT_NOCLONE) //So you can't scan yourself, then die, to metacomm. You can only use your memories if you come back as something else. - if(80) - to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates your forthcoming oblivion.") - M.alpha-- - antiGenetics-- - if(45) - to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.") - M.alpha-- - antiGenetics-- - if(0 to 30) - to_chat(M, "Your body disperses from existence, as you become one with the universe.") - to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag, you do not remember the afterlife IC)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. - deadchat_broadcast("[M] has become one with the universe, meaning that their IC conciousness is continuous in a new life. If they find a way back to life, they are allowed to remember their previous life. Be careful what you say. If they abuse this, bwoink the FUCK outta them.") - M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") - message_admins("[M] (ckey: [M.ckey]) has become one with the universe, and have continuous memories thoughout their lives should they find a way to come back to life (such as an inteligence potion, midround antag, ghost role).") - qdel(M) //Approx 60minutes till death from initial addiction - ..() - -/* -//////////////////////////////////////// -// MKULTA // -//////////////////////////////////////// -The magnum opus of FermiChem - -Long and complicated, I highly recomend you look at the two other files heavily involved in this -modular_citadel/code/datums/status_effects/chems.dm - handles the subject's reactions -code/modules/surgery/organs/vocal_cords.dm - handles the enchanter speaking - -HOW IT WORKS -Fermis_Reagent.dm -There's 3 main ways this chemical works; I'll start off with discussing how it's set up. -Upon reacting with blood as a catalyst, the blood is used to define who the enthraller is - thus only the creator is/can choose who the master will be. As a side note, you can't adminbus this chem, even admins have to earn it. -This uses the fermichem only proc; FermiCreate, which is basically the same as On_new, except it doesn't require "data" which is something to do with blood and breaks everything so I said bugger it and made my own proc. It basically sets up vars. -When it's first made, the creator has to drink some of it, in order to give them the vocal chords needed. -When it's given to someone, it gives them the status effect and kicks off that side of things. For every metabolism tick, it increases the enthrall tally. -Finally, if you manage to pump 100u into some poor soul, you overload them, and mindbreak them. Making them your willing, but broken slave. Which can only be reversed by; fixing their brain with mannitol and neurine (100 / 50u respectively) (or less with both), - -vocal_cords.dm -This handles when the enchanter speaks - basically uses code from voice of god, but only for people with the staus effect. Most of the words are self explainitory, and has a smaller range of commands. If you're not sure what one does, it likely affects the enthrall tally, or the resist tally. -list of commands: - --mixables- -enthral_words -reward_words -punish_words -0 -saymyname_words -wakeup_words -1 -silence_words -antiresist_words -resist_words -forget_words -attract_words -orgasm_words -2 -awoo_words -nya_words -sleep_words -strip_words -walk_words -run_words -knockdown_words -3 -statecustom_words -custom_words -objective_words -heal_words -stun_words -hallucinate_words -hot_words -cold_words -getup_words -pacify_words -charge_words - -Mixables can be used intersperced with other commands, 0 is commands that work on sleeper against (i.e. players enthralled to state 3, then ordered to wake up and forget, they can be triggered back instantly) -1 is for players who immediately are injected with the chem - no stuns, only a silence and something that draws them towrds them. This is the best time to try to fight it and you're likely to win by spamming resist, unless the enchantress has plans. -2 is the seconds stage, which allows removal of clothes, slowdown and light stunning. You can also make them nya and awoo, because cute. -3 is the finaly state, which allows application of a few status effects (see chem.dm) and allows custom triggers to be installed (kind of like nanites), again, see chem.dm -In a nutshell, this is the way you enthrall people, by typing messages into chat and managing cooldowns on the stronger words. You have to type words and your message strength is increases with the number of characters - if you type short messages the cooldown will be too much and the other player will overcome the chem. -I suppose people could spam gdjshogndjoadphgiuaodp but, the truth of this chem is that it mostly allows a casus beli for subs to give in, and everyones a sub on cit (mostly), so if you aujigbnadjgipagdsjk then they might resist harder cause you're a baddie and baddies don't deserve pets. -Also, the use of this chem as a murder aid is antithetic to it's design, the subject gains bonus resistance if they're hurt or hungry (I'd like to expland this more, I like the idea that you have to look after all of them otherwise they aren't as effective, kind of like tamagachis!). If this becomes a problem, I'll deal with it, I'm not happy with people abusing this chem for an easy murder. (I might make it so you an't strike your pet when health is too low.) -Additionaly, in lieu of previous statement - the pet is ordered to not kill themselves, even if ordered to. - -chem.dm -oof -There's a few basic things that have to be understood with this status effect -1. There is a min loop which calculates the enthrall state of the subject, when the entrall tally is over a certain amount, it will push you up 1 phase. -0 - Sleeper -1 - initial -2 - enthralled -3 - Fully entranced -4 - mindbroken -4 can only be reached via OD, whereas you can increment up from 1 > 2 > 3. 0 is only obtainable on a state 3 pet, and it toggles between the two. - -1.5 Chem warfare -Since this is a chem, it's expected that you will use all of the chemicals at your disposal. Using aphro and aphro+ will weaken the resistance of the subject, while ananphro, anaphro+, mannitol and neurine will strengthen it. -Additionally, the more aroused you are, the weaker your resistance will be, as a result players immune to aphro and anaphro give a flat bonus to the enthraller. -using furranium and hatmium on the enchanter weakens their power considerably, because they sound rediculous. "Youwe fweewing wery sweepy uwu" This completely justifies their existance. -The impure toxin for this chem increases resistance too, so if they're a bad chemist it'll be unlikely they have a good ratio (and as a secret bonus, really good chemists cann purposely make the impure chem, to use either to combat the use of it against them, or as smoke grenades to deal with a large party) - -2. There is a resistance proc which occurs whenever the player presses resist. You have to press it a lot, this is intentional. If you're trying to fight the enchanter, then you can't click both. You usually will win if you just mash resist and the enchanter does nothing, so you've got to react. -Each step futher it becomes harder to resist, in state 2 it's longer, but resisting is still worthwhile. If you're not in state 3, and you've not got MKultra inside of you, you generate resistance very fast. So in some cases the better option will be to stall out any attempts to entrance you. -At the moment, resistance doesn't affect the commands - mostly because it's a way to tell if a state 3 is trying to resist. But this might change if it gets too hard to fight them off. -Durign state 3, it's impossible to resist if the enthraller is in your presence (8 tiles), you generate no resistance if so. If they're out of your range, then you start to go into the addiction processed -As your resistance is tied to your arousal, sometimes your best option is to wah - -3. The addition process starts when the enthraller is out of range, it roughtly follows the five stages of grief; denial, anger, bargaining, depression and acceptance. -What it mostly does makes you sad, hurts your brain, and sometimes you lash out in anger. -Denial - minor brain damaged -bargaining - 50:50 chance of brain damage and brain healing -anger - randomly lashing out and hitting people -depression - massive mood loss, stuttering, jittering, hallucinations and brain damage -depression, again - random stunning and crying, brain damage, and resistance -acceptance - minor brain damage and resistance. -You can also resist while out of range, but you can only break free of a stange 3 enthrallment by hitting the acceptance phase with a high enough resistance. -Finally, being near your enthraller reverts the damages caused. -It is expected that if you intend to break free you'll need to use psicodine and mannitol or you'll end up in a bad, but not dead, state. This gives more work for medical!! Finally the true rational of this complicated chem comes out. - -4. Status effects in status effects. -There's a few commands that give status effects, such as antiresist, which will cause resistance presses to increase the enthrallment instead, theses are called from the vocal chords. -They're mostly self explainitory; antiresist, charge, pacify and heal. Heals quite weak for obvious reasons. I'd like to add more, maybe some weak adneals with brute/exhaustion costs after the status is over. A truth serum might be neat too. -State 4 pets don't get status effects. - -5. Custom triggers -Because it wasnt complicated enough already. -Custom triggers are set by stating a trigger word, which will call a sub proc, which is also defined when the trigger is Called -The effects avalible at the moment are: -Speak - forces pet to say a preallocated phrase in response to the trigger -Echo - sends a message to that player only (i.e. makes them think something) -Shock - gives them a seizure/zaps them -You can look this one up yourself - it's what you expect, it's cit -kneel - gives a short knockdown -strip - strips jumpsuit only -objective - gives the pet a new objective. This requires a high ammount of mental capasity - which is determined by how much you resist. If you resist enough during phase 1 and 2, then they can't give you an objective. -Feel free to add more. -triggers work when said by ANYONE, not just the enchanter. -This is only state 3 pets, state 4 pets cannot get custom triggers, you broke them you bully. - -7. If you're an antage you get a bonus to resistance AND to enthralling. Thus it can be worth using this on both sides. It shouldn't be hard to resist as an antag. There are futher bonuses to command, Chaplains and chemist. -If you give your pet a collar then their resistance reduced too. -(I think thats everything?) - -Failstates: -Blowing up the reaction produces a gas that causes everyone to fall in love with one another. - -Creating a chem with a low purity will make you permanently fall in love with someone, and tasked with keeping them safe. If someone else drinks it, you fall for them. -*/ - -/datum/reagent/fermi/enthrall - name = "MKUltra" - id = "enthrall" - description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." - color = "#2C051A" // rgb: , 0, 255 - taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" - overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. - DoNotSplit = TRUE - metabolization_rate = 0.1//It has to be slow, so there's time for the effect. - data = list("creatorID" = null, "creatorGender" = null, "creatorName" = null) - var/creatorID //ckey - var/creatorGender - var/creatorName - var/mob/living/creator - pH = 10 - OnMobMergeCheck = TRUE //Procs on_mob_add when merging into a human - -/datum/reagent/fermi/enthrall/test - name = "MKUltraTest" - id = "enthrallTest" - description = "A forbidden deep red mixture that overwhelms a foreign body with waves of joy, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." - color = "#2C051A" // rgb: , 0, 255 - data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Fermis Yakumo") - creatorID = "honkatonkbramblesnatch"//ckey - creatorGender = "Mistress" - creatorName = "Fermis Yakumo" - purity = 1 - DoNotSplit = TRUE - -/datum/reagent/fermi/enthrall/test/on_new() - id = "enthrall" - ..() - creator = get_mob_by_key(creatorID) - -/datum/reagent/fermi/enthrall/on_new(list/data) - creatorID = data.["creatorID"] - creatorGender = data.["creatorGender"] - creatorName = data.["creatorName"] - creator = get_mob_by_key(creatorID) - -/datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) - . = ..() - if(!ishuman(M))//Just to make sure screwy stuff doesn't happen. - return - if(!creatorID) - //This happens when the reaction explodes. - return - var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) - if(E) - if(E.enthrallID == M.ckey && creatorName != M.real_name)//If you're enthralled to yourself (from OD) and someone else tries to enthrall you, you become thralled to them instantly. - E.enthrallID = creatorID - E.enthrallGender = creatorGender - E.master = get_mob_by_key(creatorID) - to_chat(M, to_chat(M, "Your aldled, plastic, mind bends under the chemical influence of a new [(M.lewd?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.")) //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE. - return - if(purity < 0.5)//Impure chems don't function as you expect - return - if((M.ckey == creatorID) && (creatorName == M.real_name)) //same name AND same player - same instance of the player. (should work for clones?) - /*if(M.has_status_effect(STATUS_EFFECT_INLOVE) //Not sure if I need/want this. - to_chat(M, "You are too captivated by your love to think about anything else") - return*/ - var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) - var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet - if(Vc) - Vc.Remove(M) - nVc.Insert(M) - qdel(Vc) - to_chat(M, "You feel your vocal chords tingle as your voice comes out in a more sultry tone.") - else - message_admins("MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]") - M.apply_status_effect(/datum/status_effect/chem/enthrall) - -/datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) - . = ..() - if(purity < 0.5)//DO NOT SPLIT INTO DIFFERENT CHEM: This relies on DoNotSplit - has to be done this way. - if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. - if(M.has_status_effect(STATUS_EFFECT_INLOVE))//Can't be enthralled when enthralled, so to speak. - return - var/list/seen = viewers(7, get_turf(M)) - for(var/victim in seen) - if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (!M.client) || (M.stat == DEAD)) - seen = seen - victim - if(!seen) - return - M.reagents.remove_reagent(id, volume) - FallInLove(M, pick(seen)) - return - else // If someone else drinks it, the creator falls in love with them! - var/mob/living/carbon/C = get_mob_by_key(creatorID) - if(M.has_status_effect(STATUS_EFFECT_INLOVE)) - return - if((C in viewers(7, get_turf(M))) && (C.client)) - M.reagents.remove_reagent(id, volume) - FallInLove(C, M) - return - if(volume < 1)//You don't get to escape that easily - FallInLove(pick(GLOB.player_list), M) - if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it does nothing. - return - if(!M.client) - metabolization_rate = 0 //Stops powergamers from quitting to avoid affects. but prevents affects on players that don't exist for performance. - return - if(metabolization_rate == 0) - metabolization_rate = 0.5 - var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)//If purity is over 5, works as intended - if(!E) - return - else - E.enthrallTally += 1 - if(prob(1)) - M.adjustBrainLoss(1)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it. - ..() - -/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I made it so the creator is set to gain the status for someone random. - . = ..() - if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 100u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.) - to_chat(M, "You are unable to resist your own charms anymore, and become a full blown narcissist.") - /*Old way of handling, left in as an option B - var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers - for(var/mob/living/carbon/victim in seen) - if(victim == M)//as much as I want you to fall for beepsky, he doesn't have a ckey - seen = seen - victim - if(!victim.ckey) - seen = seen - victim - var/mob/living/carbon/chosen = pick(seen) - creatorID = chosen.ckey - if (chosen.gender == "female") - creatorGender = "Mistress" - else - creatorGender = "Master" - creatorName = chosen.real_name - creator = get_mob_by_key(creatorID) - */ - M.add_trait(TRAIT_PACIFISM, "MKUltra") - var/datum/status_effect/chem/enthrall/E - if (!M.has_status_effect(/datum/status_effect/chem/enthrall)) - M.apply_status_effect(/datum/status_effect/chem/enthrall) - E = M.has_status_effect(/datum/status_effect/chem/enthrall) - E.enthrallID = creatorID - E.enthrallGender = creatorGender - E.master = creator - else - E = M.has_status_effect(/datum/status_effect/chem/enthrall) - to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side at all costs.") - M.slurring = 100 - M.confused = 100 - E.phase = 4 - E.mental_capacity = 0 - E.customTriggers = list() - -/datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M) - M.adjustBrainLoss(0.1)//should be 15 in total - ..() - -//Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system. -/datum/reagent/fermi/enthrallExplo//Created in a gas cloud when it explodes - name = "MKUltra" - id = "enthrallExplo" - description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." - color = "#2C051A" // rgb: , 0, 255 - metabolization_rate = 0.1 - taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses." - DoNotSplit = TRUE - var/mob/living/carbon/love - -/datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system,Gives a positive moodlet if close, gives brain damagea and a negative moodlet if not close enough. - if(!M.has_status_effect(STATUS_EFFECT_INLOVE)) - var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers - for(var/victim in seen) - if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (M.stat == DEAD)) - seen = seen - victim - if(seen.len == 0) - return - love = pick(seen) - if(!love) - return - M.apply_status_effect(STATUS_EFFECT_INLOVE, love) - to_chat(M, "You develop overwhelmingly deep feelings for [love], your heart beginning to race as you look upon them with new eyes. You are determined to keep them safe above all other priorities.") - else - if(get_dist(M, love) < 8) - if(M.has_trait(TRAIT_NYMPHO)) //Add this back when merged/updated. - M.adjustArousalLoss(5) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") - else - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") - if(prob(10)) - M.Stun(10) - M.emote("whimper")//does this exist? - to_chat(M, " You're overcome with a desire to see [love].") - M.adjustBrainLoss(1)//I found out why everyone was so damaged! - ..() - -/datum/reagent/fermi/enthrallExplo/on_mob_delete(mob/living/carbon/M) - M.remove_status_effect(STATUS_EFFECT_INLOVE) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") - to_chat(M, "Your feelings for [love] suddenly vanish!") - ..() - -/datum/reagent/fermi/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love) - if(Lover.has_status_effect(STATUS_EFFECT_INLOVE)) - to_chat(Lover, "You are already fully devoted to someone else!") - return - to_chat(Lover, "You develop deep feelings for [Love], your heart beginning to race as you look upon them with new eyes.") - if(Lover.mind) - Lover.mind.store_memory("You are in love with [Love].") - Lover.faction |= "[REF(Love)]" - Lover.apply_status_effect(STATUS_EFFECT_INLOVE, Love) - forge_valentines_objective(Lover, Love, TRUE) - return - -//For addiction see chem.dm - //////////////////////////////////////////////////////////////////////////////////////////////////// // HATIMUIM /////////////////////////////////////////////////////////////////////////////////////////////////// From 54985c05d9cd0277e1f0a864005cfbd28e0e65b5 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 07:11:29 +0100 Subject: [PATCH 253/608] Confused about bitgates. --- code/modules/reagents/reagent_containers.dm | 8 ++++---- code/modules/surgery/organs/vocal_cords.dm | 2 +- tgstation.dme | 5 +++++ 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 45cf95dacb..c84d7fec8a 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -1,6 +1,6 @@ -#define FLAG_STATUS_NONE (1<<0) -#define FLAG_STATUS_PH_IMMUNE (1<<1) -#define FLAG_STATUS_TEMP_IMMUNE (1<<2) +#define FLAG_STATUS_NONE 0b00 +#define FLAG_STATUS_PH_IMMUNE 0b01 +#define FLAG_STATUS_TEMP_IMMUNE 0b10 /obj/item/reagent_containers @@ -16,7 +16,7 @@ var/spawned_disease = null var/disease_amount = 20 var/spillable = FALSE - var/beaker_resistances |= (1<<3) + var/beaker_resistances = 0b11 /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 4dd6dd374d..d5f8700f6c 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -622,7 +622,7 @@ var/base_multiplier = 1 //spans = list("say","yell") -/obj/item/organ/vocal_cords/proc/handle_speech(message) //actually say the message +/obj/item/organ/vocal_cords/velvet/handle_speech(message) //actually say the message owner.say(message, spans = spans, sanitize = FALSE) velvetspeech(message, owner) diff --git a/tgstation.dme b/tgstation.dme index bfbb2a7052..00d3bcbed8 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -3008,8 +3008,13 @@ #include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm" #include "modular_citadel\code\modules\projectiles\projectile\energy.dm" #include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\astrogen.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\eigentstasium.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\enlargement.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\MKUltra.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\SDGF.dm" #include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm" #include "modular_citadel\code\modules\reagents\objects\fermiclothes.dm" #include "modular_citadel\code\modules\reagents\objects\items.dm" From 2a76cfa2855dcd470d2e0a2889db8673edc0c9c2 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 07:51:46 +0100 Subject: [PATCH 254/608] Logging --- code/modules/reagents/reagent_containers.dm | 2 +- .../reagents/chemistry/reagents/MKUltra.dm | 8 +++++- .../reagents/chemistry/reagents/SDGF.dm | 26 +++++++++++++++---- .../reagents/chemistry/reagents/astrogen.dm | 3 +++ .../chemistry/reagents/eigentstasium.dm | 5 ++++ .../chemistry/reagents/enlargement.dm | 1 + .../chemistry/reagents/fermi_reagents.dm | 15 +++++++++-- 7 files changed, 51 insertions(+), 9 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index c84d7fec8a..73b1d24b31 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -16,7 +16,7 @@ var/spawned_disease = null var/disease_amount = 20 var/spillable = FALSE - var/beaker_resistances = 0b11 + var/beaker_resistances = 3 /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index fb57a22664..603d36550b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -187,6 +187,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(purity < 0.5)//Impure chems don't function as you expect return if((M.ckey == creatorID) && (creatorName == M.real_name)) //same name AND same player - same instance of the player. (should work for clones?) + log_game("FERMICHEM: [M] ckey: [M.key] has been given velvetspeech") /*if(M.has_status_effect(STATUS_EFFECT_INLOVE) //Not sure if I need/want this. to_chat(M, "You are too captivated by your love to think about anything else") return*/ @@ -200,6 +201,7 @@ Creating a chem with a low purity will make you permanently fall in love with so else message_admins("MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]") M.apply_status_effect(/datum/status_effect/chem/enthrall) + log_game("FERMICHEM: [M] ckey: [M.key] has taken MKUltra") /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) . = ..() @@ -273,7 +275,8 @@ Creating a chem with a low purity will make you permanently fall in love with so else E = M.has_status_effect(/datum/status_effect/chem/enthrall) to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side at all costs.") - M.slurring = 100 + log_game("FERMICHEM: [M] ckey: [M.key] has been mindbroken for [creatorName] ckey: [creatorID]") + M.slurring = 100 M.confused = 100 E.phase = 4 E.mental_capacity = 0 @@ -307,6 +310,7 @@ Creating a chem with a low purity will make you permanently fall in love with so return M.apply_status_effect(STATUS_EFFECT_INLOVE, love) to_chat(M, "You develop overwhelmingly deep feelings for [love], your heart beginning to race as you look upon them with new eyes. You are determined to keep them safe above all other priorities.") + log_game("FERMICHEM: [M] ckey: [M.key] has temporarily fallen for [love] ckey: [love.key]") else if(get_dist(M, love) < 8) if(M.has_trait(TRAIT_NYMPHO)) //Add this back when merged/updated. @@ -328,6 +332,7 @@ Creating a chem with a low purity will make you permanently fall in love with so SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") to_chat(M, "Your feelings for [love] suddenly vanish!") + log_game("FERMICHEM: [M] ckey: [M.key] is no longer in temp love") ..() /datum/reagent/fermi/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love) @@ -340,6 +345,7 @@ Creating a chem with a low purity will make you permanently fall in love with so Lover.faction |= "[REF(Love)]" Lover.apply_status_effect(STATUS_EFFECT_INLOVE, Love) forge_valentines_objective(Lover, Love, TRUE) + log_game("FERMICHEM: [M] ckey: [M.key] has been chemically made to fall for [love] ckey: [love.key]") return //For addiction see chem.dm diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index 688b2a865f..864d9558da 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -66,9 +66,11 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(pollStarted == FALSE) pollStarted = TRUE candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") + log_game("FERMICHEM: [M] ckey: [M.key] has taken SDGF, and ghosts have been polled.") if(20 to INFINITY) if(LAZYLEN(candies) && playerClone == FALSE) //If there's candidates, clone the person and put them in there! message_admins("Ghost candidate found! [candies] is becoming a clone of [M]! Hee~!! Exciting!!") + log_game("FERMICHEM: [M] ckey: [M.key] is creating a clone, controlled by [candies]") to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") var/typepath = M.type var/mob/living/carbon/human/fermi_Gclone = new typepath(M.loc) @@ -87,10 +89,18 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE) ZI.Remove(M) ZI.Insert(SM) + log_game("FERMICHEM: [M] ckey: [M.key]'s zombie_infection has been transferred to their clone") to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") - to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. [pick("However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original", "Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")]") - to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") + + if(prob(50)) + to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original") + log_game("FERMICHEM: [SM] ckey: [SM.key]'s is not bound by [M] ckey [M.key]'s will, and is free to determine their own goals, while respecting and acting as their origin.") + else + to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.") + log_game("FERMICHEM: [SM] ckey: [SM.key]'s is bound by [M] ckey [M.key]'s objectives, and is encouraged to help them complete them.") + + to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") M.visible_message("[M] suddenly shudders, and splits into two identical twins!") SM.copy_known_languages_from(M, FALSE) playerClone = TRUE @@ -106,6 +116,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Transfer remaining reagent to clone. I think around 30u will make a healthy clone, otherwise they'll have clone damage, blood loss, brain damage and hunger. SM.reagents.add_reagent("SDGFheal", volume) M.reagents.remove_reagent(id, volume) + log_game("FERMICHEM: [volume]u of SDGFheal has been transferred to the clone") return else if(playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). @@ -115,6 +126,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(21) to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). M.remove_trait(TRAIT_DISFIGURED, TRAIT_GENERIC) + log_game("FERMICHEM: [M] ckey: [M.key] is being healed by SDGF") if(22 to INFINITY) M.adjustCloneLoss(-1, 0) M.adjustBruteLoss(-1, 0) @@ -146,6 +158,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.next_move_modifier -= 4 to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) + log_game("FERMICHEM: [M] ckey: [M.key] has created a mindless clone of themselves") if(87 to INFINITY) M.reagents.remove_reagent(id, volume)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. @@ -234,6 +247,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI if(75 to 85) M.adjustToxLoss(1, 0)// the warning! + if(86)//mean clone time! if (!M.reagents.has_reagent("pen_acid"))//Counterplay is pent.) message_admins("(non-infectious) Zombie spawned at [M.loc], produced by impure chem, wah!") @@ -248,8 +262,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name ZI.desc = "[M]'s clone, gone horribly wrong." - + log_game("FERMICHEM: [M] ckey: [M.key]'s clone has become a horrifying zombie instead") M.reagents.remove_reagent(id, 20) + else//easier to deal with to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour!") M.nutrition = startHunger - 500 @@ -258,9 +273,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING S.name = "Living teratoma" S.real_name = "Living teratoma"//horrifying!! S.rabid = 1//Make them an angery boi - //S.updateappearance(mutcolor_update=1) M.reagents.remove_reagent(id, volume) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") - if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. TODO: turn tumour slime into real variant. + log_game("FERMICHEM: [M] ckey: [M.key]'s clone has become a horrifying teratoma instead") + + if(87 to INFINITY) M.adjustToxLoss(1, 0) ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index 0df29af693..30f3575c5c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -31,6 +31,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die M.alpha = 255 switch(current_cycle) if(0)//Require a minimum + log_game("FERMICHEM: [M] ckey: [M.key] became an astral ghost") origin = M if (G == null) G = new(get_turf(M.loc)) @@ -77,6 +78,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die to_chat(M, "You notice your body starting to disappear, maybe you took too much Astrogen...?") M.alpha-- antiGenetics-- + log_game("FERMICHEM: [M] ckey: [M.key] has become addicted to Astrogen") if(220) to_chat(M, "Your addiction is only getting worse as your body disappears. Maybe you should get some more, and fast?") M.alpha-- @@ -109,4 +111,5 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") message_admins("[M] (ckey: [M.ckey]) has become one with the universe, and have continuous memories thoughout their lives should they find a way to come back to life (such as an inteligence potion, midround antag, ghost role).") qdel(M) //Approx 60minutes till death from initial addiction + log_game("FERMICHEM: [M] ckey: [M.key] has been obliterated from Astrogen addiction") ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index fa677ade9c..65252ba73c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -33,11 +33,13 @@ //Main functions /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! + log_game("FERMICHEM: [M] ckey: [M.key] took eigenstasium") switch(current_cycle) if(0) location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") if(purity > 0.75) //Teleports you home if it's pure enough + log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium") var/turf/open/creation = location_created do_sparks(5,FALSE,M) do_teleport(M, creation, 0, asoundin = 'sound/effects/phasein.ogg') @@ -56,6 +58,7 @@ /datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly . = ..() to_chat(M, "Oh god, you feel like your wavefunction is about to tear.") + log_game("FERMICHEM: [M] ckey: [M.key] has overdosed on eigenstasium") M.Jitter(10) /datum/reagent/fermi/eigenstate/overdose_process(mob/living/M) //Overdose, makes you teleport randomly, probably one of my favourite effects. Sometimes kills you. @@ -70,6 +73,7 @@ switch(addictCyc1) if(1) to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") + log_game("FERMICHEM: [M] ckey: [M.key] has become addicted to eigenstasium") M.Jitter(10) M.nutrition = M.nutrition - (M.nutrition/15) addictCyc1++ @@ -136,6 +140,7 @@ M.Knockdown(0) to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) + log_game("FERMICHEM: [M] ckey: [M.key] has become an alternative universe version of themselves.") M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) for(var/datum/mood_event/Me in M) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, Me) //Why does this not work? diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index c4b819f2fe..ff9e2235de 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -47,6 +47,7 @@ B.throw_at(T2, 8, 1) M.reagents.remove_reagent(id, volume) return + log_game("FERMICHEM: [M] ckey: [M.key] has ingested Sucubus milk") var/mob/living/carbon/human/H = M H.genital_override = TRUE var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 392a22fd16..ed461698d4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -14,16 +14,19 @@ if(purity < 0) CRASH("Purity below 0 for chem: [id], Please let Fermis Know!") if (purity == 1 || DoNotSplit == TRUE) + log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [id]") return else if (InverseChemVal > purity)//Turns all of a added reagent into the inverse chem M.reagents.remove_reagent(id, amount, FALSE) M.reagents.add_reagent(InverseChem, amount, FALSE, other_purity = 1) + log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [InverseChem]") return else - //var/pureVol = amount * puritys var/impureVol = amount * (1 - purity) //turns impure ratio into impure chem M.reagents.remove_reagent(id, (impureVol), FALSE) M.reagents.add_reagent(ImpureChem, impureVol, FALSE, other_purity = 1) + log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume - impureVol]u of [id]") + log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [ImpureChem]") return //When merging two fermichems, see above @@ -34,6 +37,7 @@ if (purity < 0) CRASH("Purity below 0 for chem: [id], Please let Fermis Know!") if (purity == 1 || DoNotSplit == TRUE) + log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [id] in themselves") return else if (InverseChemVal > purity) M.reagents.remove_reagent(id, amount, FALSE) @@ -41,6 +45,7 @@ for(var/datum/reagent/fermi/R in M.reagents.reagent_list) if(R.name == "") R.name = name//Negative effects are hidden + log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [InverseChem]") return else var/impureVol = amount * (1 - purity) @@ -49,6 +54,8 @@ for(var/datum/reagent/fermi/R in M.reagents.reagent_list) if(R.name == "") R.name = name//Negative effects are hidden + log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume - impureVol]u of [id]") + log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [ImpureChem]") return @@ -139,7 +146,7 @@ var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/fluffy T.Remove(M) nT.Insert(M) - T.moveToNullspace()//To the zelda room. + T.moveToNullspace()//To valhalla to_chat(M, "Youw tongue feews... weally fwuffy!!") if(17 to INFINITY) if(prob(10)) @@ -165,6 +172,8 @@ T.Insert(M) to_chat(M, "You feel your tongue.... unfluffify...?") M.say("Pleh!") + else + log_game("FERMICHEM: [M] ckey: [M.key]'s tongue has been made permanent") /////////////////////////////////////////////////////////////////////////////////////////////// //Nanite removal @@ -390,6 +399,7 @@ catto.desc = "A cute catto! They remind you of [H] somehow." catto.color = "#[H.dna.features["mcolor"]]" H.moveToNullspace() + log_game("FERMICHEM: [M] ckey: [M.key] has been made into a cute catto.") /datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) if(prob(5)) @@ -406,3 +416,4 @@ H.say("*wag")//force update sprites. to_chat(H, "[words]") qdel(catto) + log_game("FERMICHEM: [M] ckey: [M.key] has returned to normal") From 45e51cb68d2809c9370dd6abbf7090e99f511c7b Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 13 Jun 2019 08:48:58 +0100 Subject: [PATCH 255/608] tweaks --- .../chemistry/reagents/enlargement.dm | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index ff9e2235de..b62f04c65a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -10,7 +10,7 @@ //I'm not a very kinky person, sorry if it's not great //I tried to make it interesting..!! -//Normal function increases your breast size by 0.1, 5units = 1 cup. +//Normal function increases your breast size by 0.05, 10units = 1 cup. //If you get stupid big, it presses against your clothes, causing brute and oxydamage. Then rips them off. //If you keep going, it makes you slower, in speed and action. //decreasing your size will return you to normal. @@ -25,7 +25,7 @@ color = "#E60584" // rgb: 96, 0, 255 taste_description = "a milky ice cream like flavour." overdose_threshold = 12 - metabolization_rate = 0.5 + metabolization_rate = 0.25 ImpureChem = "BEsmaller" //If you make an inpure chem, it stalls growth InverseChemVal = 0.3 InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse @@ -70,7 +70,7 @@ //If they have Acute hepatic pharmacokinesis, then route processing though liver. if(M.has_trait(TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") - L.swelling+= 0.1 + L.swelling+= 0.05 return..() //otherwise proceed as normal @@ -90,7 +90,7 @@ M.reagents.remove_reagent(id, 5) B = nB //If they have them, increase size. If size is comically big, limit movement and rip clothes. - B.cached_size = B.cached_size + 0.1 + B.cached_size = B.cached_size + 0.05 if (B.cached_size >= 8.5 && B.cached_size < 9) if(H.w_uniform || H.wear_suit) var/target = M.get_bodypart(BODY_ZONE_CHEST) @@ -105,7 +105,6 @@ //Acute hepatic pharmacokinesis. if(M.has_trait(TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") - L.swelling+= 0.05 return ..() var/obj/item/organ/genital/penis/P = M.getorganslot("penis") @@ -118,7 +117,7 @@ M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") if(P) - P.cached_length = P.cached_length - 0.1 + P.cached_length = P.cached_length - 0.05 P.update() if(T) T.Remove(M) @@ -138,7 +137,7 @@ description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." color = "#E60584" // rgb: 96, 0, 255 taste_description = "a milky ice cream like flavour." - metabolization_rate = 0.5 + metabolization_rate = 0.25 /datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M) var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") @@ -146,12 +145,12 @@ //Acute hepatic pharmacokinesis. if(M.has_trait(TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") - L.swelling-= 0.1 + L.swelling-= 0.05 return ..() //otherwise proceed as normal return..() - B.cached_size = B.cached_size - 0.1 + B.cached_size = B.cached_size - 0.05 B.update() ..() @@ -169,7 +168,7 @@ color = "#888888" // This is greyish..? taste_description = "chinese dragon powder" overdose_threshold = 12 //ODing makes you male and removes female genitals - metabolization_rate = 0.5 + metabolization_rate = 0.25 ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth InverseChemVal = 0.3 InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse and shrinks instead. @@ -209,7 +208,7 @@ //If they have Acute hepatic pharmacokinesis, then route processing though liver. if(M.has_trait(TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") - L.swelling+= 0.1 + L.swelling+= 0.05 return..() //otherwise proceed as normal @@ -223,7 +222,7 @@ M.reagents.remove_reagent(id, 5) P = nP - P.cached_length = P.cached_length + 0.1 + P.cached_length = P.cached_length + 0.05 if (P.cached_length >= 20.5 && P.cached_length < 21) if(H.w_uniform || H.wear_suit) var/target = M.get_bodypart(BODY_ZONE_CHEST) @@ -250,7 +249,7 @@ M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") if(B) - B.cached_size = B.cached_size - 0.1 + B.cached_size = B.cached_size - 0.05 B.update() if(V) V.Remove(M) @@ -277,11 +276,11 @@ //Acute hepatic pharmacokinesis. if(M.has_trait(TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") - L.swelling-= 0.1 + L.swelling-= 0.05 return..() //otherwise proceed as normal return..() - P.cached_length = P.cached_length - 0.1 + P.cached_length = P.cached_length - 0.05 P.update() ..() From ee458b102fff95c10313c370704ba82501b87a1c Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 14 Jun 2019 10:45:36 +0100 Subject: [PATCH 256/608] bitflags --- code/modules/reagents/reagent_containers.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 73b1d24b31..6be7b1309f 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -1,6 +1,6 @@ -#define FLAG_STATUS_NONE 0b00 -#define FLAG_STATUS_PH_IMMUNE 0b01 -#define FLAG_STATUS_TEMP_IMMUNE 0b10 +#define FLAG_STATUS_NONE (1<<0) +#define FLAG_STATUS_PH_IMMUNE (1<<1) +#define FLAG_STATUS_TEMP_IMMUNE (1<<2) /obj/item/reagent_containers @@ -16,7 +16,7 @@ var/spawned_disease = null var/disease_amount = 20 var/spillable = FALSE - var/beaker_resistances = 3 + var/beaker_resistances |= (FLAG_STATUS_PH_IMMUNE | FLAG_STATUS_TEMP_IMMUNE) /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() From ab35b018dbfd849e08929f9b582e7185f349ed20 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 14 Jun 2019 11:24:21 +0100 Subject: [PATCH 257/608] Indents and eigenstate var reduction. --- code/modules/reagents/reagent_containers.dm | 10 ++-- .../reagents/reagent_containers/glass.dm | 6 +- .../reagents/chemistry/reagents/MKUltra.dm | 14 ++--- .../reagents/chemistry/reagents/SDGF.dm | 30 +++++----- .../reagents/chemistry/reagents/astrogen.dm | 45 +++++++------- .../chemistry/reagents/eigentstasium.dm | 59 ++++++++----------- .../chemistry/reagents/enlargement.dm | 3 +- .../chemistry/reagents/fermi_reagents.dm | 9 ++- 8 files changed, 83 insertions(+), 93 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 6be7b1309f..7b75d53779 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -1,7 +1,6 @@ -#define FLAG_STATUS_NONE (1<<0) -#define FLAG_STATUS_PH_IMMUNE (1<<1) -#define FLAG_STATUS_TEMP_IMMUNE (1<<2) - +#define FLAG_STATUS_NONE (1 << 0) +#define FLAG_STATUS_PH_IMMUNE (1 << 1) +#define FLAG_STATUS_TEMP_IMMUNE (1 << 2) /obj/item/reagent_containers name = "Container" @@ -16,9 +15,10 @@ var/spawned_disease = null var/disease_amount = 20 var/spillable = FALSE - var/beaker_resistances |= (FLAG_STATUS_PH_IMMUNE | FLAG_STATUS_TEMP_IMMUNE) + var/beaker_resistances = NONE /obj/item/reagent_containers/Initialize(mapload, vol) + beaker_resistances |= FLAG_STATUS_PH_IMMUNE | FLAG_STATUS_TEMP_IMMUNE . = ..() if(isnum(vol) && vol > 0) volume = vol diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 83a9b81884..6c04af50c8 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -113,7 +113,7 @@ icon_state = "beaker" item_state = "beaker" materials = list(MAT_GLASS=500) - beaker_resistances &= ~FLAG_STATUS_PH_IMMUNE + beaker_resistances = FLAG_STATUS_TEMP_IMMUNE /obj/item/reagent_containers/glass/beaker/Initialize() . = ..() @@ -191,7 +191,7 @@ volume = 200 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,200) - beaker_resistances |= (1<<3) + beaker_resistances |= FLAG_STATUS_PH_IMMUNE | FLAG_STATUS_TEMP_IMMUNE /obj/item/reagent_containers/glass/beaker/noreact name = "cryostasis beaker" @@ -201,7 +201,7 @@ materials = list(MAT_METAL=3000) volume = 50 amount_per_transfer_from_this = 10 - beaker_resistances |= (1<<3) + beaker_resistances |= FLAG_STATUS_PH_IMMUNE | FLAG_STATUS_TEMP_IMMUNE /obj/item/reagent_containers/glass/beaker/noreact/Initialize() . = ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 603d36550b..9a39a7506e 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -187,7 +187,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(purity < 0.5)//Impure chems don't function as you expect return if((M.ckey == creatorID) && (creatorName == M.real_name)) //same name AND same player - same instance of the player. (should work for clones?) - log_game("FERMICHEM: [M] ckey: [M.key] has been given velvetspeech") + log_game("FERMICHEM: [M] ckey: [M.key] has been given velvetspeech") /*if(M.has_status_effect(STATUS_EFFECT_INLOVE) //Not sure if I need/want this. to_chat(M, "You are too captivated by your love to think about anything else") return*/ @@ -201,7 +201,7 @@ Creating a chem with a low purity will make you permanently fall in love with so else message_admins("MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]") M.apply_status_effect(/datum/status_effect/chem/enthrall) - log_game("FERMICHEM: [M] ckey: [M.key] has taken MKUltra") + log_game("FERMICHEM: [M] ckey: [M.key] has taken MKUltra") /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) . = ..() @@ -275,8 +275,8 @@ Creating a chem with a low purity will make you permanently fall in love with so else E = M.has_status_effect(/datum/status_effect/chem/enthrall) to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side at all costs.") - log_game("FERMICHEM: [M] ckey: [M.key] has been mindbroken for [creatorName] ckey: [creatorID]") - M.slurring = 100 + log_game("FERMICHEM: [M] ckey: [M.key] has been mindbroken for [creatorName] ckey: [creatorID]") + M.slurring = 100 M.confused = 100 E.phase = 4 E.mental_capacity = 0 @@ -310,7 +310,7 @@ Creating a chem with a low purity will make you permanently fall in love with so return M.apply_status_effect(STATUS_EFFECT_INLOVE, love) to_chat(M, "You develop overwhelmingly deep feelings for [love], your heart beginning to race as you look upon them with new eyes. You are determined to keep them safe above all other priorities.") - log_game("FERMICHEM: [M] ckey: [M.key] has temporarily fallen for [love] ckey: [love.key]") + log_game("FERMICHEM: [M] ckey: [M.key] has temporarily fallen for [love] ckey: [love.key]") else if(get_dist(M, love) < 8) if(M.has_trait(TRAIT_NYMPHO)) //Add this back when merged/updated. @@ -332,7 +332,7 @@ Creating a chem with a low purity will make you permanently fall in love with so SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") to_chat(M, "Your feelings for [love] suddenly vanish!") - log_game("FERMICHEM: [M] ckey: [M.key] is no longer in temp love") + log_game("FERMICHEM: [M] ckey: [M.key] is no longer in temp love") ..() /datum/reagent/fermi/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love) @@ -345,7 +345,7 @@ Creating a chem with a low purity will make you permanently fall in love with so Lover.faction |= "[REF(Love)]" Lover.apply_status_effect(STATUS_EFFECT_INLOVE, Love) forge_valentines_objective(Lover, Love, TRUE) - log_game("FERMICHEM: [M] ckey: [M.key] has been chemically made to fall for [love] ckey: [love.key]") + log_game("FERMICHEM: [Lover] ckey: [Lover.key] has been chemically made to fall for [Love] ckey: [Love.key]") return //For addiction see chem.dm diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index 864d9558da..5aa626060d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -66,11 +66,11 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(pollStarted == FALSE) pollStarted = TRUE candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") - log_game("FERMICHEM: [M] ckey: [M.key] has taken SDGF, and ghosts have been polled.") + log_game("FERMICHEM: [M] ckey: [M.key] has taken SDGF, and ghosts have been polled.") if(20 to INFINITY) if(LAZYLEN(candies) && playerClone == FALSE) //If there's candidates, clone the person and put them in there! message_admins("Ghost candidate found! [candies] is becoming a clone of [M]! Hee~!! Exciting!!") - log_game("FERMICHEM: [M] ckey: [M.key] is creating a clone, controlled by [candies]") + log_game("FERMICHEM: [M] ckey: [M.key] is creating a clone, controlled by [candies]") to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") var/typepath = M.type var/mob/living/carbon/human/fermi_Gclone = new typepath(M.loc) @@ -89,18 +89,18 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE) ZI.Remove(M) ZI.Insert(SM) - log_game("FERMICHEM: [M] ckey: [M.key]'s zombie_infection has been transferred to their clone") + log_game("FERMICHEM: [M] ckey: [M.key]'s zombie_infection has been transferred to their clone") to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") - if(prob(50)) - to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original") - log_game("FERMICHEM: [SM] ckey: [SM.key]'s is not bound by [M] ckey [M.key]'s will, and is free to determine their own goals, while respecting and acting as their origin.") - else - to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.") - log_game("FERMICHEM: [SM] ckey: [SM.key]'s is bound by [M] ckey [M.key]'s objectives, and is encouraged to help them complete them.") + if(prob(50)) + to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original") + log_game("FERMICHEM: [SM] ckey: [SM.key]'s is not bound by [M] ckey [M.key]'s will, and is free to determine their own goals, while respecting and acting as their origin.") + else + to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.") + log_game("FERMICHEM: [SM] ckey: [SM.key]'s is bound by [M] ckey [M.key]'s objectives, and is encouraged to help them complete them.") - to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") + to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") M.visible_message("[M] suddenly shudders, and splits into two identical twins!") SM.copy_known_languages_from(M, FALSE) playerClone = TRUE @@ -116,7 +116,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Transfer remaining reagent to clone. I think around 30u will make a healthy clone, otherwise they'll have clone damage, blood loss, brain damage and hunger. SM.reagents.add_reagent("SDGFheal", volume) M.reagents.remove_reagent(id, volume) - log_game("FERMICHEM: [volume]u of SDGFheal has been transferred to the clone") + log_game("FERMICHEM: [volume]u of SDGFheal has been transferred to the clone") return else if(playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). @@ -126,7 +126,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(21) to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). M.remove_trait(TRAIT_DISFIGURED, TRAIT_GENERIC) - log_game("FERMICHEM: [M] ckey: [M.key] is being healed by SDGF") + log_game("FERMICHEM: [M] ckey: [M.key] is being healed by SDGF") if(22 to INFINITY) M.adjustCloneLoss(-1, 0) M.adjustBruteLoss(-1, 0) @@ -158,7 +158,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.next_move_modifier -= 4 to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) - log_game("FERMICHEM: [M] ckey: [M.key] has created a mindless clone of themselves") + log_game("FERMICHEM: [M] ckey: [M.key] has created a mindless clone of themselves") if(87 to INFINITY) M.reagents.remove_reagent(id, volume)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. @@ -262,7 +262,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name ZI.desc = "[M]'s clone, gone horribly wrong." - log_game("FERMICHEM: [M] ckey: [M.key]'s clone has become a horrifying zombie instead") + log_game("FERMICHEM: [M] ckey: [M.key]'s clone has become a horrifying zombie instead") M.reagents.remove_reagent(id, 20) else//easier to deal with @@ -275,7 +275,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING S.rabid = 1//Make them an angery boi M.reagents.remove_reagent(id, volume) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") - log_game("FERMICHEM: [M] ckey: [M.key]'s clone has become a horrifying teratoma instead") + log_game("FERMICHEM: [M] ckey: [M.key]'s clone has become a horrifying teratoma instead") if(87 to INFINITY) M.adjustToxLoss(1, 0) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index 30f3575c5c..c768ee0272 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -29,31 +29,30 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! M.alpha = 255 - switch(current_cycle) - if(0)//Require a minimum - log_game("FERMICHEM: [M] ckey: [M.key] became an astral ghost") - origin = M - if (G == null) - G = new(get_turf(M.loc)) - G.attacktext = "raises the hairs on the neck of" - G.response_harm = "disrupts the concentration of" - G.response_disarm = "wafts" - G.loot = null - G.maxHealth = 5 - G.health = 5 - G.melee_damage_lower = 0 - G.melee_damage_upper = 0 - G.deathmessage = "disappears as if it was never really there to begin with" - G.incorporeal_move = 1 - G.alpha = 35 - G.name = "[M]'s astral projection" - M.mind.transfer_to(G) - sleepytime = 15*volume + if(current_cycle == 0) + log_game("FERMICHEM: [M] ckey: [M.key] became an astral ghost") + origin = M + if (G == null) + G = new(get_turf(M.loc)) + G.attacktext = "raises the hairs on the neck of" + G.response_harm = "disrupts the concentration of" + G.response_disarm = "wafts" + G.loot = null + G.maxHealth = 5 + G.health = 5 + G.melee_damage_lower = 0 + G.melee_damage_upper = 0 + G.deathmessage = "disappears as if it was never really there to begin with" + G.incorporeal_move = 1 + G.alpha = 35 + G.name = "[M]'s astral projection" + M.mind.transfer_to(G) + sleepytime = 15*volume if(overdosed) if(prob(50)) to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") do_teleport(G, M.loc) - M.reagents.remove_reagent(id, current_cycle/2, FALSE) + M.reagents.remove_reagent(id, current_cycle/2, FALSE)//exponent ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) @@ -78,7 +77,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die to_chat(M, "You notice your body starting to disappear, maybe you took too much Astrogen...?") M.alpha-- antiGenetics-- - log_game("FERMICHEM: [M] ckey: [M.key] has become addicted to Astrogen") + log_game("FERMICHEM: [M] ckey: [M.key] has become addicted to Astrogen") if(220) to_chat(M, "Your addiction is only getting worse as your body disappears. Maybe you should get some more, and fast?") M.alpha-- @@ -111,5 +110,5 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") message_admins("[M] (ckey: [M.ckey]) has become one with the universe, and have continuous memories thoughout their lives should they find a way to come back to life (such as an inteligence potion, midround antag, ghost role).") qdel(M) //Approx 60minutes till death from initial addiction - log_game("FERMICHEM: [M] ckey: [M.key] has been obliterated from Astrogen addiction") + log_game("FERMICHEM: [M] ckey: [M.key] has been obliterated from Astrogen addiction") ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index 65252ba73c..dedaf37c6b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -23,27 +23,23 @@ addiction_stage4_end = 44 //Incase it's too long var/location_created var/turf/open/location_return = null - var/addictCyc1 = 0 - var/addictCyc2 = 0 var/addictCyc3 = 0 - var/addictCyc4 = 0 var/mob/living/fermi_Tclone = null var/teleBool = FALSE pH = 3.7 //Main functions /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! - log_game("FERMICHEM: [M] ckey: [M.key] took eigenstasium") - switch(current_cycle) - if(0) - location_return = get_turf(M) //sets up return point - to_chat(M, "You feel your wavefunction split!") - if(purity > 0.75) //Teleports you home if it's pure enough - log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium") - var/turf/open/creation = location_created - do_sparks(5,FALSE,M) - do_teleport(M, creation, 0, asoundin = 'sound/effects/phasein.ogg') - do_sparks(5,FALSE,M) + log_game("FERMICHEM: [M] ckey: [M.key] took eigenstasium") + if(current_cycle == 0) + location_return = get_turf(M) //sets up return point + to_chat(M, "You feel your wavefunction split!") + if(purity > 0.75) //Teleports you home if it's pure enough + log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium") + var/turf/open/creation = location_created + do_sparks(5,FALSE,M) + do_teleport(M, creation, 0, asoundin = 'sound/effects/phasein.ogg') + do_sparks(5,FALSE,M) if(prob(20)) do_sparks(5,FALSE,M) ..() @@ -58,7 +54,7 @@ /datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly . = ..() to_chat(M, "Oh god, you feel like your wavefunction is about to tear.") - log_game("FERMICHEM: [M] ckey: [M.key] has overdosed on eigenstasium") + log_game("FERMICHEM: [M] ckey: [M.key] has overdosed on eigenstasium") M.Jitter(10) /datum/reagent/fermi/eigenstate/overdose_process(mob/living/M) //Overdose, makes you teleport randomly, probably one of my favourite effects. Sometimes kills you. @@ -70,22 +66,19 @@ //Addiction /datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride. - switch(addictCyc1) - if(1) - to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") - log_game("FERMICHEM: [M] ckey: [M.key] has become addicted to eigenstasium") - M.Jitter(10) + if(addiction_stage == 0) + to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") + log_game("FERMICHEM: [M] ckey: [M.key] has become addicted to eigenstasium") + M.Jitter(10) M.nutrition = M.nutrition - (M.nutrition/15) - addictCyc1++ ..() /datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M) - switch(addictCyc2) - if(0) - to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") - M.Jitter(50) - M.Knockdown(100) - M.Stun(40) + if(addiction_stage == 11) + to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") + M.Jitter(50) + M.Knockdown(100) + M.Stun(40) var/items = M.get_contents() if(!LAZYLEN(items)) @@ -95,16 +88,15 @@ do_sparks(5,FALSE,I) do_teleport(I, get_turf(I), 5, no_effects=TRUE); do_sparks(5,FALSE,I) - addictCyc2++ ..() /datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in - switch(addictCyc3) + switch(addictCyc3) //Loops 0 -> 1 -> 2 -> 0 ...ect. if(0) M.Jitter(100) - to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the eigenstate event horizon.") + to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the event horizon.") if(1) var/typepath = M.type fermi_Tclone = new typepath(M.loc) @@ -117,7 +109,7 @@ C.emote("spin") M.emote("spin") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) - C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! O� suis-je?!", "Yee haw! This is one hell of a hootenanny!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "I've come from the future to warn you to not take eigenstasium! Oh no! I'm too late!", "You fool! You took too much eigenstasium! You've doomed us all!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Fermichem was a mistake", "This is one hell of a beepsky smash.", "Now neither of us will be virgins!")]\"") + C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! Ou suis-je?!", "Yee haw! This is one hell of a hootenanny!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "I've come from the future to warn you to not take eigenstasium! Oh no! I'm too late!", "You fool! You took too much eigenstasium! You've doomed us all!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Fermichem was a mistake", "This is one hell of a beepsky smash.", "Now neither of us will be virgins!")]\"") if(2) var/mob/living/carbon/C = fermi_Tclone do_sparks(5,FALSE,C) @@ -131,7 +123,7 @@ ..() /datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery. - if(addictCyc4 == 0) + if(addiction_stage == 42) do_sparks(5,FALSE,M) do_teleport(M, get_turf(M), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! do_sparks(5,FALSE,M) @@ -140,7 +132,7 @@ M.Knockdown(0) to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) - log_game("FERMICHEM: [M] ckey: [M.key] has become an alternative universe version of themselves.") + log_game("FERMICHEM: [M] ckey: [M.key] has become an alternative universe version of themselves.") M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) for(var/datum/mood_event/Me in M) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, Me) //Why does this not work? @@ -149,7 +141,6 @@ if(prob(20)) do_sparks(5,FALSE,M) - addictCyc4++ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[id]_overdose")//holdover until above fix works ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index b62f04c65a..e9c74e9c61 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -47,7 +47,7 @@ B.throw_at(T2, 8, 1) M.reagents.remove_reagent(id, volume) return - log_game("FERMICHEM: [M] ckey: [M.key] has ingested Sucubus milk") + log_game("FERMICHEM: [M] ckey: [M.key] has ingested Sucubus milk") var/mob/living/carbon/human/H = M H.genital_override = TRUE var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") @@ -105,6 +105,7 @@ //Acute hepatic pharmacokinesis. if(M.has_trait(TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") + L.swelling+= 0.05 return ..() var/obj/item/organ/genital/penis/P = M.getorganslot("penis") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index ed461698d4..d0c25cfb86 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -368,9 +368,8 @@ holder.remove_reagent(id, volume) ..() -//ReagentVars //Turns you into a cute catto while it's in your system. -//If you manage to gamble perfectly, makes you a catgirl after you transform back. But really, you shouldn't end up with that with how random it is. +//If you manage to gamble perfectly, makes you have cat ears after you transform back. But really, you shouldn't end up with that with how random it is. /datum/reagent/fermi/secretcatchem //Should I hide this from code divers? A secret cit chem? name = "secretcatchem" //an attempt at hiding it id = "secretcatchem" @@ -381,7 +380,7 @@ var/mob/living/simple_animal/pet/cat/custom_cat/catto = null /datum/reagent/fermi/secretcatchem/New() - name = "Catbalti[pick("a","u","e","y")]m [pick("apex", "prime", "meow")]" + name = "Catbalti[pick("a","u","e","y")]m [pick("apex", "prime", "meow")]"//rename /datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H) . = ..() @@ -399,7 +398,7 @@ catto.desc = "A cute catto! They remind you of [H] somehow." catto.color = "#[H.dna.features["mcolor"]]" H.moveToNullspace() - log_game("FERMICHEM: [M] ckey: [M.key] has been made into a cute catto.") + log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.") /datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) if(prob(5)) @@ -416,4 +415,4 @@ H.say("*wag")//force update sprites. to_chat(H, "[words]") qdel(catto) - log_game("FERMICHEM: [M] ckey: [M.key] has returned to normal") + log_game("FERMICHEM: [H] ckey: [H.key] has returned to normal") From d6edc8db1fafc2126adcc4324af7c82dcc6a5af5 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 14 Jun 2019 11:43:01 +0100 Subject: [PATCH 258/608] Preweakeness --- code/modules/reagents/reagent_containers.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 7b75d53779..f83977ba3f 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -15,10 +15,9 @@ var/spawned_disease = null var/disease_amount = 20 var/spillable = FALSE - var/beaker_resistances = NONE + var/beaker_resistances |= FLAG_STATUS_PH_IMMUNE | FLAG_STATUS_TEMP_IMMUNE /obj/item/reagent_containers/Initialize(mapload, vol) - beaker_resistances |= FLAG_STATUS_PH_IMMUNE | FLAG_STATUS_TEMP_IMMUNE . = ..() if(isnum(vol) && vol > 0) volume = vol From e95b371ea5b4d9dd8603ac87aa2662fe1b28e444 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 14 Jun 2019 11:56:28 +0100 Subject: [PATCH 259/608] Changed to weakness --- code/modules/reagents/reagent_containers.dm | 12 +++++----- .../reagents/reagent_containers/glass.dm | 22 +++++++++---------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index f83977ba3f..4c1d220c4b 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -1,6 +1,6 @@ #define FLAG_STATUS_NONE (1 << 0) -#define FLAG_STATUS_PH_IMMUNE (1 << 1) -#define FLAG_STATUS_TEMP_IMMUNE (1 << 2) +#define FLAG_STATUS_PH (1 << 1) +#define FLAG_STATUS_TEMP (1 << 2) /obj/item/reagent_containers name = "Container" @@ -15,7 +15,7 @@ var/spawned_disease = null var/disease_amount = 20 var/spillable = FALSE - var/beaker_resistances |= FLAG_STATUS_PH_IMMUNE | FLAG_STATUS_TEMP_IMMUNE + var/beaker_weaknesses = NONE /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() @@ -130,7 +130,7 @@ //melts plastic beakers /obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M) reagents.expose_temperature(1000) - if(!beaker_resistances == FLAG_STATUS_TEMP_IMMUNE) + if(beaker_weaknesses == FLAG_STATUS_TEMP) var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) for(var/mob/H in seen) @@ -142,7 +142,7 @@ //melts plastic beakers /obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) reagents.expose_temperature(exposed_temperature) - if(!beaker_resistances == FLAG_STATUS_TEMP_IMMUNE) + if(beaker_weaknesses == FLAG_STATUS_TEMP) if(reagents.chem_temp > 444)//assuming polypropylene var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) @@ -153,7 +153,7 @@ //melts glass beakers /obj/item/reagent_containers/proc/pH_check() - if(!beaker_resistances == FLAG_STATUS_PH_IMMUNE) + if(beaker_weaknesses == FLAG_STATUS_PH) if((reagents.pH < 0.5) || (reagents.pH > 13.5)) var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 6c04af50c8..7f0aa0bfc1 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -113,7 +113,7 @@ icon_state = "beaker" item_state = "beaker" materials = list(MAT_GLASS=500) - beaker_resistances = FLAG_STATUS_TEMP_IMMUNE + beaker_weaknesses |= FLAG_STATUS_PH /obj/item/reagent_containers/glass/beaker/Initialize() . = ..() @@ -165,7 +165,6 @@ volume = 100 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100) - beaker_resistances &= ~FLAG_STATUS_PH_IMMUNE /obj/item/reagent_containers/glass/beaker/plastic name = "x-large beaker" @@ -175,8 +174,8 @@ volume = 150 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,150) - beaker_resistances &= ~FLAG_STATUS_TEMP_IMMUNE - beaker_resistances |= FLAG_STATUS_PH_IMMUNE + beaker_weaknesses &= ~FLAG_STATUS_PH + beaker_weaknesses |= FLAG_STATUS_TEMP /obj/item/reagent_containers/glass/beaker/plastic/update_icon() icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states @@ -191,7 +190,7 @@ volume = 200 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,200) - beaker_resistances |= FLAG_STATUS_PH_IMMUNE | FLAG_STATUS_TEMP_IMMUNE + beaker_weaknesses &= ~FLAG_STATUS_PH /obj/item/reagent_containers/glass/beaker/noreact name = "cryostasis beaker" @@ -201,7 +200,7 @@ materials = list(MAT_METAL=3000) volume = 50 amount_per_transfer_from_this = 10 - beaker_resistances |= FLAG_STATUS_PH_IMMUNE | FLAG_STATUS_TEMP_IMMUNE + beaker_weaknesses &= ~FLAG_STATUS_PH /obj/item/reagent_containers/glass/beaker/noreact/Initialize() . = ..() @@ -217,7 +216,6 @@ volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300) - beaker_resistances &= ~FLAG_STATUS_PH_IMMUNE /obj/item/reagent_containers/glass/beaker/cryoxadone list_reagents = list("cryoxadone" = 30) @@ -274,7 +272,7 @@ SLOT_L_STORE, SLOT_R_STORE,\ SLOT_GENERC_DEXTROUS_STORAGE ) - beaker_resistances &= ~FLAG_STATUS_PH_IMMUNE + beaker_weaknesses &= ~FLAG_STATUS_PH_IMMUNE /obj/item/reagent_containers/glass/bucket/attackby(obj/O, mob/user, params) if(istype(O, /obj/item/mop)) @@ -324,8 +322,8 @@ materials = list(MAT_GLASS=0) volume = 50 amount_per_transfer_from_this = 10 - beaker_resistances &= ~FLAG_STATUS_PH_IMMUNE - beaker_resistances &= ~FLAG_STATUS_TEMP_IMMUNE + beaker_weaknesses |= FLAG_STATUS_PH + beaker_weaknesses |= FLAG_STATUS_TEMP /obj/item/reagent_containers/glass/beaker/waterbottle/empty list_reagents = list() @@ -337,8 +335,8 @@ list_reagents = list("water" = 100) volume = 100 amount_per_transfer_from_this = 20 - beaker_resistances &= ~FLAG_STATUS_PH_IMMUNE - beaker_resistances &= ~FLAG_STATUS_TEMP_IMMUNE + beaker_weaknesses |= FLAG_STATUS_PH + beaker_weaknesses |= FLAG_STATUS_TEMP /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty list_reagents = list() From 2365f7337c8a49261bdd1db684c6099a778894ac Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 14 Jun 2019 12:47:22 +0100 Subject: [PATCH 260/608] Adventures in bitflags! --- code/modules/reagents/reagent_containers.dm | 13 +++++----- .../reagents/reagent_containers/glass.dm | 25 +++++++++++-------- .../chemistry/reagents/eigentstasium.dm | 4 +-- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 4c1d220c4b..9a1a58a21d 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -1,6 +1,5 @@ -#define FLAG_STATUS_NONE (1 << 0) -#define FLAG_STATUS_PH (1 << 1) -#define FLAG_STATUS_TEMP (1 << 2) +#define PH_WEAK (1 << 0) +#define TEMP_WEAK (1 << 1) /obj/item/reagent_containers name = "Container" @@ -15,7 +14,7 @@ var/spawned_disease = null var/disease_amount = 20 var/spillable = FALSE - var/beaker_weaknesses = NONE + var/beaker_weakness_bitflag = NONE//Bitflag! /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() @@ -130,7 +129,7 @@ //melts plastic beakers /obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M) reagents.expose_temperature(1000) - if(beaker_weaknesses == FLAG_STATUS_TEMP) + if(beaker_weakness_bitflag & TEMP_WEAK) var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) for(var/mob/H in seen) @@ -142,7 +141,7 @@ //melts plastic beakers /obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) reagents.expose_temperature(exposed_temperature) - if(beaker_weaknesses == FLAG_STATUS_TEMP) + if(beaker_weakness_bitflag & TEMP_WEAK) if(reagents.chem_temp > 444)//assuming polypropylene var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) @@ -153,7 +152,7 @@ //melts glass beakers /obj/item/reagent_containers/proc/pH_check() - if(beaker_weaknesses == FLAG_STATUS_PH) + if(beaker_weakness_bitflag & PH_WEAK) if((reagents.pH < 0.5) || (reagents.pH > 13.5)) var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 7f0aa0bfc1..709a73d1ba 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -113,7 +113,7 @@ icon_state = "beaker" item_state = "beaker" materials = list(MAT_GLASS=500) - beaker_weaknesses |= FLAG_STATUS_PH + beaker_weakness_bitflag = PH_WEAK /obj/item/reagent_containers/glass/beaker/Initialize() . = ..() @@ -174,8 +174,10 @@ volume = 150 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,150) - beaker_weaknesses &= ~FLAG_STATUS_PH - beaker_weaknesses |= FLAG_STATUS_TEMP + +/obj/item/reagent_containers/glass/beaker/plastic/Initialize() + beaker_weakness_bitflag &= ~PH_WEAK + beaker_weakness_bitflag |= TEMP_WEAK /obj/item/reagent_containers/glass/beaker/plastic/update_icon() icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states @@ -190,7 +192,9 @@ volume = 200 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,200) - beaker_weaknesses &= ~FLAG_STATUS_PH + +/obj/item/reagent_containers/glass/beaker/meta/Initialize() + beaker_weakness_bitflag &= ~PH_WEAK /obj/item/reagent_containers/glass/beaker/noreact name = "cryostasis beaker" @@ -200,9 +204,9 @@ materials = list(MAT_METAL=3000) volume = 50 amount_per_transfer_from_this = 10 - beaker_weaknesses &= ~FLAG_STATUS_PH /obj/item/reagent_containers/glass/beaker/noreact/Initialize() + beaker_weakness_bitflag &= ~PH_WEAK . = ..() reagents.set_reacting(FALSE) @@ -272,7 +276,9 @@ SLOT_L_STORE, SLOT_R_STORE,\ SLOT_GENERC_DEXTROUS_STORAGE ) - beaker_weaknesses &= ~FLAG_STATUS_PH_IMMUNE + +/obj/item/reagent_containers/glass/bucket/Initialize() + beaker_weakness_bitflag |= TEMP_WEAK /obj/item/reagent_containers/glass/bucket/attackby(obj/O, mob/user, params) if(istype(O, /obj/item/mop)) @@ -322,8 +328,9 @@ materials = list(MAT_GLASS=0) volume = 50 amount_per_transfer_from_this = 10 - beaker_weaknesses |= FLAG_STATUS_PH - beaker_weaknesses |= FLAG_STATUS_TEMP + +/obj/item/reagent_containers/glass/beaker/waterbottle/Initialize() + beaker_weakness_bitflag |= TEMP_WEAK /obj/item/reagent_containers/glass/beaker/waterbottle/empty list_reagents = list() @@ -335,8 +342,6 @@ list_reagents = list("water" = 100) volume = 100 amount_per_transfer_from_this = 20 - beaker_weaknesses |= FLAG_STATUS_PH - beaker_weaknesses |= FLAG_STATUS_TEMP /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty list_reagents = list() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index dedaf37c6b..e2a71a3759 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -55,13 +55,13 @@ . = ..() to_chat(M, "Oh god, you feel like your wavefunction is about to tear.") log_game("FERMICHEM: [M] ckey: [M.key] has overdosed on eigenstasium") - M.Jitter(10) + M.Jitter(20) + metabolization_rate += 0.5 //So you're not stuck forever teleporting. /datum/reagent/fermi/eigenstate/overdose_process(mob/living/M) //Overdose, makes you teleport randomly, probably one of my favourite effects. Sometimes kills you. do_sparks(5,FALSE,src) do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) - M.reagents.remove_reagent(id, 0.5)//So you're not stuck for 10 minutes teleporting ..() //Addiction From d7cffadc13accc4c54fee0e11a870629d761d479 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 14 Jun 2019 13:43:57 +0100 Subject: [PATCH 261/608] Fixes --- code/modules/reagents/chemistry/holder.dm | 3 +++ .../reagents/reagent_containers/glass.dm | 3 +++ code/modules/surgery/organs/vocal_cords.dm | 10 ++++++- .../code/datums/status_effects/chems.dm | 3 ++- .../chemistry/reagents/eigentstasium.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 12 ++++----- .../objects/{fermiclothes.dm => clothes.dm} | 13 ++++++++-- .../code/modules/reagents/objects/items.dm | 26 +++++++++++++++++-- 8 files changed, 59 insertions(+), 13 deletions(-) rename modular_citadel/code/modules/reagents/objects/{fermiclothes.dm => clothes.dm} (81%) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index a32ea45a01..75caca79ea 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -524,6 +524,7 @@ fermiIsReacting = FALSE reactedVol = 0 targetVol = 0 + holder.pH_check() C.FermiFinish(src, my_atom, multiplier) handle_reactions() update_total() @@ -549,6 +550,7 @@ fermiIsReacting = FALSE reactedVol = 0 targetVol = 0 + holder.pH_check() C.FermiFinish(src, my_atom, multiplier) handle_reactions() update_total() @@ -564,6 +566,7 @@ fermiIsReacting = FALSE reactedVol = 0 targetVol = 0 + holder.pH_check() C.FermiFinish(src, my_atom, multiplier) handle_reactions() update_total() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 709a73d1ba..28fc36e080 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -178,6 +178,7 @@ /obj/item/reagent_containers/glass/beaker/plastic/Initialize() beaker_weakness_bitflag &= ~PH_WEAK beaker_weakness_bitflag |= TEMP_WEAK + . = ..() /obj/item/reagent_containers/glass/beaker/plastic/update_icon() icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states @@ -195,6 +196,7 @@ /obj/item/reagent_containers/glass/beaker/meta/Initialize() beaker_weakness_bitflag &= ~PH_WEAK + . = ..() /obj/item/reagent_containers/glass/beaker/noreact name = "cryostasis beaker" @@ -279,6 +281,7 @@ /obj/item/reagent_containers/glass/bucket/Initialize() beaker_weakness_bitflag |= TEMP_WEAK + . = ..() /obj/item/reagent_containers/glass/bucket/attackby(obj/O, mob/user, params) if(istype(O, /obj/item/mop)) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index d5f8700f6c..6c40f2f4ca 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -620,7 +620,15 @@ var/next_command = 0 var/cooldown_mod = 1 var/base_multiplier = 1 - //spans = list("say","yell") + +/datum/action/item_action/organ_action/velvet/Trigger() + . = ..() + var/command = input(owner, "Speak with the Voice of God", "Command") + if(QDELETED(src) || QDELETED(owner)) + return + if(!command) + return + owner.say(".x[command]") /obj/item/organ/vocal_cords/velvet/handle_speech(message) //actually say the message owner.say(message, spans = spans, sanitize = FALSE) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index b201f394cc..abba911bf2 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -280,7 +280,7 @@ resistanceTally /= 2 enthrallTally = 0 if(owner.lewd) - to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") + to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") else else if (resistanceTally > 150) @@ -512,6 +512,7 @@ if (tranceTime > 0) //custom trances only last 50 ticks. tranceTime -= 1 else if (!tranceTime == null) //remove trance after. + M.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) M.remove_status_effect(/datum/status_effect/trance) tranceTime = null //..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index e2a71a3759..6292a54d3b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -34,7 +34,7 @@ if(current_cycle == 0) location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") - if(purity > 0.75) //Teleports you home if it's pure enough + if(purity > 0.8 && location_created) //Teleports you home if it's pure enough log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium") var/turf/open/creation = location_created do_sparks(5,FALSE,M) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index d0c25cfb86..19b3842000 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -94,12 +94,12 @@ /datum/reagent/fermi/hatmium/on_mob_life(mob/living/carbon/human/M) if(!M.head == /obj/item/clothing/head/hattip) return ..() - var/hatArmor = (1+(current_cycle/30))*purity - for(var/datum/armor/i in M.head) - if(!overdosed) - i = hatArmor - else - i = -hatArmor + if(!overdosed) + var/hatArmor = purity + else + var/hatArmor = - purity + var/obj/item/W = M.head + W.modifyAllRatings(hatArmor) ..() //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm similarity index 81% rename from modular_citadel/code/modules/reagents/objects/fermiclothes.dm rename to modular_citadel/code/modules/reagents/objects/clothes.dm index 4a601d4d67..df878da544 100644 --- a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm +++ b/modular_citadel/code/modules/reagents/objects/clothes.dm @@ -19,18 +19,27 @@ user.emote("me",1,"admires such a spiffy hat.",TRUE) return ..() +/obj/item/clothing/head/foilhat/MouseDrop(atom/over_object) + //You sure do love tipping your hat. + if(usr) + var/mob/living/carbon/C = usr + if(src == C.head) + C.emote("me",1,"tips their hat.",TRUE) + return + ..() + /obj/item/clothing/head/hattip/speechModification(message, /mob/living/carbon/C) ..() var/mob/living/carbon/C = get_wearer()//user var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE) if (T.name == "fluffy tongue") if(prob(0.01)) - message += "\" and tips their hat. \"swpy's sappin' my swentwy uwu!!" + message += "\" and tips their hat. \"swpy's sappin' my chem dispwencer uwu!!" return message message += "\" and tips their hat. \"[pick("weehaw!", "bwoy howdy.", "dawn tuutin'.", "weww don't that beat aww.", "whoooowee, wouwd ya wook at that!", "whoooowee! makin' bwacon!", "cweam gwavy!", "yippekeeyah-heeyapeeah-kwayoh!", "mwove 'em uut!", "gwiddy up!")]" return message if(prob(0.01)) - message += "\" and tips their hat. \"Spy's sappin' my Sentry!" + message += "\" and tips their hat. \"Spy's sappin' my chem dispenser!"//How did I not think of this earlier message_admins("I really appreciate all the hard work you put into adminning citadel, I hope you're all having a good day and I hope this hidden and rare message admins brightens up your day.") return message message += "\" and tips their hat. \"[pick("Yeehaw!", "Boy howdy.", "Darn tootin'.", "Well don't that beat all.", "Whoooowee, would ya look at that!", "Whoooowee! Makin' bacon!", "Cream Gravy!", "Yippekeeyah-heeyapeeah-kayoh!", "Move 'em out!", "Giddy up!")]" diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index fb84db7d39..795b18fedc 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -10,7 +10,7 @@ //A little janky with pockets /obj/item/FermiChem/pHbooklet/attack_hand(mob/user) - if(user.get_held_index_of_item(src)) + if(user.get_held_index_of_item(src))//Does this check pockets too..? if(numberOfPages >= 1) var/obj/item/FermiChem/pHpaper/P = new /obj/item/FermiChem/pHpaper P.add_fingerprint(user) @@ -34,6 +34,28 @@ if(!I) user.put_in_active_hand(src) +/obj/item/FermiChem/pHbooklet/MouseDrop(atom/over_object) + if(user.get_held_index_of_item(src)) + user.put_in_active_hand(src) + else + if(numberOfPages >= 1) + var/obj/item/FermiChem/pHpaper/P = new /obj/item/FermiChem/pHpaper + P.add_fingerprint(user) + P.forceMove(user.loc) + user.put_in_active_hand(P) + to_chat(user, "You take [P] out of \the [src].") + numberOfPages-- + playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1) + add_fingerprint(user) + if(numberOfPages == 0) + icon_state = "pHbookletEmpty" + return + else + to_chat(user, "[src] is empty!") + add_fingerprint(user) + return + ..() + /obj/item/FermiChem/pHpaper name = "pH indicator strip" desc = "A piece of paper that will change colour depending on the pH of a solution." @@ -51,7 +73,7 @@ if(used == TRUE) to_chat(user, "[user] has already been used!") return - if(LAZYLEN(cont.reagents.reagent_list)) + if(!LAZYLEN(cont.reagents.reagent_list)) return switch(round(cont.reagents.pH, 1)) if(14 to INFINITY) From b4beb006f9e78f03e7cea532ad05988bb9043814 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 14 Jun 2019 15:43:48 +0100 Subject: [PATCH 262/608] More fixes. --- code/modules/reagents/chemistry/holder.dm | 20 ++++++++++++++----- code/modules/surgery/organs/liver.dm | 1 + code/modules/surgery/organs/organ_internal.dm | 1 + code/modules/surgery/organs/vocal_cords.dm | 2 +- .../code/datums/status_effects/chems.dm | 1 - .../chemistry/reagents/eigentstasium.dm | 6 +++--- .../chemistry/reagents/fermi_reagents.dm | 18 +++++++++++------ .../code/modules/reagents/objects/clothes.dm | 2 +- .../code/modules/reagents/objects/items.dm | 2 +- tgstation.dme | 2 +- 10 files changed, 36 insertions(+), 19 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 75caca79ea..be879ba08e 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -524,7 +524,10 @@ fermiIsReacting = FALSE reactedVol = 0 targetVol = 0 - holder.pH_check() + //pH check, handled at the end to reduce calls. + if(istype(my_atom, /obj/item/reagent_containers)) + var/obj/item/reagent_containers/RC = my_atom + RC.pH_check() C.FermiFinish(src, my_atom, multiplier) handle_reactions() update_total() @@ -550,7 +553,10 @@ fermiIsReacting = FALSE reactedVol = 0 targetVol = 0 - holder.pH_check() + //pH check, handled at the end to reduce calls. + if(istype(my_atom, /obj/item/reagent_containers)) + var/obj/item/reagent_containers/RC = my_atom + RC.pH_check() C.FermiFinish(src, my_atom, multiplier) handle_reactions() update_total() @@ -566,7 +572,10 @@ fermiIsReacting = FALSE reactedVol = 0 targetVol = 0 - holder.pH_check() + //pH check, handled at the end to reduce calls. + if(istype(my_atom, /obj/item/reagent_containers)) + var/obj/item/reagent_containers/RC = my_atom + RC.pH_check() C.FermiFinish(src, my_atom, multiplier) handle_reactions() update_total() @@ -860,8 +869,9 @@ if(my_atom) my_atom.on_reagent_change(ADD_REAGENT) R.on_merge(data, amount, my_atom, other_purity) - if(R.OnMobMergeCheck == TRUE)//Forces on_mob_add proc when a chem is merged - R.on_mob_add(my_atom, amount) + if(isliving(my_atom)) + if(R.OnMobMergeCheck == TRUE)//Forces on_mob_add proc when a chem is merged + R.on_mob_add(my_atom, amount) if(!no_react) handle_reactions() diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index d568d66d78..375310b805 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -58,6 +58,7 @@ //Just in case /obj/item/organ/liver/Remove(mob/living/carbon/M, special = 0) + ..() M.remove_movespeed_modifier(LIVER_SWELLING_MOVE_MODIFY) M.ResetBloodVol() //At the moment, this shouldn't allow application twice. You either have this OR a thirsty ferret. sizeMoveMod(1, M) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 1408bff60c..018a6c2e0c 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -22,6 +22,7 @@ if(replaced) replaced.Remove(M, special = 1) if(drop_if_replaced) + message_admins("[get_turf(M)]") replaced.forceMove(get_turf(M)) else qdel(replaced) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 6c40f2f4ca..7bae833245 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1239,7 +1239,7 @@ else return - if(message_admins) + if(message_admins)//Do you want this in? message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") log_game("FERMICHEM: [key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") //SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) If this is on, it fills the thing up and OOFs the server diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index abba911bf2..f1c802ab0d 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -714,5 +714,4 @@ if(M.has_trait(TRAIT_MINDSHIELD)) deltaResist += 5//even faster! - message_admins("Enthrall processing for [M]: enthrallTally: [enthrallTally], resistanceTally: [resistanceTally], delta: [deltaResist]") return diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index 6292a54d3b..7794037e27 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -21,7 +21,7 @@ addiction_stage2_end = 30 addiction_stage3_end = 41 addiction_stage4_end = 44 //Incase it's too long - var/location_created + var/turf/location_created var/turf/open/location_return = null var/addictCyc3 = 0 var/mob/living/fermi_Tclone = null @@ -36,9 +36,9 @@ to_chat(M, "You feel your wavefunction split!") if(purity > 0.8 && location_created) //Teleports you home if it's pure enough log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium") - var/turf/open/creation = location_created + //var/turf/open/creation = location_created do_sparks(5,FALSE,M) - do_teleport(M, creation, 0, asoundin = 'sound/effects/phasein.ogg') + do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,M) if(prob(20)) do_sparks(5,FALSE,M) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 19b3842000..f081bef0b8 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -83,7 +83,7 @@ . = ..() if(M.head) var/obj/item/W = M.head - if(W == /obj/item/clothing/head/hattip) + if(istype(W, /obj/item/clothing/head/hattip)) qdel(W) else M.dropItemToGround(W, TRUE) @@ -92,14 +92,15 @@ /datum/reagent/fermi/hatmium/on_mob_life(mob/living/carbon/human/M) - if(!M.head == /obj/item/clothing/head/hattip) + if(!istype(M.head, /obj/item/clothing/head/hattip)) return ..() + var/hatArmor = 0 if(!overdosed) - var/hatArmor = purity + hatArmor = (purity/10) else - var/hatArmor = - purity + hatArmor = - (purity/10) var/obj/item/W = M.head - W.modifyAllRatings(hatArmor) + W.armor = W.armor.modifyAllRatings(hatArmor) ..() //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -399,9 +400,14 @@ catto.color = "#[H.dna.features["mcolor"]]" H.moveToNullspace() log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.") + //Just to deal with rascally ghosts + catto.add_trait(TRAIT_NODEATH, "catto") /datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) - if(prob(5)) + if(catto.health <= 50) + catto.icon_state = "custom_cat_dead" + catto.stun(1000) + else if(prob(5)) playsound(get_turf(catto), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) catto.say("lets out a meowrowr!*") ..() diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm index df878da544..cab2e41947 100644 --- a/modular_citadel/code/modules/reagents/objects/clothes.dm +++ b/modular_citadel/code/modules/reagents/objects/clothes.dm @@ -19,7 +19,7 @@ user.emote("me",1,"admires such a spiffy hat.",TRUE) return ..() -/obj/item/clothing/head/foilhat/MouseDrop(atom/over_object) +/obj/item/clothing/head/hattip/MouseDrop(atom/over_object) //You sure do love tipping your hat. if(usr) var/mob/living/carbon/C = usr diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 795b18fedc..a5e5d02da4 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -34,7 +34,7 @@ if(!I) user.put_in_active_hand(src) -/obj/item/FermiChem/pHbooklet/MouseDrop(atom/over_object) +/obj/item/FermiChem/pHbooklet/MouseDrop(atom/over_object, mob/user) if(user.get_held_index_of_item(src)) user.put_in_active_hand(src) else diff --git a/tgstation.dme b/tgstation.dme index 00d3bcbed8..d411c46f94 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -3016,7 +3016,7 @@ #include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\SDGF.dm" #include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm" -#include "modular_citadel\code\modules\reagents\objects\fermiclothes.dm" +#include "modular_citadel\code\modules\reagents\objects\clothes.dm" #include "modular_citadel\code\modules\reagents\objects\items.dm" #include "modular_citadel\code\modules\reagents\reagent container\cit_kegs.dm" #include "modular_citadel\code\modules\reagents\reagent container\hypospraymkii.dm" From aa1cb22edccc23a69a96360c5a6a84ab2e1b1e8b Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 14 Jun 2019 16:26:08 +0100 Subject: [PATCH 263/608] Eigenstate fixes. --- code/modules/reagents/reagent_containers.dm | 2 +- .../reagents/reagent_containers/glass.dm | 1 + .../chemistry/reagents/eigentstasium.dm | 20 +++++++++---------- .../chemistry/reagents/fermi_reagents.dm | 2 +- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 9a1a58a21d..e7ce36e557 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -142,7 +142,7 @@ /obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) reagents.expose_temperature(exposed_temperature) if(beaker_weakness_bitflag & TEMP_WEAK) - if(reagents.chem_temp > 444)//assuming polypropylene + if(reagents.chem_temp >= 444)//assuming polypropylene var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) for(var/mob/M in seen) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 28fc36e080..1175e7f17b 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -334,6 +334,7 @@ /obj/item/reagent_containers/glass/beaker/waterbottle/Initialize() beaker_weakness_bitflag |= TEMP_WEAK + . = ..() /obj/item/reagent_containers/glass/beaker/waterbottle/empty list_reagents = list() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index 7794037e27..2b0a54b081 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -17,7 +17,7 @@ color = "#5020H4" // rgb: 50, 20, 255 overdose_threshold = 15 addiction_threshold = 15 - metabolization_rate = 0.5 * REAGENTS_METABOLISM + metabolization_rate = 1.2 * REAGENTS_METABOLISM addiction_stage2_end = 30 addiction_stage3_end = 41 addiction_stage4_end = 44 //Incase it's too long @@ -34,11 +34,11 @@ if(current_cycle == 0) location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") - if(purity > 0.8 && location_created) //Teleports you home if it's pure enough + if(purity > 0.9) //Teleports you home if it's pure enough log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium") //var/turf/open/creation = location_created do_sparks(5,FALSE,M) - do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg') + do_teleport(M, loc, 0, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,M) if(prob(20)) do_sparks(5,FALSE,M) @@ -59,14 +59,13 @@ metabolization_rate += 0.5 //So you're not stuck forever teleporting. /datum/reagent/fermi/eigenstate/overdose_process(mob/living/M) //Overdose, makes you teleport randomly, probably one of my favourite effects. Sometimes kills you. - do_sparks(5,FALSE,src) do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) ..() //Addiction /datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride. - if(addiction_stage == 0) + if(addiction_stage == 1) to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") log_game("FERMICHEM: [M] ckey: [M.key] has become addicted to eigenstasium") M.Jitter(10) @@ -76,9 +75,9 @@ /datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M) if(addiction_stage == 11) to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.") - M.Jitter(50) - M.Knockdown(100) - M.Stun(40) + M.Jitter(200) + M.Knockdown(200) + M.Stun(80) var/items = M.get_contents() if(!LAZYLEN(items)) @@ -91,7 +90,6 @@ ..() /datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! - //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in switch(addictCyc3) //Loops 0 -> 1 -> 2 -> 0 ...ect. if(0) @@ -127,9 +125,9 @@ do_sparks(5,FALSE,M) do_teleport(M, get_turf(M), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! do_sparks(5,FALSE,M) - M.Sleeping(50, 0) + M.Sleeping(100, 0) M.Jitter(50) - M.Knockdown(0) + M.Knockdown(100) to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) log_game("FERMICHEM: [M] ckey: [M.key] has become an alternative universe version of themselves.") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index f081bef0b8..d7c89150f8 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -406,7 +406,7 @@ /datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) if(catto.health <= 50) catto.icon_state = "custom_cat_dead" - catto.stun(1000) + catto.Stun(1000) else if(prob(5)) playsound(get_turf(catto), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) catto.say("lets out a meowrowr!*") From 3700e1c7cd91d3b03a501ec73d2494dfb1e44b33 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 14 Jun 2019 21:35:20 +0100 Subject: [PATCH 264/608] Updating dmis --- .../icons/obj/genitals/breasts.dmi | Bin 944 -> 1407 bytes .../icons/obj/genitals/breasts_onmob.dmi | Bin 3929 -> 8830 bytes .../icons/obj/genitals/vagina_onmob.dmi | Bin 1203 -> 1330 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modular_citadel/icons/obj/genitals/breasts.dmi b/modular_citadel/icons/obj/genitals/breasts.dmi index 86eac3196a101aa4f626178d89e5bd54382b67e0..d70207ee69ace42c2e782db691617821177f0389 100644 GIT binary patch delta 1365 zcmXw(e>~H99LK+Y^kcLpA~)y9D$^z1x`m9a32QN}+Fg5OhaD|3My6D2-gLX`fIihVGT-=v7oMy}kjRi>1d@@sPi z>UilTVQ>XyvA@SvbLtiC=)J`U@l7q5F*2ALZbgV;fYc{bjAkNK3XuIFGrRJfgTcGR zM=0t~N!P|K(@b{?58!cY(oI}n3-@t9ws2 zKH0j&oY*4tb*-Cn-eU;>#%2W27e`Lw%L{R_GL%_bdV)d9TchUOjOPc_-y2X8p(Xz~ zEg9AxeDKRi)%FXSVn$U1-H=lGO`cGR#2HEYMGDOiHKuC4eC%h~Scd=)dkp zwB{oMDdbD^sn-ghYo5)r>X>}m_X0@dsuP_;Hl+g^7T+d}=v0*nZ4Vn8nS4VFozo!f z%EnSDSliIw&OI5!bc$;fN+Yd6nLbK^nYFd_aQ{ zkJxw0V}Xz+<32pKr~VdrTBZua_Lcw0wh0^VwjNH~y;spo*zjQvSnQ^=aL-@7 zEE-i(t=>0TI>?Jbcd`9i@mgdep(qr8`$pIL3cv+XD7XSwpI%5vi*4L3l$-XOO=iud zht=C=1lvzIhB`!Tvf6B8#aY6LFXs)N%kelI;H7W`$rg3j%LPnqPJ6_6`yY19nnoLX zd_@1f(TAVCJWp@X%`b3yzTf4@vM!tBUaKe)wPn?aZ0q5wH}TYjEgLL2sqphV2KPMk z&97p7>QrpS>V}s)OJRtg*~Q7fMf-A6IhZbJl|N@YSES`Tt(QK}0&PlH#LL^>&C_i` zfnh%c+f%a7A{=aoH?FY#$6FUf_!rGtM2Z=@O(}_dW9}(T^}=31QNH>S zT@Z-uJs2rtqmu2H*k-wkho4@m9873U$#-pdFq0Y&Kkxhr;`xR+mUq5{xWpz+5{KEO z55!77>~PH>vzYF^W1fyJF3_vqY@Jd}Lb^9Aap~?yj50t~aWhYIB}#YtkfSqB8mka zkiM7>pLbvI|HWt7srPm2Ec#>~Y)E?)BqDR#7Xu=+c;bCNtfS@;AC^%AVY_4ObCVKM z*r@LRing5(SK@BEC(rpyx#rBrdPGUNTfej;*Y~8uqz-Yrn1`#i_w;SIN2p!07jQ8M z0n)hKWqW^WSf1kqS7yF|OY}h4^P5q(VUL{yI@a|$j&s%K3k?v~oHSGa40BhFnA}^T U8DMFn?xzF@enGw!K4B^U0y&kjXaE2J delta 898 zcmV-|1AYAe3a|$uiBL{Q4GJ0x0000DNk~Le0001h0001h1Oos705K4J_>mz!f0}w! zSad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1Jc%^riNq?`elDrNPms} z+grv(c7}!w+RYup>6Tm$mlVZWu5%Ut5gNa`kD!&X%n;);frtcad(RWde={^t$So15 zjR9%@Kn;QV<#7deaO_}1NHea`WC94GWdd?&{0<0OCg|b_1m1&#`ab|c<9j5~9k2vC zpqKs1bW7ODWE%n#$oK>VVgK#_74XA)3;zA%2X4Xe4*g-;Lbo<}Xb7*42%eF^e^^r+ zwz!9ZR$z~T_OIWN9tQ{?e}mL;_%<7ny;<;?;EnvP-Ko7XTi|+`XotjZVMDfadI)BF zj2ie=lE3|iX#$ubg#ZCC`ZS>>Xk`70E-~W2h|mxw{Cj=j_2T*Ouc)Y~SU_nC)A1d~ zde3(d+ni5OK9FS~7i>&vSnn@LPbNi{fbs#|5gfpFj7Y%wfKJe_e^JYNQp-_JNMQ4U zv%Pgo_Ha6qoKG}>)Di3?=EoT#gnYmydG~I~mLcK_V8tqi`|X0Q{=fd%e#!?@1Bx%% znhu-}wx99=cl8{Oa{LVqO`&*p*HZI}ii#hNOe{;$!n5rL@bkU&(rSqyt0!DrVp7{D z)GDqgpiL3B7YMR?e*)PMQ5SbWaIv01Hm&#t2)LfW`9K$uAo1<&+cU2xjPeO995+VX zz5;&P;QOEI3B%`1_B#;_bA$$}Ck!(V7-rgX9e{gC^#sTV^sRm{pYi;>rvX$?*npht zhS<0EnZSCGt@!{9(1w{02|VAkdcueU_#7sG^x%5JwR~VqSQEm4<$6K}4PnM9mg@;Q zVog~pDk}aZ+pF diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi index a5a9bad6938d9f582c22654aab0b33c0cb9e946b..371041b6f43e5bcfb878cc3f3162725d82fafe8e 100644 GIT binary patch literal 8830 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 literal 3929 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 K3*h*Zvi}8Giet_I delta 1127 zcmYjOdobGv9RHCw@Vai=O| zJ2Wee%qUXNO;@iYUJ+SDJetuYQsNncDeK+-`F`)dpU3z0yLtn(@T3N0Mp+2}0JH7h z39^|tsF{Ys5Ik=sMkd7I2{HHL03ek@N4abKX{$#m!|F(CM&A|;dcB;(sl?lSUepA6 zV)0mizx~B&bj_nTKM5`HJtiqO@QTZ|N%;n44pyZo#kpn8f*gpfjv|^0yQF;o+xg%+ zszEiv&Thk}wal(9n?>N0#c$o>J^fhGPK`qgPvq;ROYT2`(5qOtiUj4A}1H(buCxZqAxZ0tqe+sq7H5i0Q03Z*mBge zg8Pjkqi9Y+!vis=4gnCz(3ynUZtrE-!;oD(Th@3mLOWg^@)5*mk1$O9c3>qvWAikV zr>x2|xdl|tLXba^G-9$}X$HUB-iAp&KZD4Metz~Pi)AzP;40dtgV`WK&QwCAPi7>E z1VtDKft~UIp|GJ%*Wo_e+=q<$5Xtf8eSKMurK!U<2!4GyM+Vuq)v=*pLsB|6r;te6 zc<*rO?tCmhv0TWoZcr$0uw7NOIGi!@eyt@=Axp5Lvygwxx;q|ACzsaLJ^zs0f}MOwvwSF3D@ZiEuox03mHN2TBtOxm=xEBfj^5XT87 z)pK9@6?Lz#6ON5S-Z)(|>}aF-h*txKrJ!Q} Date: Fri, 14 Jun 2019 21:55:17 +0100 Subject: [PATCH 265/608] Fixing merge errors. Testmerge ready. --- code/datums/brain_damage/phobia.dm | 6 ++-- code/datums/components/mood.dm | 4 +-- code/datums/status_effects/debuffs.dm | 8 +++--- code/modules/mob/living/blood.dm | 4 +-- code/modules/mob/living/carbon/carbon.dm | 4 +-- code/modules/mob/living/taste.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 2 -- .../chemistry/reagents/drug_reagents.dm | 4 +-- .../chemistry/reagents/medicine_reagents.dm | 4 +-- .../reagents/reagent_containers/glass.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 20 ++++++------- .../code/datums/status_effects/chems.dm | 28 +++++++++---------- .../code/modules/arousal/organs/genitals.dm | 2 +- .../reagents/chemistry/reagents/MKUltra.dm | 4 +-- .../reagents/chemistry/reagents/SDGF.dm | 2 +- .../reagents/chemistry/reagents/astrogen.dm | 6 ++-- .../chemistry/reagents/enlargement.dm | 12 ++++---- .../chemistry/reagents/fermi_reagents.dm | 2 +- 18 files changed, 57 insertions(+), 59 deletions(-) diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index 8cd8d95603..d438c23593 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -31,7 +31,7 @@ /datum/brain_trauma/mild/phobia/on_life() ..() - if(owner.has_trait(TRAIT_FEARLESS)) + if(HAS_TRAIT(owner, TRAIT_FEARLESS)) return if(is_blind(owner)) return @@ -72,7 +72,7 @@ /datum/brain_trauma/mild/phobia/on_hear(message, speaker, message_language, raw_message, radio_freq) if(!owner.can_hear() || world.time < next_scare) //words can't trigger you if you can't hear them *taps head* return message - if(owner.has_trait(TRAIT_FEARLESS)) + if(HAS_TRAIT(owner, TRAIT_FEARLESS)) return message for(var/word in trigger_words) var/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i") @@ -83,7 +83,7 @@ return message /datum/brain_trauma/mild/phobia/on_say(message) - if(owner.has_trait(TRAIT_FEARLESS)) + if(HAS_TRAIT(owner, TRAIT_FEARLESS)) return message for(var/word in trigger_words) var/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i") diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index c4dea21f1e..5b1e942ba2 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -179,7 +179,7 @@ amount = sanity - 0.5 // Disturbed stops you from getting any more sane - if(master.has_trait(TRAIT_UNSTABLE)) + if(HAS_TRAIT(master, TRAIT_UNSTABLE)) sanity = min(amount,sanity) else sanity = amount @@ -232,7 +232,7 @@ /datum/component/mood/proc/IncreaseSanity(amount, maximum = SANITY_NEUTRAL) // Disturbed stops you from getting any more sane - I'm just gonna bung this in here var/mob/living/owner = parent - if(owner.has_trait(TRAIT_UNSTABLE)) + if(HAS_TRAIT(owner, TRAIT_UNSTABLE)) return if(sanity > maximum) DecreaseSanity(0.5) //Removes some sanity to go back to our current limit. diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index db2761356a..17aedcdf10 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -521,11 +521,11 @@ datum/status_effect/pacify . = ..() /datum/status_effect/pacify/on_apply() - owner.add_trait(TRAIT_PACIFISM, "status_effect") + ADD_TRAIT(owner, TRAIT_PACIFISM, "status_effect") return ..() /datum/status_effect/pacify/on_remove() - owner.remove_trait(TRAIT_PACIFISM, "status_effect") + REMOVE_TRAIT(owner, TRAIT_PACIFISM, "status_effect") /datum/status_effect/trance id = "trance" @@ -550,7 +550,7 @@ datum/status_effect/pacify if(!iscarbon(owner)) return FALSE RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize) - owner.add_trait(TRAIT_MUTE, "trance") + ADD_TRAIT(owner, TRAIT_MUTE, "trance") if(!owner.has_quirk(/datum/quirk/monochromatic)) owner.add_client_colour(/datum/client_colour/monochrome) owner.visible_message("[stun ? "[owner] stands still as [owner.p_their()] eyes seem to focus on a distant point." : ""]", \ @@ -564,7 +564,7 @@ datum/status_effect/pacify /datum/status_effect/trance/on_remove() UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) - owner.remove_trait(TRAIT_MUTE, "trance") + REMOVE_TRAIT(owner, TRAIT_MUTE, "trance") owner.dizziness = 0 if(!owner.has_quirk(/datum/quirk/monochromatic)) owner.remove_client_colour(/datum/client_colour/monochrome) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 3ca88d0031..ca1a961a92 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -46,7 +46,7 @@ nutrition_ratio = 0.8 else nutrition_ratio = 1 - if(has_trait(TRAIT_HIGH_BLOOD)) + if(HAS_TRAIT(src, TRAIT_HIGH_BLOOD)) nutrition_ratio *= 1.2 if(satiety > 80) nutrition_ratio *= 1.25 @@ -322,7 +322,7 @@ /mob/living/proc/ResetBloodVol() if(ishuman(src)) var/mob/living/carbon/human/H = src - if (src.has_trait(TRAIT_HIGH_BLOOD)) + if (HAS_TRAIT(src, TRAIT_HIGH_BLOOD)) blood_ratio = 1.2 H.handle_blood() return diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 2e156677fd..3ce918f279 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -913,13 +913,13 @@ return bodyparts.len > 2 && ..() /mob/living/carbon/proc/hypnosis_vulnerable()//unused atm, but added in case - if(src.has_trait(TRAIT_MINDSHIELD)) + if(HAS_TRAIT(src, TRAIT_MINDSHIELD)) return FALSE if(hallucinating()) return TRUE if(IsSleeping()) return TRUE - if(src.has_trait(TRAIT_DUMB)) + if(HAS_TRAIT(src, TRAIT_DUMB)) return TRUE GET_COMPONENT_FROM(mood, /datum/component/mood, src) if(mood) diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index 29596c4eec..282fe0a716 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -48,7 +48,7 @@ to_chat(src, "Your tongue moves on it's own in response to the liquid.") say("The pH is appropriately [round(from.pH, 1)].") return - if (!has_trait(TRAIT_AGEUSIA)) //I'll let you get away with not having 1 damage. + if (!HAS_TRAIT(src, TRAIT_AGEUSIA)) //I'll let you get away with not having 1 damage. switch(from.pH) if(11.5 to INFINITY) to_chat(src, "You taste a strong alkaline flavour!") diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 276b7231e0..c80a5262be 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -347,8 +347,6 @@ var/list/cached_reagents = reagent_list var/list/cached_reactions = GLOB.chemical_reactions_list var/datum/cached_my_atom = my_atom - if(reagents_holder_flags & REAGENT_NOREACT) - return var/reaction_occurred = 0 // checks if reaction, binary variable var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 992158ac8c..2a05f36410 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -389,11 +389,11 @@ /datum/reagent/drug/happiness/on_mob_add(mob/living/L) ..() - L.add_trait(TRAIT_FEARLESS, id) + ADD_TRAIT(L, TRAIT_FEARLESS, id) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug) /datum/reagent/drug/happiness/on_mob_delete(mob/living/L) - L.remove_trait(TRAIT_FEARLESS, id) + REMOVE_TRAIT(L, TRAIT_FEARLESS, id) SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "happiness_drug") ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index c651b10d53..188f129226 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1377,10 +1377,10 @@ /datum/reagent/medicine/psicodine/on_mob_add(mob/living/L) ..() - L.add_trait(TRAIT_FEARLESS, id) + ADD_TRAIT(L, TRAIT_FEARLESS, id) /datum/reagent/medicine/psicodine/on_mob_delete(mob/living/L) - L.remove_trait(TRAIT_FEARLESS, id) + REMOVE_TRAIT(L, TRAIT_FEARLESS, id) ..() /datum/reagent/medicine/psicodine/on_mob_life(mob/living/carbon/M) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index eede050273..3cb9b447dc 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -211,7 +211,7 @@ /obj/item/reagent_containers/glass/beaker/noreact/Initialize() beaker_weakness_bitflag &= ~PH_WEAK . = ..() - reagents.set_reacting(FALSE) + //reagents.set_reacting(FALSE) was this removed in a recent pr? /obj/item/reagent_containers/glass/beaker/bluespace name = "bluespace beaker" diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 7bae833245..b69d857739 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -575,7 +575,7 @@ cooldown = COOLDOWN_MEME for(var/V in listeners) var/mob/living/carbon/human/H = V - if(H.canbearoused && H.has_dna() && H.has_trait(TRAIT_NYMPHO)) // probably a redundant check but for good measure + if(H.canbearoused && H.has_dna() && HAS_TRAIT(H, TRAIT_NYMPHO)) // probably a redundant check but for good measure H.mob_climax(forced_climax=TRUE) //DAB @@ -803,9 +803,9 @@ continue if (L.lewd) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] has praised me!!"), 5) - if(L.has_trait(TRAIT_NYMPHO)) + if(HAS_TRAIT(L, TRAIT_NYMPHO)) L.adjustArousalLoss(2*power_multiplier) - if(L.has_trait(TRAIT_MASO)) + if(HAS_TRAIT(L, TRAIT_MASO)) E.enthrallTally -= power_multiplier E.resistanceTally += power_multiplier E.cooldown += 1 @@ -826,7 +826,7 @@ if(L == user) continue if (L.lewd) - if(L.has_trait(TRAIT_MASO)) + if(HAS_TRAIT(L, TRAIT_MASO)) L.adjustArousalLoss(3*power_multiplier) descmessage += "And yet, it feels so good..!" //I don't really understand masco, is this the right sort of thing they like? E.enthrallTally += power_multiplier @@ -848,7 +848,7 @@ for(var/V in listeners) var/mob/living/carbon/C = V var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) - C.remove_trait(TRAIT_MUTE, "enthrall") + REMOVE_TRAIT(C, TRAIT_MUTE, "enthrall") if(C.lewd) addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.enthrallGender]"), 5) else @@ -878,7 +878,7 @@ var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, C)+1] if (E.phase == 3) //If target is fully enthralled, - C.add_trait(TRAIT_MUTE, "enthrall") + ADD_TRAIT(C, TRAIT_MUTE, "enthrall") else C.silent += ((10 * power_multiplier) * E.phase) E.cooldown += 3 @@ -887,7 +887,7 @@ else if((findtext(message, silence_words))) for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) - C.remove_trait(TRAIT_MUTE, "enthrall") + REMOVE_TRAIT(C, TRAIT_MUTE, "enthrall") E.cooldown += 3 @@ -948,7 +948,7 @@ var/mob/living/carbon/human/H = V var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase > 1) - if(H.has_trait(TRAIT_NYMPHO) && H.canbearoused) // probably a redundant check but for good measure + if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused) // probably a redundant check but for good measure addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Your [E.enthrallGender] pushes you over the limit, overwhelming your body with pleasure."), 5) H.mob_climax(forced_climax=TRUE) H.SetStun(20) @@ -1061,9 +1061,9 @@ if (E.phase > 2) for (var/trigger in E.customTriggers) speaktrigger += "[trigger], " - C.add_trait(TRAIT_DEAF, "Triggers") //So you don't trigger yourself! Actually this will trigger yourself oops. + ADD_TRAIT(C, TRAIT_DEAF, "Triggers") //So you don't trigger yourself! Actually this will trigger yourself oops. addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, /atom/movable/proc/say, "[speaktrigger]"), 5) - C.remove_trait(TRAIT_DEAF, "Triggers") + REMOVE_TRAIT(C, TRAIT_DEAF, "Triggers") //CUSTOM TRIGGERS diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index f1c802ab0d..71b2c4f85d 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -256,7 +256,7 @@ mental_capacity += 10 //mindshield check - if(M.has_trait(TRAIT_MINDSHIELD))//If you manage to enrapture a head, wow, GJ. (resisting gives a bigger bonus with a mindshield) + if(HAS_TRAIT(M, TRAIT_MINDSHIELD))//If you manage to enrapture a head, wow, GJ. (resisting gives a bigger bonus with a mindshield) resistanceTally += 2 if(prob(10)) to_chat(owner, "You feel lucidity returning to your mind as the mindshield buzzes, attempting to return your brain to normal function.") @@ -303,7 +303,7 @@ to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. else to_chat(owner, "You are unable to put up a resistance any longer, and now are under the control of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [master] in death. ") - owner.add_trait(TRAIT_PACIFISM, "MKUltra") //IMPORTANT + ADD_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") //IMPORTANT log_game("FERMICHEM: MKULTRA: Status on [owner] ckey: [owner.key] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].") else if (resistanceTally > 200) enthrallTally *= 0.5 @@ -315,18 +315,18 @@ if(owner.lewd) to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (3)//fully entranced - if ((resistanceTally >= 200 && withdrawalTick >= 150) || (M.has_trait(TRAIT_MINDSHIELD) && (resistanceTally >= 100))) + if ((resistanceTally >= 200 && withdrawalTick >= 150) || (HAS_TRAIT(M, TRAIT_MINDSHIELD) && (resistanceTally >= 100))) enthrallTally = 0 phase -= 1 resistanceTally = 0 resistGrowth = 0 to_chat(owner, "The separation from [(owner.lewd?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") - owner.remove_trait(TRAIT_PACIFISM, "MKUltra") + REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") if(prob(2)) if(owner.lewd) to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken - if (mental_capacity >= 499 && (owner.getBrainLoss() >=20 || M.has_trait(TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra")) + if (mental_capacity >= 499 && (owner.getBrainLoss() >=20 || HAS_TRAIT(M, TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra")) phase = 2 mental_capacity = 500 customTriggers = list() @@ -471,7 +471,7 @@ cooldown += 1 //Cooldown doesn't process till status is done else if(status == "charge") - owner.add_trait(TRAIT_GOTTAGOFAST, "MKUltra") + ADD_TRAIT(owner, TRAIT_GOTTAGOFAST, "MKUltra") status = "charged" if(master.lewd) to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") @@ -481,7 +481,7 @@ else if (status == "charged") if (statusStrength < 0) status = null - owner.remove_trait(TRAIT_GOTTAGOFAST, "MKUltra") + REMOVE_TRAIT(owner, TRAIT_GOTTAGOFAST, "MKUltra") owner.Knockdown(50) to_chat(owner, "Your body gives out as the adrenaline in your system runs out.") else @@ -489,7 +489,7 @@ cooldown += 1 //Cooldown doesn't process till status is done else if (status == "pacify") - owner.add_trait(TRAIT_PACIFISM, "MKUltraStatus") + ADD_TRAIT(owner, TRAIT_PACIFISM, "MKUltraStatus") status = null //Truth serum? @@ -530,7 +530,7 @@ qdel(redirect_component.resolve()) redirect_component = null UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) - owner.remove_trait(TRAIT_PACIFISM, "MKUltra") + REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") to_chat(owner, "You're now free of [master]'s influence, and fully independant oncemore!'") //UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) //Should still make custom commands work after freedom, need to check. @@ -549,7 +549,7 @@ //Speak (Forces player to talk) works if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2 var/saytext = "Your mouth moves on it's own before you can even catch it." - if(C.has_trait(TRAIT_NYMPHO)) + if(HAS_TRAIT(C, TRAIT_NYMPHO)) saytext += " You find yourself fully believing in the validity of what you just said and don't think to question it." to_chat(C, "[saytext]") (C.say(customTriggers[trigger][2]))//trigger3 @@ -571,7 +571,7 @@ //wah intensifies wah-rks else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - if (C.has_trait(TRAIT_NYMPHO)) + if (HAS_TRAIT(C, TRAIT_NYMPHO)) if (C.getArousalLoss() > 80) C.mob_climax(forced_climax=TRUE) C.SetStun(10)//We got your stun effects in somewhere, Kev. @@ -659,7 +659,7 @@ deltaResist *= 1.5 to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") //nymphomania - if (M.canbearoused && M.has_trait(TRAIT_NYMPHO))//I'm okay with this being removed. + if (M.canbearoused && HAS_TRAIT(M, TRAIT_NYMPHO))//I'm okay with this being removed. deltaResist*= 0.5-(((2/200)*M.arousalloss)/1)//more aroused you are, the weaker resistance you can give, the less you are, the more you gain. (+/- 0.5) //chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist. @@ -667,7 +667,7 @@ deltaResist *= 1.25 if (owner.reagents.has_reagent("neurine")) deltaResist *= 1.5 - if (!owner.has_trait(TRAIT_CROCRIN_IMMUNE) && M.canbearoused) + if (!HAS_TRAIT(owner, TRAIT_CROCRIN_IMMUNE) && M.canbearoused) if (owner.reagents.has_reagent("anaphro")) deltaResist *= 1.5 if (owner.reagents.has_reagent("anaphro+")) @@ -711,7 +711,7 @@ //If you've a collar, you get a sense of pride if(istype(M.wear_neck, /obj/item/clothing/neck/petcollar)) deltaResist *= 0.5 - if(M.has_trait(TRAIT_MINDSHIELD)) + if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) deltaResist += 5//even faster! return diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 573995c764..051b386e7c 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -304,7 +304,7 @@ var/breastCheck = FALSE var/willyCheck = FALSE if(!canbearoused) - add_trait(TRAIT_PHARMA)//Prefs prevent unwanted organs. + ADD_TRAIT(src, TRAIT_PHARMA, "pharma")//Prefs prevent unwanted organs. return for(var/obj/item/organ/O in internal_organs) if(istype(O, /obj/item/organ/genital)) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 9a39a7506e..20334a2151 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -264,7 +264,7 @@ Creating a chem with a low purity will make you permanently fall in love with so creatorName = chosen.real_name creator = get_mob_by_key(creatorID) */ - M.add_trait(TRAIT_PACIFISM, "MKUltra") + ADD_TRAIT(M, TRAIT_PACIFISM, "MKUltra") var/datum/status_effect/chem/enthrall/E if (!M.has_status_effect(/datum/status_effect/chem/enthrall)) M.apply_status_effect(/datum/status_effect/chem/enthrall) @@ -313,7 +313,7 @@ Creating a chem with a low purity will make you permanently fall in love with so log_game("FERMICHEM: [M] ckey: [M.key] has temporarily fallen for [love] ckey: [love.key]") else if(get_dist(M, love) < 8) - if(M.has_trait(TRAIT_NYMPHO)) //Add this back when merged/updated. + if(HAS_TRAIT(M, TRAIT_NYMPHO)) //Add this back when merged/updated. M.adjustArousalLoss(5) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index 5aa626060d..cdcc4c03b2 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -125,7 +125,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING switch(current_cycle) if(21) to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). - M.remove_trait(TRAIT_DISFIGURED, TRAIT_GENERIC) + REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) log_game("FERMICHEM: [M] ckey: [M.key] is being healed by SDGF") if(22 to INFINITY) M.adjustCloneLoss(-1, 0) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index c768ee0272..4aa4d571ef 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -64,10 +64,10 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die antiGenetics = 255 ..() -//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. +//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 50-80 minutes to die from this. /datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) if(addiction_stage < 2) - antiGenetics = 255//Doesn't reset when you take more, which is weird for me, it should. + antiGenetics = 255 M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them. if(prob(65)) M.alpha-- @@ -94,7 +94,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die to_chat(M, "You feel a substantial part of your soul flake off into the ethereal world, rendering yourself unclonable.") M.alpha-- antiGenetics-- - M.add_trait(TRAIT_NOCLONE) //So you can't scan yourself, then die, to metacomm. You can only use your memories if you come back as something else. + ADD_TRAIT(M, TRAIT_NOCLONE, "astral") //So you can't scan yourself, then die, to metacomm. You can only use your memories if you come back as something else. if(80) to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates your forthcoming oblivion.") M.alpha-- diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index e9c74e9c61..1d79c4f8c8 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -68,7 +68,7 @@ if(!B) //If they don't have breasts, give them breasts. //If they have Acute hepatic pharmacokinesis, then route processing though liver. - if(M.has_trait(TRAIT_PHARMA)) + if(HAS_TRAIT(M, TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") L.swelling+= 0.05 return..() @@ -103,7 +103,7 @@ /datum/reagent/fermi/breast_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. //Acute hepatic pharmacokinesis. - if(M.has_trait(TRAIT_PHARMA)) + if(HAS_TRAIT(M, TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") L.swelling+= 0.05 return ..() @@ -144,7 +144,7 @@ var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) //Acute hepatic pharmacokinesis. - if(M.has_trait(TRAIT_PHARMA)) + if(HAS_TRAIT(M, TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") L.swelling-= 0.05 return ..() @@ -207,7 +207,7 @@ if(!P)//They do have a preponderance for escapism, or so I've heard. //If they have Acute hepatic pharmacokinesis, then route processing though liver. - if(M.has_trait(TRAIT_PHARMA)) + if(HAS_TRAIT(M, TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") L.swelling+= 0.05 return..() @@ -235,7 +235,7 @@ /datum/reagent/fermi/penis_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. //Acute hepatic pharmacokinesis. - if(M.has_trait(TRAIT_PHARMA)) + if(HAS_TRAIT(M, TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") L.swelling+= 0.05 return..() @@ -275,7 +275,7 @@ var/obj/item/organ/genital/penis/P = H.getorganslot("penis") if(!P) //Acute hepatic pharmacokinesis. - if(M.has_trait(TRAIT_PHARMA)) + if(HAS_TRAIT(M, TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") L.swelling-= 0.05 return..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index d7c89150f8..ad6d914c34 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -401,7 +401,7 @@ H.moveToNullspace() log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.") //Just to deal with rascally ghosts - catto.add_trait(TRAIT_NODEATH, "catto") + ADD_TRAIT(catto, TRAIT_NODEATH, "catto") /datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) if(catto.health <= 50) From 3d78905394611997ef7429cffd1cf1b08a0cebd9 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 15 Jun 2019 10:29:49 +0100 Subject: [PATCH 266/608] Catto fix --- .../reagents/chemistry/reagents/fermi_reagents.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index ad6d914c34..be1b8281fc 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -184,7 +184,7 @@ name = "Naninte bain" id = "nanite_b_gone" description = "A rather simple toxin to small nano machines that will kill them off at a rapid rate well in system." - color = "#5a7267" // rgb: 90, 114, 103 + color = "#5a7267" overdose_threshold = 15 ImpureChem = "nanite_b_goneTox" //If you make an inpure chem, it stalls growth InverseChemVal = 0.25 @@ -197,7 +197,7 @@ GET_COMPONENT_FROM(N, /datum/component/nanites, C) if(isnull(N)) return ..() - N.nanite_volume = -0.55//0.5 seems to be the default to me, so it'll neuter them. + N.nanite_volume = -purity//0.5 seems to be the default to me, so it'll neuter them. ..() /datum/reagent/fermi/nanite_b_gone/overdose_process(mob/living/carbon/C) @@ -213,7 +213,7 @@ to_chat(C, "The nanites short circuit within your system!") if(isnull(N)) return ..() - N.nanite_volume = -2//12.5 seems crazy high? + N.nanite_volume = -2 ..() //Unobtainable, used if SDGF is impure but not too impure @@ -229,7 +229,6 @@ to_chat(C, "The residual voltage in your system causes you to seize up!") C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) if(prob(50)) - //empulse((get_turf(C)), 2, 1, 1)//So the nanites randomize var/atom/T = C T.emp_act(EMP_HEAVY) to_chat(C, "You feel your hair stand on end as you glow brightly for a moment!") @@ -398,7 +397,8 @@ catto.name = H.name catto.desc = "A cute catto! They remind you of [H] somehow." catto.color = "#[H.dna.features["mcolor"]]" - H.moveToNullspace() + //H.moveToNullspace() + H.forceMove(catto) log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.") //Just to deal with rascally ghosts ADD_TRAIT(catto, TRAIT_NODEATH, "catto") From 79d176336c8ac130bc430e7301d1db1de55a02bd Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 15 Jun 2019 11:36:38 +0100 Subject: [PATCH 267/608] A few minor fixes. --- code/modules/reagents/reagent_containers.dm | 3 +++ .../code/datums/status_effects/chems.dm | 4 ++-- .../reagents/chemistry/reagents/eigentstasium.dm | 15 +++++++++++---- .../reagents/chemistry/reagents/enlargement.dm | 6 +++--- .../reagents/chemistry/reagents/fermi_reagents.dm | 2 +- .../modules/reagents/chemistry/recipes/fermi.dm | 4 +++- 6 files changed, 23 insertions(+), 11 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 5b28942b98..a8e8afc149 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -142,7 +142,10 @@ //melts plastic beakers /obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) reagents.expose_temperature(exposed_temperature) + message_admins("Heating beaker") + message_admins("temperature [reagents.chem_temp]") if(beaker_weakness_bitflag & TEMP_WEAK) + message_admins("Beaker weak to heat") if(reagents.chem_temp >= 444)//assuming polypropylene var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 71b2c4f85d..dc41eed0eb 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -69,7 +69,7 @@ to_chat(owner, "Your enormous breasts are way too large to fit anything over them!") if (B.size == "huge") if(prob(1)) - to_chat(owner, "Your back is feeling a little sore.") + to_chat(owner, "Your back is feeling sore.") var/target = o.get_bodypart(BODY_ZONE_CHEST) o.apply_damage(0.1, BRUTE, target) if(!B.cached_size == B.breast_values[B.prev_size]) @@ -90,7 +90,7 @@ if(10 to INFINITY) if (GLOB.breasts_size_list[B.prev_size] != GLOB.breasts_size_list[B.size]) to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!") - if(prob(2)) + if(prob(1)) to_chat(owner, "Your back is feeling a little sore.") ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index 2b0a54b081..40c5e31fa3 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -14,7 +14,7 @@ id = "eigenstate" description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" taste_description = "wiggly cosmic dust." - color = "#5020H4" // rgb: 50, 20, 255 + color = "#5020F4" // rgb: 50, 20, 255 overdose_threshold = 15 addiction_threshold = 15 metabolization_rate = 1.2 * REAGENTS_METABOLISM @@ -28,6 +28,9 @@ var/teleBool = FALSE pH = 3.7 +/datum/reagent/fermi/eigenstate/on_new(list/data) + location_created = data.["location_created"] + //Main functions /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! log_game("FERMICHEM: [M] ckey: [M.key] took eigenstasium") @@ -35,10 +38,11 @@ location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") if(purity > 0.9) //Teleports you home if it's pure enough + if(!location_created && data) //Just in case + location_created = data.["location_created"] log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium") - //var/turf/open/creation = location_created do_sparks(5,FALSE,M) - do_teleport(M, loc, 0, asoundin = 'sound/effects/phasein.ogg') + do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,M) if(prob(20)) do_sparks(5,FALSE,M) @@ -59,8 +63,9 @@ metabolization_rate += 0.5 //So you're not stuck forever teleporting. /datum/reagent/fermi/eigenstate/overdose_process(mob/living/M) //Overdose, makes you teleport randomly, probably one of my favourite effects. Sometimes kills you. + do_sparks(5,FALSE,M) do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') - do_sparks(5,FALSE,src) + do_sparks(5,FALSE,M) ..() //Addiction @@ -132,8 +137,10 @@ M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) log_game("FERMICHEM: [M] ckey: [M.key] has become an alternative universe version of themselves.") M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) + /* for(var/datum/mood_event/Me in M) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, Me) //Why does this not work? + */ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 1d79c4f8c8..37224c9b94 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -95,8 +95,8 @@ if(H.w_uniform || H.wear_suit) var/target = M.get_bodypart(BODY_ZONE_CHEST) to_chat(M, "Your breasts begin to strain against your clothes tightly!") - M.adjustOxyLoss(10, 0) - M.apply_damage(2, BRUTE, target) + M.adjustOxyLoss(5, 0) + M.apply_damage(1, BRUTE, target) B.update() ..() @@ -228,7 +228,7 @@ if(H.w_uniform || H.wear_suit) var/target = M.get_bodypart(BODY_ZONE_CHEST) to_chat(M, "Your cock begin to strain against your clothes tightly!") - M.apply_damage(5, BRUTE, target) + M.apply_damage(2.5, BRUTE, target) P.update() ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index be1b8281fc..68c7be4b85 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -404,7 +404,7 @@ ADD_TRAIT(catto, TRAIT_NODEATH, "catto") /datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) - if(catto.health <= 50) + if(catto.health <= 0) catto.icon_state = "custom_cat_dead" catto.Stun(1000) else if(prob(5)) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index af6673de22..4f9c679c26 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -49,7 +49,7 @@ R.add_reagent("fermiAcid", (volume/3)) if(R.reagent_list) message_admins("gas") - s.set_up(R, (volume/10), my_atom) + s.set_up(R, (volume/5), my_atom) s.start() if (pH > 10) //if alkaline, small explosion. @@ -90,6 +90,8 @@ var/turf/open/location = get_turf(my_atom) var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list E.location_created = location + if(!E.data) + E.data.["location_created"] = location //serum From be36a8bb3346882060ff1679005fec4e45ccc611 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 15 Jun 2019 18:04:06 +0100 Subject: [PATCH 268/608] Cleanup --- code/datums/components/mood.dm | 6 +++--- code/modules/reagents/chemistry/holder.dm | 1 + code/modules/reagents/reagent_containers.dm | 6 +++--- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 1 - 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 5b1e942ba2..730ffa9ff0 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -187,15 +187,15 @@ switch(sanity) if(SANITY_INSANE to SANITY_CRAZY) setInsanityEffect(MAJOR_INSANITY_PEN) - master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=1.5, movetypes=(~FLYING)) + master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=1.5) //Did we change something ? movetypes is runtiming, movetypes=(~FLYING)) sanity_level = 6 if(SANITY_CRAZY to SANITY_UNSTABLE) setInsanityEffect(MINOR_INSANITY_PEN) - master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=1, movetypes=(~FLYING)) + master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=1)//, movetypes=(~FLYING)) sanity_level = 5 if(SANITY_UNSTABLE to SANITY_DISTURBED) setInsanityEffect(0) - master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=0.5, movetypes=(~FLYING)) + master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=0.5)//, movetypes=(~FLYING)) sanity_level = 4 if(SANITY_DISTURBED to SANITY_NEUTRAL) setInsanityEffect(0) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index c80a5262be..d414a9a2e1 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -793,6 +793,7 @@ /datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) var/S = specific_heat() chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), min_temp, max_temp) + my_atom.temp_check() /datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, other_purity = 1, other_pH, no_react = 0) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index a8e8afc149..bd1f024367 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -142,10 +142,10 @@ //melts plastic beakers /obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) reagents.expose_temperature(exposed_temperature) - message_admins("Heating beaker") - message_admins("temperature [reagents.chem_temp]") + temp_check() + +/obj/item/reagent_containers/proc/temp_check() if(beaker_weakness_bitflag & TEMP_WEAK) - message_admins("Beaker weak to heat") if(reagents.chem_temp >= 444)//assuming polypropylene var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 68c7be4b85..d8d465552c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -397,7 +397,6 @@ catto.name = H.name catto.desc = "A cute catto! They remind you of [H] somehow." catto.color = "#[H.dna.features["mcolor"]]" - //H.moveToNullspace() H.forceMove(catto) log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.") //Just to deal with rascally ghosts From 8fb302262443a3b907f3c76c8953271c428155c0 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 16 Jun 2019 10:25:43 +0100 Subject: [PATCH 269/608] Classic me. --- code/modules/reagents/chemistry/holder.dm | 4 +++- .../code/modules/reagents/chemistry/recipes/fermi.dm | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index d414a9a2e1..1174dbf54c 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -793,7 +793,9 @@ /datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) var/S = specific_heat() chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), min_temp, max_temp) - my_atom.temp_check() + if(istype(my_atom, /obj/item/reagent_containers)) + var/obj/item/reagent_containers/RC = my_atom + RC.temp_check() /datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, other_purity = 1, other_pH, no_react = 0) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 4f9c679c26..a53ceed535 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -124,7 +124,7 @@ S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) S.name = "Living teratoma" S.real_name = "Living teratoma" - S.rabid = 1//Make them an angery boi, grr grr + S.rabid = 1//Make them an angery boi S.color = "#810010" my_atom.reagents.clear_reagents() var/list/seen = viewers(8, get_turf(my_atom)) From 3caadb200948cd9253b108c3460426a9c76452a1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 16 Jun 2019 12:22:13 +0100 Subject: [PATCH 270/608] pH calc redo, too confusing. --- code/modules/reagents/chemistry/holder.dm | 8 +++-- .../chemistry/reagents/fermi_reagents.dm | 2 +- .../reagents/chemistry/recipes/fermi.dm | 20 +++++------ .../code/modules/reagents/objects/items.dm | 33 +++++++++---------- 4 files changed, 31 insertions(+), 32 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 1174dbf54c..a18c716ab0 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -924,15 +924,17 @@ for(var/A in cached_reagents) var/datum/reagent/R = A if (R.id == reagent) - //clamp the removal amount to be between current reagent amount - //and zero, to prevent removing more than the holder has stored if((total_volume - amount) <= 0)//Because this can result in 0, I don't want it to crash. pH = 7 + /*In practice this is really confusing and players feel like it randomly melts their beakers. else - pH = ((pH * total_volume)-(R.pH * amount))/(total_volume - amount) + pH = (((pH - R.pH) / total_volume) * amount) + pH + */ if(istype(my_atom, /obj/item/reagent_containers/)) var/obj/item/reagent_containers/RC = my_atom RC.pH_check()//checks beaker resilience) + //clamp the removal amount to be between current reagent amount + //and zero, to prevent removing more than the holder has stored amount = CLAMP(amount, 0, R.volume) R.volume -= amount update_total() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index d8d465552c..af2a8d043f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -344,7 +344,7 @@ var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The beaker fizzes as the pH changes!") - playsound(get_turf(holder), 'sound/FermiChem/bufferadd.ogg', 50, 1) + playsound(get_turf(holder.my_atom), 'sound/FermiChem/bufferadd.ogg', 50, 1) holder.remove_reagent(id, volume) ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index a53ceed535..7835769215 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -73,7 +73,7 @@ //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 600 // Upper end for above - ExplodeTemp = 750 //Temperature at which reaction explodes + ExplodeTemp = 650 //Temperature at which reaction explodes OptimalpHMin = 6 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) OptimalpHMax = 8 // Higest value for above ReactpHLim = 4 // How far out pH wil react, giving impurity place (Exponential phase) @@ -134,7 +134,7 @@ /datum/chemical_reaction/fermi/breast_enlarger name = "Sucubus milk" id = "breast_enlarger" - results = list("breast_enlarger" = 0.6) + results = list("breast_enlarger" = 0.4) required_reagents = list("salglu_solution" = 0.1, "milk" = 0.5, "synthflesh" = 0.2, "silicon" = 0.2, "aphro" = 0.2) mix_message = "the reaction gives off a mist of milk." //FermiChem vars: @@ -166,7 +166,7 @@ /datum/chemical_reaction/fermi/penis_enlarger name = "Incubus draft" id = "penis_enlarger" - results = list("penis_enlarger" = 0.3) + results = list("penis_enlarger" = 0.4) required_reagents = list("blood" = 0.5, "synthflesh" = 0.2, "carbon" = 0.2, "aphro" = 0.2, "salglu_solution" = 0.1,) mix_message = "the reaction gives off a spicy mist." //FermiChem vars: @@ -298,7 +298,7 @@ name = "Hat growth serum" id = "hatmium" results = list("hatmium" = 0.5) - required_reagents = list("whiskey" = 0.1, "nutriment" = 0.3, "cooking_oil" = 0.2, "iron" = 0.1) + required_reagents = list("whiskey" = 0.1, "nutriment" = 0.3, "cooking_oil" = 0.2, "iron" = 0.1, "gold" = 0.3) //mix_message = "" //FermiChem vars: OptimalTempMin = 500 @@ -377,8 +377,8 @@ /datum/chemical_reaction/fermi/fermiABuffer//done test name = "Acetic acid buffer" id = "fermiABuffer" - results = list("fermiABuffer" = 20) //acetic acid - required_reagents = list("salglu_solution" = 2, "ethanol" = 6, "oxygen" = 6, "water" = 6) + results = list("fermiABuffer" = 2) //acetic acid + required_reagents = list("salglu_solution" = 0.2, "ethanol" = 0.6, "oxygen" = 0.6, "water" = 0.6) //FermiChem vars: OptimalTempMin = 250 OptimalTempMax = 500 @@ -387,7 +387,7 @@ OptimalpHMax = 6 ReactpHLim = 0 //CatalystFact = 0 //To do 1 - CurveSharpT = 1 + CurveSharpT = 4 CurveSharppH = 0 ThermicConstant = 0 HIonRelease = -0.01 @@ -402,8 +402,8 @@ /datum/chemical_reaction/fermi/fermiBBuffer//done test name = "Ethyl Ethanoate buffer" id = "fermiBBuffer" - results = list("fermiBBuffer" = 15) - required_reagents = list("fermiABuffer" = 5, "ethanol" = 5, "salglu_solution" = 1, "water" = 5) + results = list("fermiBBuffer" = 1.5) + required_reagents = list("fermiABuffer" = 0.5, "ethanol" = 0.5, "salglu_solution" = 0.1, "water" = 0.5) required_catalysts = list("sacid" = 1) //vagely acetic //FermiChem vars: OptimalTempMin = 250 @@ -413,7 +413,7 @@ OptimalpHMax = 12 ReactpHLim = 0 //CatalystFact = 0 //To do 1 - CurveSharpT = 1 + CurveSharpT = 4 CurveSharppH = 0 ThermicConstant = 0 HIonRelease = 0.01 diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index a5e5d02da4..0516443aab 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -35,25 +35,22 @@ user.put_in_active_hand(src) /obj/item/FermiChem/pHbooklet/MouseDrop(atom/over_object, mob/user) - if(user.get_held_index_of_item(src)) - user.put_in_active_hand(src) + if(numberOfPages >= 1) + var/obj/item/FermiChem/pHpaper/P = new /obj/item/FermiChem/pHpaper + P.add_fingerprint(user) + P.forceMove(user.loc) + user.put_in_active_hand(P) + to_chat(user, "You take [P] out of \the [src].") + numberOfPages-- + playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1) + add_fingerprint(user) + if(numberOfPages == 0) + icon_state = "pHbookletEmpty" + return else - if(numberOfPages >= 1) - var/obj/item/FermiChem/pHpaper/P = new /obj/item/FermiChem/pHpaper - P.add_fingerprint(user) - P.forceMove(user.loc) - user.put_in_active_hand(P) - to_chat(user, "You take [P] out of \the [src].") - numberOfPages-- - playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1) - add_fingerprint(user) - if(numberOfPages == 0) - icon_state = "pHbookletEmpty" - return - else - to_chat(user, "[src] is empty!") - add_fingerprint(user) - return + to_chat(user, "[src] is empty!") + add_fingerprint(user) + return ..() /obj/item/FermiChem/pHpaper From 2df7e208b57c5bcf0cd4aa50c02b766ff8cad164 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 16 Jun 2019 12:34:37 +0100 Subject: [PATCH 271/608] Spellchecking. --- code/modules/reagents/chemistry/holder.dm | 3 +-- .../code/modules/reagents/chemistry/reagents/eigentstasium.dm | 1 + .../code/modules/reagents/chemistry/reagents/fermi_reagents.dm | 3 +-- .../code/modules/reagents/chemistry/recipes/fermi.dm | 3 +-- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index a18c716ab0..7ac01a4072 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -926,10 +926,9 @@ if (R.id == reagent) if((total_volume - amount) <= 0)//Because this can result in 0, I don't want it to crash. pH = 7 - /*In practice this is really confusing and players feel like it randomly melts their beakers. + //In practice this is really confusing and players feel like it randomly melts their beakers, but I'm not sure how else to handle it. We'll see how it goes and I can remove this if it confuses people. else pH = (((pH - R.pH) / total_volume) * amount) + pH - */ if(istype(my_atom, /obj/item/reagent_containers/)) var/obj/item/reagent_containers/RC = my_atom RC.pH_check()//checks beaker resilience) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index 40c5e31fa3..be82130c7c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -21,6 +21,7 @@ addiction_stage2_end = 30 addiction_stage3_end = 41 addiction_stage4_end = 44 //Incase it's too long + data = list("location_created" = null) var/turf/location_created var/turf/open/location_return = null var/addictCyc3 = 0 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index af2a8d043f..2f35397ba0 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -183,7 +183,7 @@ /datum/reagent/fermi/nanite_b_gone name = "Naninte bain" id = "nanite_b_gone" - description = "A rather simple toxin to small nano machines that will kill them off at a rapid rate well in system." + description = "A stablised EMP that is highly volatile, shocking small nano machines that will kill them off at a rapid rate in a patient's system." color = "#5a7267" overdose_threshold = 15 ImpureChem = "nanite_b_goneTox" //If you make an inpure chem, it stalls growth @@ -216,7 +216,6 @@ N.nanite_volume = -2 ..() -//Unobtainable, used if SDGF is impure but not too impure /datum/reagent/fermi/nanite_b_goneTox name = "Naninte bain" id = "nanite_b_goneTox" diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 7835769215..8993e2b51d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -90,8 +90,7 @@ var/turf/open/location = get_turf(my_atom) var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list E.location_created = location - if(!E.data) - E.data.["location_created"] = location + E.data.["location_created"] = location //serum From c2b9c0321db34792fd3be86235cc7570e0f69ad3 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 16 Jun 2019 13:33:41 +0100 Subject: [PATCH 272/608] Catfix --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 5 ++++- .../code/modules/reagents/chemistry/recipes/fermi.dm | 2 +- modular_citadel/code/modules/reagents/objects/items.dm | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 2f35397ba0..658a66afee 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -396,15 +396,18 @@ catto.name = H.name catto.desc = "A cute catto! They remind you of [H] somehow." catto.color = "#[H.dna.features["mcolor"]]" + catto.health = 1000 //To simulate fake death, while preventing ghosts escaping. H.forceMove(catto) log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.") //Just to deal with rascally ghosts ADD_TRAIT(catto, TRAIT_NODEATH, "catto") /datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) - if(catto.health <= 0) + if(catto.health <= 950) //So the dead can't ghost + //catto.revive(full_heal = 1) catto.icon_state = "custom_cat_dead" catto.Stun(1000) + catto.canmove = 0 else if(prob(5)) playsound(get_turf(catto), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) catto.say("lets out a meowrowr!*") diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 8993e2b51d..9913098efc 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -78,7 +78,7 @@ OptimalpHMax = 8 // Higest value for above ReactpHLim = 4 // How far out pH wil react, giving impurity place (Exponential phase) CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharpT = 0.6 // How sharp the temperature exponential curve is (to the power of value) + CurveSharpT = 1.6 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = 5 //Temperature change per 1u produced HIonRelease = -0.05 //pH change per 1u reaction diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 0516443aab..86c70663e5 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -38,7 +38,7 @@ if(numberOfPages >= 1) var/obj/item/FermiChem/pHpaper/P = new /obj/item/FermiChem/pHpaper P.add_fingerprint(user) - P.forceMove(user.loc) + P.forceMove(user) user.put_in_active_hand(P) to_chat(user, "You take [P] out of \the [src].") numberOfPages-- From 4614235f75725fd1680ba470acf8f90fdd17c373 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 16 Jun 2019 13:34:38 +0100 Subject: [PATCH 273/608] Comments. --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 658a66afee..8dbbbb8f93 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -396,15 +396,14 @@ catto.name = H.name catto.desc = "A cute catto! They remind you of [H] somehow." catto.color = "#[H.dna.features["mcolor"]]" - catto.health = 1000 //To simulate fake death, while preventing ghosts escaping. H.forceMove(catto) log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.") //Just to deal with rascally ghosts - ADD_TRAIT(catto, TRAIT_NODEATH, "catto") + ADD_TRAIT(catto, TRAIT_NODEATH, "catto")//doesn't work + catto.health = 1000 //To simulate fake death, while preventing ghosts escaping. /datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) if(catto.health <= 950) //So the dead can't ghost - //catto.revive(full_heal = 1) catto.icon_state = "custom_cat_dead" catto.Stun(1000) catto.canmove = 0 From fb70b97d5ba32c3256107e18a933197fd1342d7e Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 16 Jun 2019 20:24:36 +0100 Subject: [PATCH 274/608] Tweaks hypnoquirk as the discord seems to really want it. --- code/datums/brain_damage/hypnosis.dm | 23 ++++++++++++++++++++--- code/datums/status_effects/debuffs.dm | 10 +++++++--- code/datums/traits/negative.dm | 2 +- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm index d3ce57ca67..ba8890fea1 100644 --- a/code/datums/brain_damage/hypnosis.dm +++ b/code/datums/brain_damage/hypnosis.dm @@ -9,10 +9,13 @@ var/hypnotic_phrase = "" var/regex/target_phrase -/datum/brain_trauma/hypnosis/New(phrase) +/datum/brain_trauma/hypnosis/New(phrase, priority = TRUE) if(!phrase) qdel(src) - hypnotic_phrase = phrase + if(priority == TRUE) + hypnotic_phrase = phrase + else + phrase friendliify(phrase) try target_phrase = new("(\\b[hypnotic_phrase]\\b)","ig") catch(var/exception/e) @@ -20,6 +23,16 @@ qdel(src) ..() +/datum/brain_trauma/hypnosis/proc/friendliify(phrase) + phrase = replacetext(lowertext(phrase), "kill", "hug") + phrase = replacetext(lowertext(phrase), "murder", "cuddle") + phrase = replacetext(lowertext(phrase), "harm", "snuggle") + phrase = replacetext(lowertext(phrase), "decapitate", "headpat") + phrase = replacetext(lowertext(phrase), "strangle", "meow at") + phrase = replacetext(lowertext(phrase), "suicide", "self-love") + phrase = replacetext(lowertext(phrase), "lynch", "kiss") + hypnotic_phrase = phrase + /datum/brain_trauma/hypnosis/on_gain() message_admins("[ADMIN_LOOKUPFLW(owner)] was hypnotized with the phrase '[hypnotic_phrase]'.") log_game("[key_name(owner)] was hypnotized with the phrase '[hypnotic_phrase]'.") @@ -29,8 +42,12 @@ "You feel a part of your mind repeating this over and over. You need to follow these words.",\ "Something about this sounds... right, for some reason. You feel like you should follow these words.",\ "These words keep echoing in your mind. You find yourself completely fascinated by them.")]") - to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\ + if(priority == TRUE) + to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\ as long as you act like the words are your highest priority.") + else + to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\ + however this does not take precedence over your other objectives.") ..() /datum/brain_trauma/hypnosis/on_lose() diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 17aedcdf10..be8a2ddd27 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -553,11 +553,12 @@ datum/status_effect/pacify ADD_TRAIT(owner, TRAIT_MUTE, "trance") if(!owner.has_quirk(/datum/quirk/monochromatic)) owner.add_client_colour(/datum/client_colour/monochrome) - owner.visible_message("[stun ? "[owner] stands still as [owner.p_their()] eyes seem to focus on a distant point." : ""]", \ + if(priority == TRUE) + owner.visible_message("[stun ? "[owner] stands still as [owner.p_their()] eyes seem to focus on a distant point." : ""]", \ "[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")]") return TRUE -/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE) +/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE, priority = TRUE)//priority == FALSE makes no visible message, prevents self antag messages, and places phrase below objectives. duration = _duration stun = _stun return ..() @@ -577,6 +578,9 @@ datum/status_effect/pacify return var/mob/living/carbon/C = owner C.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) //clear previous hypnosis - addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10) + if(priority == TRUE) + addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10) + else + addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message, FALSE), 10) addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it qdel(src) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 03c11fb804..9aa2b4d6df 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -348,6 +348,6 @@ to_chat(H, "That object accidentally sets off your implanted trigger, sending you into a hypnotic daze!") else to_chat(H, "[pick(seen)] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") - H.apply_status_effect(/datum/status_effect/trance, 200, TRUE) + H.apply_status_effect(/datum/status_effect/trance, 200, TRUE, FALSE) qdel(src) */ From 49c76986ca0a0973056fbb38163494a3d09aa288 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 17 Jun 2019 12:31:45 +0100 Subject: [PATCH 275/608] Whoops --- code/datums/brain_damage/hypnosis.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm index ba8890fea1..16e3bc58c9 100644 --- a/code/datums/brain_damage/hypnosis.dm +++ b/code/datums/brain_damage/hypnosis.dm @@ -9,13 +9,13 @@ var/hypnotic_phrase = "" var/regex/target_phrase -/datum/brain_trauma/hypnosis/New(phrase, priority = TRUE) +/datum/brain_trauma/hypnosis/New(phrase, var/priority = TRUE) if(!phrase) qdel(src) if(priority == TRUE) hypnotic_phrase = phrase else - phrase friendliify(phrase) + friendliify(phrase) try target_phrase = new("(\\b[hypnotic_phrase]\\b)","ig") catch(var/exception/e) From 59469fae2e7c804103a91370334b29137cae5518 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 17 Jun 2019 12:40:30 +0100 Subject: [PATCH 276/608] Oops. --- code/datums/brain_damage/hypnosis.dm | 3 ++- code/datums/status_effects/debuffs.dm | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm index 16e3bc58c9..c0c969503d 100644 --- a/code/datums/brain_damage/hypnosis.dm +++ b/code/datums/brain_damage/hypnosis.dm @@ -5,11 +5,12 @@ gain_text = "" lose_text = "" resilience = TRAUMA_RESILIENCE_SURGERY + var/priority = TRUE var/hypnotic_phrase = "" var/regex/target_phrase -/datum/brain_trauma/hypnosis/New(phrase, var/priority = TRUE) +/datum/brain_trauma/hypnosis/New(phrase, priority) if(!phrase) qdel(src) if(priority == TRUE) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index be8a2ddd27..ecddad2e27 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -534,6 +534,7 @@ datum/status_effect/pacify tick_interval = 10 examine_text = "SUBJECTPRONOUN seems slow and unfocused." var/stun = TRUE + var/priority = TRUE alert_type = /obj/screen/alert/status_effect/trance /obj/screen/alert/status_effect/trance @@ -558,7 +559,7 @@ datum/status_effect/pacify "[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")]") return TRUE -/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE, priority = TRUE)//priority == FALSE makes no visible message, prevents self antag messages, and places phrase below objectives. +/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE)//priority == FALSE makes no visible message, prevents self antag messages, and places phrase below objectives. duration = _duration stun = _stun return ..() From d092dd1da077b8dfbbb2e9e8d8f806a38f2af172 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 17 Jun 2019 12:47:23 +0100 Subject: [PATCH 277/608] Testing hypnoquirk --- code/datums/traits/negative.dm | 5 ++--- code/modules/mob/living/simple_animal/friendly/cat.dm | 8 ++++++++ .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 8 +++++--- modular_citadel/code/modules/reagents/objects/items.dm | 2 +- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 9aa2b4d6df..09f5bd95e3 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -326,7 +326,7 @@ medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events." //For reviewers: If you think it's a bad idea, feel free to remove it. Removal requested, commented out until the end of review (will remove when fixing merge conflicts). -/* + /datum/quirk/hypno name = "Hypnotherapy user" desc = "You had hypnotherapy right before your shift, you're not sure it had any effects, though." @@ -337,7 +337,7 @@ /datum/quirk/hypno/add() //You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic! - addtimer(CALLBACK(src, /datum/quirk/hypno.proc/triggered, quirk_holder), rand(12000, 36000))//increase by 100, it's lower so I can test it. + addtimer(CALLBACK(src, /datum/quirk/hypno.proc/triggered, quirk_holder), rand(120, 360))//increase by 100, it's lower so I can test it. //DOES NOT give any indication when someone is triggered - this is intentional so people don't abuse it, you're supposed to get a random thing said to you as a mini objective. /datum/quirk/hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. @@ -350,4 +350,3 @@ to_chat(H, "[pick(seen)] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") H.apply_status_effect(/datum/status_effect/trance, 200, TRUE, FALSE) qdel(src) - */ diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index d8d72146b5..1b3e569286 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -313,3 +313,11 @@ emote_hear = list("meows.", "mews.") emote_see = list("looks at you eagerly for pets!", "wiggles enthusiastically.") gold_core_spawnable = NO_SPAWN + +/mob/living/simple_animal/pet/cat/custom_cat/death(gibbed) + if (src.mind && !name == "White cat") //secret cat chem + icon_state = "custom_cat_dead" + Stun(1000) + canmove = 0 + else + ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 8dbbbb8f93..e1615c9e44 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -399,15 +399,17 @@ H.forceMove(catto) log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.") //Just to deal with rascally ghosts - ADD_TRAIT(catto, TRAIT_NODEATH, "catto")//doesn't work - catto.health = 1000 //To simulate fake death, while preventing ghosts escaping. + //ADD_TRAIT(catto, TRAIT_NODEATH, "catto")//doesn't work + //catto.health = 1000 //To simulate fake death, while preventing ghosts escaping. /datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) + /* if(catto.health <= 950) //So the dead can't ghost catto.icon_state = "custom_cat_dead" catto.Stun(1000) catto.canmove = 0 - else if(prob(5)) + */ + if(prob(5)) playsound(get_turf(catto), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) catto.say("lets out a meowrowr!*") ..() diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 86c70663e5..ee8ca1e94c 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -34,7 +34,7 @@ if(!I) user.put_in_active_hand(src) -/obj/item/FermiChem/pHbooklet/MouseDrop(atom/over_object, mob/user) +/obj/item/FermiChem/pHbooklet/MouseDrop(atom/over_object, mob/living/user) if(numberOfPages >= 1) var/obj/item/FermiChem/pHpaper/P = new /obj/item/FermiChem/pHpaper P.add_fingerprint(user) From 4526832e7d95b7acebabf63f052ca60273d5276d Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 17 Jun 2019 15:16:45 +0100 Subject: [PATCH 278/608] I'm spending too much time trying to fix something rejected. --- code/datums/brain_damage/hypnosis.dm | 1 - code/datums/status_effects/debuffs.dm | 3 ++- .../modules/mob/living/simple_animal/friendly/cat.dm | 12 +++++++++--- .../modules/reagents/chemistry/reagents/astrogen.dm | 1 + .../reagents/chemistry/reagents/fermi_reagents.dm | 12 +++++------- .../code/modules/reagents/chemistry/recipes/fermi.dm | 6 +++--- .../code/modules/reagents/objects/items.dm | 3 ++- 7 files changed, 22 insertions(+), 16 deletions(-) diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm index c0c969503d..8ffffa8693 100644 --- a/code/datums/brain_damage/hypnosis.dm +++ b/code/datums/brain_damage/hypnosis.dm @@ -6,7 +6,6 @@ lose_text = "" resilience = TRAUMA_RESILIENCE_SURGERY var/priority = TRUE - var/hypnotic_phrase = "" var/regex/target_phrase diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index ecddad2e27..0ec09f4965 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -559,9 +559,10 @@ datum/status_effect/pacify "[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")]") return TRUE -/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE)//priority == FALSE makes no visible message, prevents self antag messages, and places phrase below objectives. +/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE, _priority = priority)//priority == FALSE makes no visible message, prevents self antag messages, and places phrase below objectives. duration = _duration stun = _stun + priority = _priority return ..() /datum/status_effect/trance/on_remove() diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 1b3e569286..19e7d58912 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -306,18 +306,24 @@ icon_dead = "custom_cat_dead" gender = FEMALE gold_core_spawnable = NO_SPAWN - health = 50 //So people can't instakill it + health = 50 //So people can't instakill it s maxHealth = 50 speak = list("Meowrowr!", "Mew!", "Miauen!") speak_emote = list("wigglepurrs", "mewls") emote_hear = list("meows.", "mews.") emote_see = list("looks at you eagerly for pets!", "wiggles enthusiastically.") gold_core_spawnable = NO_SPAWN + var/pseudo_death = FALSE -/mob/living/simple_animal/pet/cat/custom_cat/death(gibbed) - if (src.mind && !name == "White cat") //secret cat chem +/mob/living/simple_animal/pet/cat/custom_cat/death() + message_admins("dedcat") + if (pseudo_death == TRUE) //secret cat chem icon_state = "custom_cat_dead" Stun(1000) canmove = 0 + message_admins("dedcat") + friendly = "deads at" + return else + message_admins("deddercat") ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index 4aa4d571ef..9376519954 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -42,6 +42,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die G.health = 5 G.melee_damage_lower = 0 G.melee_damage_upper = 0 + G.obj_damage = 0 G.deathmessage = "disappears as if it was never really there to begin with" G.incorporeal_move = 1 G.alpha = 35 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index e1615c9e44..921e27eda3 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -396,6 +396,7 @@ catto.name = H.name catto.desc = "A cute catto! They remind you of [H] somehow." catto.color = "#[H.dna.features["mcolor"]]" + catto.pseudo_death = TRUE H.forceMove(catto) log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.") //Just to deal with rascally ghosts @@ -403,13 +404,10 @@ //catto.health = 1000 //To simulate fake death, while preventing ghosts escaping. /datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H) - /* - if(catto.health <= 950) //So the dead can't ghost - catto.icon_state = "custom_cat_dead" - catto.Stun(1000) - catto.canmove = 0 - */ - if(prob(5)) + if(catto.health <= 0) //So the dead can't ghost + if(prob(10)) + to_chat(H, "You feel your body start to slowly shift back from it's dead form.") + else if(prob(5)) playsound(get_turf(catto), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) catto.say("lets out a meowrowr!*") ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 9913098efc..2a5450a79b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -467,7 +467,7 @@ var/additions = list("aluminium", "silver", "gold", "plasma", "silicon", "bluespace", "uranium", "milk") required_reagents[pick(additions)] = rand(1, 5)//weird -/datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. +/datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom) SSblackbox.record_feedback("tally", "catgirlium")//log /datum/chemical_reaction/fermi/secretcatchem/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) @@ -476,7 +476,7 @@ for(var/mob/M in seen) to_chat(M, "The reaction suddenly gives out a meow, condensing into a chemcat!")//meow! playsound(get_turf(my_atom), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) - catto.name = "FermiCat" - catto.desc = "A cute Fermichem cat, created by a lot of compicated and confusing chemistry!" + catto.name = "Chemcat" + catto.desc = "A cute chem cat, created by a lot of compicated and confusing chemistry!" catto.color = "#770000" my_atom.reagents.remove_any(10) diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index ee8ca1e94c..96e4e6fd53 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -34,7 +34,8 @@ if(!I) user.put_in_active_hand(src) -/obj/item/FermiChem/pHbooklet/MouseDrop(atom/over_object, mob/living/user) +/obj/item/FermiChem/pHbooklet/MouseDrop() + var/mob/living/user = usr if(numberOfPages >= 1) var/obj/item/FermiChem/pHpaper/P = new /obj/item/FermiChem/pHpaper P.add_fingerprint(user) From afeb1d8870a4a4ca59742c75eda197d871af5375 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 18 Jun 2019 12:49:22 +0100 Subject: [PATCH 279/608] Preholo --- .../chemistry/reagents/eigentstasium.dm | 17 ++++++++++++++--- .../chemistry/reagents/fermi_reagents.dm | 8 ++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index be82130c7c..46ff0bf0bb 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -25,7 +25,7 @@ var/turf/location_created var/turf/open/location_return = null var/addictCyc3 = 0 - var/mob/living/fermi_Tclone = null + var/mob/living/carbon/fermi_Tclone = null var/teleBool = FALSE pH = 3.7 @@ -34,8 +34,15 @@ //Main functions /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! - log_game("FERMICHEM: [M] ckey: [M.key] took eigenstasium") if(current_cycle == 0) + log_game("FERMICHEM: [M] ckey: [M.key] took eigenstasium") + var/typepath = M.type + fermi_Tclone = new typepath(M.loc) + //var/mob/living/carbon/C = fermi_Tclone + fermi_Tclone.appearance = M.appearance + fermi_Tclone.name = "[M.name]'s eigenstate" + fermi_Tclone.alpha = 150 + fermi_Tclone.color = "#0000bb" location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") if(purity > 0.9) //Teleports you home if it's pure enough @@ -45,6 +52,8 @@ do_sparks(5,FALSE,M) do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,M) + + if(prob(20)) do_sparks(5,FALSE,M) ..() @@ -54,6 +63,8 @@ to_chat(M, "You feel your wavefunction collapse!") do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home do_sparks(5,FALSE,M) + qdel(fermi_Tclone) + fermi_Tclone = null ..() /datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly @@ -97,7 +108,7 @@ /datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around! //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in - switch(addictCyc3) //Loops 0 -> 1 -> 2 -> 0 ...ect. + switch(addictCyc3) //Loops 0 -> 1 -> 2 -> 1 -> 2 -> 1 ...ect. if(0) M.Jitter(100) to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the event horizon.") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 921e27eda3..64d44f0973 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -327,7 +327,7 @@ ..() /datum/reagent/fermi/fermiABuffer - name = "Acidic buffer"//defined on setup + name = "Acidic buffer" id = "fermiABuffer" description = "This reagent will consume itself and move the pH of a beaker towards 3 when added to another." taste_description = "an acidy sort of taste, blech." @@ -339,7 +339,7 @@ data = datapH if(LAZYLEN(holder.reagent_list) == 1) return - holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume*3)))/(holder.total_volume + (volume*3)) //Shouldn't be required + holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume*3)))/(holder.total_volume + (volume*3)) var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The beaker fizzes as the pH changes!") @@ -348,7 +348,7 @@ ..() /datum/reagent/fermi/fermiBBuffer - name = "Basic buffer"//defined on setup + name = "Basic buffer" id = "fermiBBuffer" description = "This reagent will consume itself and move the pH of a beaker towards 11 when added to another." taste_description = "an soapy sort of taste, blech." @@ -359,7 +359,7 @@ data = datapH if(LAZYLEN(holder.reagent_list) == 1) return - holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume*3)))/(holder.total_volume + (volume*3)) //Shouldn't be required Might be..? + holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume*3)))/(holder.total_volume + (volume*3)) var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The beaker froths as the pH changes!") From 5436014e19983b026f1aa3d8af119fa59904ef77 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 18 Jun 2019 13:16:37 +0100 Subject: [PATCH 280/608] Swaped split state to holo. --- .../chemistry/reagents/eigentstasium.dm | 24 ++++++++++++------- .../reagents/chemistry/recipes/fermi.dm | 12 +++++----- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index 46ff0bf0bb..e1a846e731 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -23,6 +23,7 @@ addiction_stage4_end = 44 //Incase it's too long data = list("location_created" = null) var/turf/location_created + var/obj/effect/overlay/holo_pad_hologram/Eigenstate var/turf/open/location_return = null var/addictCyc3 = 0 var/mob/living/carbon/fermi_Tclone = null @@ -36,13 +37,19 @@ /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! if(current_cycle == 0) log_game("FERMICHEM: [M] ckey: [M.key] took eigenstasium") - var/typepath = M.type - fermi_Tclone = new typepath(M.loc) - //var/mob/living/carbon/C = fermi_Tclone - fermi_Tclone.appearance = M.appearance - fermi_Tclone.name = "[M.name]'s eigenstate" - fermi_Tclone.alpha = 150 - fermi_Tclone.color = "#0000bb" + + //make hologram at return point + Eigenstate = new(loc) + Eigenstate.add_overlay(image(M)) + Eigenstate.alpha = 170 + Eigenstate.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) + Eigenstate.dir = SOUTH + Eigenstate.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it. + Eigenstate.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. + Eigenstate.setAnchored(TRUE)//So space wind cannot drag it. + Eigenstate.name = "[M]'s' eigenstate"//If someone decides to right click. + Eigenstate.set_light(2) //hologram lighting + location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") if(purity > 0.9) //Teleports you home if it's pure enough @@ -63,8 +70,7 @@ to_chat(M, "You feel your wavefunction collapse!") do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home do_sparks(5,FALSE,M) - qdel(fermi_Tclone) - fermi_Tclone = null + qdel(Eigenstate) ..() /datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 2a5450a79b..2521ff8d5e 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -80,9 +80,9 @@ CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) CurveSharpT = 1.6 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) - ThermicConstant = 5 //Temperature change per 1u produced - HIonRelease = -0.05 //pH change per 1u reaction - RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect + ThermicConstant = 15 //Temperature change per 1u produced + HIonRelease = -0.8 //pH change per 1u reaction + RateUpLim = 2 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way @@ -110,9 +110,9 @@ CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value) - ThermicConstant = -5 // Temperature change per 1u produced - HIonRelease = 0.01 // pH change per 1u reaction (inverse for some reason) - RateUpLim = 3 // Optimal/max rate possible if all conditions are perfect + ThermicConstant = -10 // Temperature change per 1u produced + HIonRelease = 0.02 // pH change per 1u reaction (inverse for some reason) + RateUpLim = 1 // Optimal/max rate possible if all conditions are perfect FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics FermiExplode = TRUE // If the chemical explodes in a special way PurityMin = 0.2 From 68a4e3fc0608e0f856f9006bff92ef95a5f7354b Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 18 Jun 2019 13:38:00 +0100 Subject: [PATCH 281/608] Lil tweaks. --- .../chemistry/reagents/fermi_reagents.dm | 1 + .../reagents/chemistry/recipes/fermi.dm | 22 +++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 64d44f0973..2d496dbaa5 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -116,6 +116,7 @@ description = "OwO whats this?" color = "#H04044" // rgb: , 0, 255 taste_description = "dewicious degenyewacy" + metabolization_rate = 0.5 * REAGENTS_METABOLISM InverseChemVal = 0 var/obj/item/organ/tongue/nT DoNotSplit = TRUE diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 2521ff8d5e..43f3afec78 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -74,17 +74,18 @@ OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 600 // Upper end for above ExplodeTemp = 650 //Temperature at which reaction explodes - OptimalpHMin = 6 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) - OptimalpHMax = 8 // Higest value for above - ReactpHLim = 4 // How far out pH wil react, giving impurity place (Exponential phase) + OptimalpHMin = 7 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + OptimalpHMax = 9 // Higest value for above + ReactpHLim = 5 // How far out pH wil react, giving impurity place (Exponential phase) CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharpT = 1.6 // How sharp the temperature exponential curve is (to the power of value) - CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) - ThermicConstant = 15 //Temperature change per 1u produced - HIonRelease = -0.8 //pH change per 1u reaction - RateUpLim = 2 //Optimal/max rate possible if all conditions are perfect + CurveSharpT = 1.5 // How sharp the temperature exponential curve is (to the power of value) + CurveSharppH = 3 // How sharp the pH exponential curve is (to the power of value) + ThermicConstant = 10 //Temperature change per 1u produced + HIonRelease = -0.5 //pH change per 1u reaction + RateUpLim = 3 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way + PurityMin = 0.4 /datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. var/turf/open/location = get_turf(my_atom) @@ -217,7 +218,7 @@ PurityMin = 0.25 -/datum/chemical_reaction/fermi/enthrall/ +/datum/chemical_reaction/fermi/enthrall/ //check this name = "MKUltra" id = "enthrall" results = list("enthrall" = 0.5) @@ -344,7 +345,7 @@ HIonRelease = -0.1 RateUpLim = 2 FermiChem = TRUE - PurityMin = 0.30 + PurityMin = 0.3 //FOR INSTANT REACTIONS - DO NOT MULTIPLY LIMIT BY 10. //There's a weird rounding error or something ugh. @@ -371,7 +372,6 @@ HIonRelease = 0.01 RateUpLim = 1 FermiChem = TRUE - PurityMin = 0.15 /datum/chemical_reaction/fermi/fermiABuffer//done test name = "Acetic acid buffer" From d2a5e9ddfdf6dbc23b2f16bc792665f0bcbeb36c Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 18 Jun 2019 18:51:30 +0100 Subject: [PATCH 282/608] Makeup panda --- .../living/simple_animal/friendly/panda.dm | 21 ++++++++++++++++++ icons/mob/pets.dmi | Bin 65221 -> 67349 bytes 2 files changed, 21 insertions(+) create mode 100644 code/modules/mob/living/simple_animal/friendly/panda.dm diff --git a/code/modules/mob/living/simple_animal/friendly/panda.dm b/code/modules/mob/living/simple_animal/friendly/panda.dm new file mode 100644 index 0000000000..7c9c9fb1a0 --- /dev/null +++ b/code/modules/mob/living/simple_animal/friendly/panda.dm @@ -0,0 +1,21 @@ +/mob/living/simple_animal/pet/redpanda + name = "Red panda" + desc = "It's a red panda." + icon = 'icons/mob/pets.dmi' + icon_state = "red_panda" + icon_living = "red_panda" + icon_dead = "dead_panda" + speak = list("Ack-Ack","Ack-Ack-Ack-Ackawoooo","Geckers","Awoo","Tchoff") + speak_emote = list("geckers", "barks") + emote_hear = list("howls.","barks.") + emote_see = list("shakes its head.", "shivers.") + speak_chance = 1 + turns_per_move = 5 + see_in_dark = 6 + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 3) + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "kicks" + gold_core_spawnable = FRIENDLY_SPAWN + + do_footstep = TRUE diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi index 773258d3ee942ff2a11648ed46a9a8d1218b5fe5..deb7716c28c0535dd2bbe1a97e7d4b71d1d05033 100644 GIT binary patch delta 9663 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

      A-UALV=t5FM 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 F{|7D;-FyH5 From ade3a4bced91bee2968d6673ddb55e4905ee194c Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 18 Jun 2019 19:06:26 +0100 Subject: [PATCH 283/608] Fixes. --- .../living/simple_animal/friendly/panda.dm | 9 ++++----- icons/mob/pets.dmi | Bin 67349 -> 67278 bytes .../chemistry/reagents/eigentstasium.dm | 3 +-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/simple_animal/friendly/panda.dm b/code/modules/mob/living/simple_animal/friendly/panda.dm index 7c9c9fb1a0..ef3f0c6c23 100644 --- a/code/modules/mob/living/simple_animal/friendly/panda.dm +++ b/code/modules/mob/living/simple_animal/friendly/panda.dm @@ -5,10 +5,10 @@ icon_state = "red_panda" icon_living = "red_panda" icon_dead = "dead_panda" - speak = list("Ack-Ack","Ack-Ack-Ack-Ackawoooo","Geckers","Awoo","Tchoff") - speak_emote = list("geckers", "barks") - emote_hear = list("howls.","barks.") - emote_see = list("shakes its head.", "shivers.") + speak = list("Churip","Chuuriip","Cheep-cheep","Chiteurp","squueeaacipt") + speak_emote = list("chirps", "huff-quacks") + emote_hear = list("squeak-chrips.", "huff-squacks.") + emote_see = list("shakes its head.", "rolls about.") speak_chance = 1 turns_per_move = 5 see_in_dark = 6 @@ -17,5 +17,4 @@ response_disarm = "gently pushes aside" response_harm = "kicks" gold_core_spawnable = FRIENDLY_SPAWN - do_footstep = TRUE diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi index deb7716c28c0535dd2bbe1a97e7d4b71d1d05033..e7444f194fbb232bfdd196af4f56dd9f26d7578d 100644 GIT binary patch delta 10120 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 delta 10192 zcma)iWn2|q`0db0iGXwpNQZQYAky7k(p}OugrcG}2uL@GbT^2EhwkRk-QDNT`@i?= z{oQ*$%{&wP*?XQ?Ywa@>iJBON8pD936wAmA{(|KMqFHtensuA?3ox_6I0#Rc4Cr{ota(n^Ec|Bk-JGObK&wRY2rWoHw=7aA6;OcNtJ zH7q5nS9N2^^JKTNqdZ_Qx4Uj*1b3o-uRg4PDXq&tZ=vj*#PM;mh~hwXJ5lx>lBD|r zVtXW(z7kuVt?4<>vKc2I@5+!RKX2Kf{>9TiyW7iPvO@UHpMzaETEWoWHtaC}YJxVA zRIY*)1!vkK6yqkmgr{>QgR?Sy>SGbI!GUJ|QB56Yx>gDQGT-~u!-QYTgctF1Ry?&%0p*I%z&%q#x59M|Qp z*Z>-%?pWGx{~y(S|Kj-mt@e$*66RICc@=yoW*;QJ_JAd| zfO{p^cR}LL|6ux6RkDvqghM(czx#`MzgxJA-R8Aa;^mO-u=}N;Jc7YHJY4x4L`iIx zqpKZPAev#Uld#tGwxgVE%Kb@>kU))m?cA&B00$(U8V5>!c{6p9jPTXHIy_Y1R(X>CL8=kZhb;hA3|bw znZ1@WZ1%G;c6rmdY5&}JHYhH2+_ADzgV}Kzn^W$J=54Z+Rbs1O929f7Tb}iEUC3$- z?;m^^oT5p+#&+k>4_CXf{!$%)YzPMt%R;}{;GkiAtPJlMEyWs{{NpRHk6_>5{pw|X zD?&w{f(jaO7^?ZyimduEzVBDfuPpY2a;K}hskq0ioxZ*jjOMfET~A4t@R{W@l-M0- zJ9|v%2~>~!+-sJQ<~5?9{ScdqjwMoV7dI&MY%cUKC@l1ssXHvRR~Tszk}=Jy|0$8?%F^K zZ&6v9jDrK4d1W#^3@#VMPE3d#5^Sm61_Q3I1T$jZMB!O%4zRrv!v8$I)wOGgz_1?9 zNWZ{M7x&ijTk8h@20nG^4nbTEH~caD*dEEGDFVkfPg?f^k(SunnZXf7#j^SeFOj#o zJi9SSW+qvVV;90+>Y>d>q%=Z|jj&Bt&`zATIaECI)ij2cwqOWgb!VpT#PJ=!aNu(#Q<5`ASeRChY zx~zXyEBpg(+o`Im3{(-FGIl?<>`^mRanm;>_bHw#27Ya~w$jooMrbkNV=}k%mRLq! zs(Riup#z`0R$PVB`cu!@a$SWe@jiDovakFf>o~qM@IN+Q-2XolxPsonC?_lXd17>w z&T4Ke@7`7DcieNl&u1^iDcp<4wOVMP0V=V3iIK5Bcf}byyqMS5X?ubmMgV-tu~mE! z6%olxWYb-pDAwHG*-^jL)z*H0xX>sRaLv8DyG!Y>Lq$auH-8{Qi!Z@W+%+>pS~IT# z6I2wU{L$0XQ{lb=Dku(r%s5-=`n=-ROl1t8m)~~=De<;WJD)w3fbJsZFhD(Et{k!2 zkmM#!DB>O5{Q2t_tCqGl-MquN+it===Q(sfX*zerkheeU^a3BVs16&gmaKk0vg`BH zT{#C=Hby8QAs|KD@6XVHG~Fq zqey^uV4GfzZR}|Z>vpX;+wiB>@Op7P8+*EloEonKgD*ME8}se`AZuJw(9@!9yN6W~_QL!>4*$T(9%|xb4*C~7Sp%i9X6+znM`SEX)&jB z2i9!GoVcHFtJl=kiD*P$>`kKtukIEc1Z3l$%#fW{5-vTa*@2WQbhMwWK|W;fIZU&D zE>2FJH-5dPV^dS%b#(%YGC;cNuGd>4>7Coh=&=l!d3M0-yqkxIC+B;XPN@M}J3M-5 zXehy(7y}u}Zf7k2OYfSH&#@V-mYqo@tiHK0f9KXoWmD}zDl|OLh*erBP(0oM59i`m^u8pv-7Q$X%o2TbOqSThB|Ix11CNU z#|9!YTlS)G$?rTD3F5Tgzv=1enK?M5nTaH!45Gyk9^TSS?|Q6_pPMuIyXLk5P12zm zhyFalyy@X)-Q59Pan-~6Bnfa^&6&Ql&@D^}R8hCRN&E8_20!pBk%2qcQ^=xRGz2X) zrl`frNzGJ)HqkGl-z+XJDkQrNXNU>2fh85$n2>ugn1Ys$PQk^C8FRqaqI@nYPDBe3 z`mm`4+r|cg3K#$CEvar0Bmw%$5sK~MPj`Z!Y zFg)Vx`e=PNYrJeX@@_BGMt`s%UW`BYDys`4sW{5xWoqw zOSx+a9gw3?xDF)@Ra8*W5K-GTx)3onUrj~@CMPF<@$_+sCPERRLY5fY{9G*>q&=Xd z@^3Yf%2l6iv*p7opLR(7u4H@EyLX|I@*3bl?&0l96(1h&CcfRe6@q8fXGj# z=gzXcYSZr>PEy`K4>HcMq8Nc(|7s0z;5|w9*}R)0;qsIVrNiyQ7JU|TmlXcI$5Snx z#Bipu{5+4|(`jZtI8gacYyJqFXkGirjAm_Ft{`dDff~LUP&+H)m0FR+iH`UI*M7UDkZg?{7J8y&aSJ|`Bhrl4b}F_ayuGgE|b^#;`{Gj zQx}r9tk+Ov+!7yLNrJI;g9-g>FH=;$z#H62o|QYFamt&$<m z@TJwO4BHY@(89p5Fd?sfQa^uxBvK~i-A!ObZrE|lf8`I_MzdF*iLr5{hi3VAOjKkI zPtRI=8bbj#UMdfoS@x_PW8Z@w3Ku2e@{$t8`Y!(6kIhX@?i!DC`*$AW$Nv>A|L+E( zx8iQAsK_CJjEoG_LWra>^eCt_3;bWis^MUX&Sg&8fZ2lcbV--qtAC#`5Pbda=3@^& zeSHk{p=1gEsTg}?R_C6s8(rB$M|T)mXhIq+rGOU4*R(BbGzk0U;sM$@P$aW$M&#M? z?FVjY1;JAnQj?k4s_f@^9@?;W;r1K6h*R*CQU7L`ISIkpf*Ej;bHBe+eZ0C3FE^>F z%^(T`ZFm<{rQC#F0J2qP>s&de>3A|&f}HS zcn!#m7XuG=>QH55!R}BS@Hkp(wY9g0t=4JIHhY(s&5y60kWR^#6Y{P7oGQz>?8Kn4 zWEUhfHm*|KcTWwHR)}02LL+x8WMiAZlzjyTlvJF6qH{E2T)A~wPN1W3W1aY^#LO$@ z>O;KQi)h_PRz&NS{ltoW7Ne>I-iU1`F4B4@idoUXxy+_%lJPRMB<#MxWnzZW+(J{f zCd*!uOI{z}ujt&B5VDP8_#Uk|$b+}7hmbauu6}h*FB=8K$S$56e^4>WA_*5p0tb2e zh?Dw1`Mh?95$5m!JcB1H3r-xM-nLEB+$>B=)&W9kRD0 zaM)_Fgy*CAJR#opIi~}rP;ibdFW9(z$3(O|eS~U$ijd%xcU4%RO6EhpC1Z3@qiMZv zDXs9NCEnd1cb*460f7F^INawoUgq%D7i^PnUN!CR8wyrnlU>g&w~!EKu3A`n@=r7g zDvD+&4{AkC&G?m?5+yYmFHKFt%frP~ojNc0Cu|arq>@2Y{=BDet^q+f7{D8ZxP!0# zFm�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 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index e1a846e731..c4d8a225e3 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -40,10 +40,9 @@ //make hologram at return point Eigenstate = new(loc) - Eigenstate.add_overlay(image(M)) + Eigenstate.appearance = M.appearance Eigenstate.alpha = 170 Eigenstate.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) - Eigenstate.dir = SOUTH Eigenstate.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it. Eigenstate.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. Eigenstate.setAnchored(TRUE)//So space wind cannot drag it. From 345acdc94e2c829e800a952258dd25e5a14283db Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 18 Jun 2019 19:38:08 +0100 Subject: [PATCH 284/608] I just can't wait to be king --- icons/mob/pets.dmi | Bin 67278 -> 67276 bytes .../reagents/chemistry/recipes/fermi.dm | 7 ++++--- tgstation.dme | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi index e7444f194fbb232bfdd196af4f56dd9f26d7578d..10f29f51e4bd210f1ad794a16c17a159e4108107 100644 GIT binary patch delta 9318 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 BFLnR` diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 43f3afec78..9552b58ab3 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -81,7 +81,7 @@ CurveSharpT = 1.5 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 3 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = 10 //Temperature change per 1u produced - HIonRelease = -0.5 //pH change per 1u reaction + HIonRelease = -0.01 //pH change per 1u reaction RateUpLim = 3 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way @@ -90,8 +90,9 @@ /datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. var/turf/open/location = get_turf(my_atom) var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list - E.location_created = location - E.data.["location_created"] = location + if(location) + E.location_created = location + E.data.["location_created"] = location //serum diff --git a/tgstation.dme b/tgstation.dme index db2e7f77e7..9aafb1b60b 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2105,6 +2105,7 @@ #include "code\modules\mob\living\simple_animal\friendly\gondola.dm" #include "code\modules\mob\living\simple_animal\friendly\lizard.dm" #include "code\modules\mob\living\simple_animal\friendly\mouse.dm" +#include "code\modules\mob\living\simple_animal\friendly\panda.dm" #include "code\modules\mob\living\simple_animal\friendly\penguin.dm" #include "code\modules\mob\living\simple_animal\friendly\pet.dm" #include "code\modules\mob\living\simple_animal\friendly\sloth.dm" From 38ed75dc6877d4426eeb566d28ef847316bb2e61 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 18 Jun 2019 22:48:34 +0100 Subject: [PATCH 285/608] Reverts sneaky pandas --- .../living/simple_animal/friendly/panda.dm | 20 ------------------- .../reagents/chemistry/recipes/fermi.dm | 2 +- tgstation.dme | 1 - 3 files changed, 1 insertion(+), 22 deletions(-) delete mode 100644 code/modules/mob/living/simple_animal/friendly/panda.dm diff --git a/code/modules/mob/living/simple_animal/friendly/panda.dm b/code/modules/mob/living/simple_animal/friendly/panda.dm deleted file mode 100644 index ef3f0c6c23..0000000000 --- a/code/modules/mob/living/simple_animal/friendly/panda.dm +++ /dev/null @@ -1,20 +0,0 @@ -/mob/living/simple_animal/pet/redpanda - name = "Red panda" - desc = "It's a red panda." - icon = 'icons/mob/pets.dmi' - icon_state = "red_panda" - icon_living = "red_panda" - icon_dead = "dead_panda" - speak = list("Churip","Chuuriip","Cheep-cheep","Chiteurp","squueeaacipt") - speak_emote = list("chirps", "huff-quacks") - emote_hear = list("squeak-chrips.", "huff-squacks.") - emote_see = list("shakes its head.", "rolls about.") - speak_chance = 1 - turns_per_move = 5 - see_in_dark = 6 - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 3) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" - gold_core_spawnable = FRIENDLY_SPAWN - do_footstep = TRUE diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 9552b58ab3..0069edc20d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -81,7 +81,7 @@ CurveSharpT = 1.5 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 3 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = 10 //Temperature change per 1u produced - HIonRelease = -0.01 //pH change per 1u reaction + HIonRelease = -0.02 //pH change per 1u reaction RateUpLim = 3 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way diff --git a/tgstation.dme b/tgstation.dme index 9aafb1b60b..db2e7f77e7 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2105,7 +2105,6 @@ #include "code\modules\mob\living\simple_animal\friendly\gondola.dm" #include "code\modules\mob\living\simple_animal\friendly\lizard.dm" #include "code\modules\mob\living\simple_animal\friendly\mouse.dm" -#include "code\modules\mob\living\simple_animal\friendly\panda.dm" #include "code\modules\mob\living\simple_animal\friendly\penguin.dm" #include "code\modules\mob\living\simple_animal\friendly\pet.dm" #include "code\modules\mob\living\simple_animal\friendly\sloth.dm" From 1cefd6fca7ea78f902af30d4ce7023a341452597 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 19 Jun 2019 23:04:08 +0100 Subject: [PATCH 286/608] Added a few more comments for reviewers as I was reviewing myself. --- code/modules/reagents/chemistry/holder.dm | 111 +++++++----------- .../reagents/chemistry/recipes/fermi.dm | 2 +- 2 files changed, 44 insertions(+), 69 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 7ac01a4072..04b9b22ed8 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -47,16 +47,16 @@ var/maximum_volume = 100 var/atom/my_atom = null var/chem_temp = 150 - var/pH = REAGENT_NORMAL_PH//This is definately 7, right? + var/pH = REAGENT_NORMAL_PH//Potential of hydrogen. Edited on adding new reagents, deleting reagents, and during fermi reactions. var/overallPurity = 1 var/last_tick = 1 var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() var/reagents_holder_flags - var/targetVol = 0 - var/reactedVol = 0 - var/fermiIsReacting = FALSE - var/fermiReactID = null + var/targetVol = 0 //the target volume, i.e. the total amount that can be created during a fermichem reaction. + var/reactedVol = 0 //how much of the reagent is reacted during a fermireaction + var/fermiIsReacting = FALSE //that prevents multiple reactions from occurring (i.e. add_reagent calls to process_reactions(), this stops any extra reactions.) + var/fermiReactID = null //ID of the chem being made during a fermireaction, kept here so it's cache isn't lost between loops/procs. /datum/reagents/New(maximum=100, new_flags) maximum_volume = maximum @@ -461,8 +461,11 @@ fermiReactID = selected_reaction reaction_occurred = 1 SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log + + else //It's a little bit of a confusing nest, but esstentially we check if it's a fermireaction, then temperature, then pH. If this is true, the remainer of this handler is run. + return 0 //If pH is out of range else - return 0 + return 0 //If not hot enough //Standard reaction mechanics: else @@ -514,77 +517,50 @@ var/multiplier = INFINITY for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01)) + multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.001)) if (multiplier == 0) - STOP_PROCESSING(SSprocessing, src) - fermiIsReacting = FALSE - reactedVol = 0 - targetVol = 0 - //pH check, handled at the end to reduce calls. - if(istype(my_atom, /obj/item/reagent_containers)) - var/obj/item/reagent_containers/RC = my_atom - RC.pH_check() - C.FermiFinish(src, my_atom, multiplier) - handle_reactions() - update_total() - //Reaction sounds and words - playsound(get_turf(my_atom), C.mix_sound, 80, 1) - var/list/seen = viewers(5, get_turf(my_atom)) - var/iconhtml = icon2html(my_atom, seen) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] [C.mix_message]") + fermiEnd(multipler) return for(var/P in cached_results) targetVol = cached_results[P]*multiplier if (fermiIsReacting == FALSE) - CRASH("Fermi has refused to stop reacting even though we asked her nicely.") if (chem_temp > C.OptimalTempMin && fermiIsReacting == TRUE)//To prevent pointless reactions - if (reactedVol < targetVol) - reactedVol = FermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) - else - STOP_PROCESSING(SSprocessing, src) - fermiIsReacting = FALSE - reactedVol = 0 - targetVol = 0 - //pH check, handled at the end to reduce calls. - if(istype(my_atom, /obj/item/reagent_containers)) - var/obj/item/reagent_containers/RC = my_atom - RC.pH_check() - C.FermiFinish(src, my_atom, multiplier) - handle_reactions() - update_total() - //Reaction sounds and words - playsound(get_turf(my_atom), C.mix_sound, 80, 1) - var/list/seen = viewers(5, get_turf(my_atom)) - var/iconhtml = icon2html(my_atom, seen) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] [C.mix_message]") + if( (pH >= (C.OptimalpHMin - C.ReactpHLim)) && (pH <= (C.OptimalpHMax + C.ReactpHLim)) ) + if (reactedVol < targetVol) + reactedVol = fermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) + else//Volume is used up + fermiEnd(multipler) + return + else//pH is out of range + fermiEnd(multipler) return - else - STOP_PROCESSING(SSprocessing, src) - fermiIsReacting = FALSE - reactedVol = 0 - targetVol = 0 - //pH check, handled at the end to reduce calls. - if(istype(my_atom, /obj/item/reagent_containers)) - var/obj/item/reagent_containers/RC = my_atom - RC.pH_check() - C.FermiFinish(src, my_atom, multiplier) - handle_reactions() - update_total() - //Reaction sounds and words - playsound(get_turf(my_atom), C.mix_sound, 80, 1) - var/list/seen = viewers(5, get_turf(my_atom)) - var/iconhtml = icon2html(my_atom, seen) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] [C.mix_message]") + else//Temperature is too low, or reaction has stopped. + fermiEnd(multipler) return +/datum/reagents/proc/fermiEnd(multipler) + STOP_PROCESSING(SSprocessing, src) + fermiIsReacting = FALSE + reactedVol = 0 + targetVol = 0 + //pH check, handled at the end to reduce calls. + if(istype(my_atom, /obj/item/reagent_containers)) + var/obj/item/reagent_containers/RC = my_atom + RC.pH_check() + C.FermiFinish(src, my_atom, multiplier) + handle_reactions() + update_total() + //Reaction sounds and words + playsound(get_turf(my_atom), C.mix_sound, 80, 1) + var/list/seen = viewers(5, get_turf(my_atom)) + var/iconhtml = icon2html(my_atom, seen) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] [C.mix_message]") -/datum/reagents/proc/FermiReact(selected_reaction, cached_temp, cached_pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) +/datum/reagents/proc/fermiReact(selected_reaction, cached_temp, cached_pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) var/datum/chemical_reaction/fermi/C = selected_reaction var/deltaT = 0 var/deltapH = 0 @@ -638,7 +614,7 @@ //stepChemAmmount = CLAMP(((deltaT * multiplier), 0, ((targetVol - reactedVol)/cached_results[P])) //used to have multipler, now it does stepChemAmmount = (multiplier*cached_results[P]) if (stepChemAmmount >= C.RateUpLim) - stepChemAmmount = (C.RateUpLim)//something weird with this line maybe. + stepChemAmmount = (C.RateUpLim) addChemAmmount = deltaT * stepChemAmmount if (addChemAmmount >= (targetVol - reactedVol)) addChemAmmount = (targetVol - reactedVol) @@ -858,19 +834,18 @@ for(var/A in cached_reagents) var/datum/reagent/R = A if (R.id == reagent) //IF MERGING - //WIP_TAG //check my maths for purity calculations //Add amount and equalize purity R.volume += amount R.purity = ((R.purity * R.volume) + (other_purity * amount)) /((R.volume + amount)) //This should add the purity to the product - update_total() if(my_atom) my_atom.on_reagent_change(ADD_REAGENT) - R.on_merge(data, amount, my_atom, other_purity) if(isliving(my_atom)) if(R.OnMobMergeCheck == TRUE)//Forces on_mob_add proc when a chem is merged R.on_mob_add(my_atom, amount) + else + R.on_merge(data, amount, my_atom, other_purity) if(!no_react) handle_reactions() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 0069edc20d..9f925226e6 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -85,7 +85,7 @@ RateUpLim = 3 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way - PurityMin = 0.4 + PurityMin = 0.4 //The minimum purity something has to be above, otherwise it explodes. /datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. var/turf/open/location = get_turf(my_atom) From b51f902c146db01dc3003b02d8a2a2267e00f89f Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 20 Jun 2019 02:13:36 +0100 Subject: [PATCH 287/608] I can't spell --- code/modules/reagents/chemistry/holder.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 04b9b22ed8..31fbabf22b 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -532,16 +532,17 @@ if (reactedVol < targetVol) reactedVol = fermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) else//Volume is used up - fermiEnd(multipler) + fermiEnd(multiplier) return else//pH is out of range - fermiEnd(multipler) + fermiEnd(multiplier) return else//Temperature is too low, or reaction has stopped. - fermiEnd(multipler) + fermiEnd(multiplier) return -/datum/reagents/proc/fermiEnd(multipler) +/datum/reagents/proc/fermiEnd(multiplier) + var/datum/chemical_reaction/fermi/C = fermiReactID STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE reactedVol = 0 From 35cc690f91e1ab6e2371296e238cf6217a22fb14 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 20 Jun 2019 02:16:53 +0100 Subject: [PATCH 288/608] One more sneaky multiplier! --- code/modules/reagents/chemistry/holder.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 31fbabf22b..0ba9a0613e 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -519,7 +519,7 @@ for(var/B in cached_required_reagents) // multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.001)) if (multiplier == 0) - fermiEnd(multipler) + fermiEnd(multiplier) return for(var/P in cached_results) targetVol = cached_results[P]*multiplier From 7a3542fc5c9eddbda69a0014f261875f0701a463 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 20 Jun 2019 02:49:30 +0100 Subject: [PATCH 289/608] Double messages. --- modular_citadel/code/datums/status_effects/chems.dm | 3 +-- .../code/modules/reagents/chemistry/recipes/fermi.dm | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index dc41eed0eb..ab99effa7d 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -607,7 +607,7 @@ /datum/status_effect/chem/enthrall/proc/owner_resist() var/mob/living/carbon/M = owner - to_chat(owner, "You attempt to fight against against [(owner.lewd?"[enthrallGender]":"[master]")]'s influence!'") + to_chat(owner, "You attempt to fight against [master]'s influence!") //Able to resist checks if (status == "Sleeper" || phase == 0) @@ -657,7 +657,6 @@ if(prob(5)) M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes deltaResist *= 1.5 - to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") //nymphomania if (M.canbearoused && HAS_TRAIT(M, TRAIT_NYMPHO))//I'm okay with this being removed. deltaResist*= 0.5-(((2/200)*M.arousalloss)/1)//more aroused you are, the weaker resistance you can give, the less you are, the more you gain. (+/- 0.5) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 9f925226e6..39c53f49ad 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -57,9 +57,10 @@ e.set_up(round((volume/30)*(pH-9)), T, 0, 0) e.start() - if(!ImpureTot == 0) //If impure, v.small emp + if(!ImpureTot == 0) //If impure, v.small emp (0.6 or less) ImpureTot *= volume - empulse(T, volume/10, ImpureTot/10, 1) + var/empVol = CLAMP (volume/10, 0, 15) + empulse(T, empVol, ImpureTot/10, 1) my_atom.reagents.clear_reagents() //just in case return From ee9d234af64d29dcc957d8cc08bda92eabc42b19 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 20 Jun 2019 03:09:38 +0100 Subject: [PATCH 290/608] Spelling, again. --- modular_citadel/code/datums/status_effects/chems.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index ab99effa7d..f7c1d7c72b 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -267,8 +267,9 @@ switch(phase) if(-1)//fully removed SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall") - owner.remove_status_effect(src) log_game("FERMICHEM: MKULTRA: Status REMOVED from [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].") + owner.remove_status_effect(src) + return if(0)// sleeper agent if (cooldown > 0) cooldown -= 1 @@ -362,7 +363,7 @@ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing4") if(9 to INFINITY)//If they're not nearby, enable withdrawl effects. withdrawal = TRUE @@ -531,8 +532,8 @@ redirect_component = null UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") - to_chat(owner, "You're now free of [master]'s influence, and fully independant oncemore!'") - //UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) //Should still make custom commands work after freedom, need to check. + to_chat(owner, "You're now free of [master]'s influence, and fully independent!'") + UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) /datum/status_effect/chem/enthrall/proc/owner_hear(var/hearer, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) From d2685be3f65f9294d3c470bf23778156e9a48c11 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 22 Jun 2019 12:18:38 +0100 Subject: [PATCH 291/608] Split custom echo code into it's own call to reduce overhead. --- code/modules/surgery/organs/vocal_cords.dm | 44 ++++++++++++++----- .../code/datums/status_effects/chems.dm | 10 +++++ .../reagents/chemistry/reagents/MKUltra.dm | 2 +- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index b69d857739..0f8e8dd570 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -617,9 +617,6 @@ name = "velvet chords" desc = "The voice spoken from these just make you want to drift off, sleep and obey." icon_state = "in_love" - var/next_command = 0 - var/cooldown_mod = 1 - var/base_multiplier = 1 /datum/action/item_action/organ_action/velvet/Trigger() . = ..() @@ -638,7 +635,7 @@ ///////////FermiChem////////////////// ////////////////////////////////////// //Removed span_list from input arguments. //mob/living/user -/proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE, debug = FALSE) +/proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = TRUE, message_admins = TRUE, debug = FALSE) if(!user || !user.can_speak() || user.stat) return 0 //no cooldown @@ -651,8 +648,8 @@ for(var/mob/living/L in get_hearers_in_view(8, user)) if(L.can_hear() && !L.anti_magic_check(FALSE, TRUE) && L.stat != DEAD) if(L.has_status_effect(/datum/status_effect/chem/enthrall))//Check to see if they have the status - //if(L == user && !include_speaker) //Remove this if I decide to make OD apply to self. - // continue + if(L == user && !include_speaker) //Remove this if I decide to make OD apply to self. + continue if(ishuman(L)) var/mob/living/carbon/human/H = L if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) @@ -758,6 +755,7 @@ var/static/regex/statecustom_words = regex("state triggers|state your triggers") var/static/regex/custom_words = regex("new trigger|listen to me") var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|trance")//What a descriptive name! + var/static/regex/custom_echo = regex("obsess|fills your mind|loop") var/static/regex/recognise_words = regex("recognise me|did you miss me?") var/static/regex/objective_words = regex("new objective|obey this command|unable to resist|compulsed") var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die") @@ -1081,7 +1079,9 @@ H.SetStun(1000) if (E.mental_capacity >= 10) var/trigger = stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN) - var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) + var/custom_words_words_list = list("speak", "echo", "shock", "cum", "kneel", "strip", "trance") + var/trigger2 = input(user, "Pick an effect", "Effects") in custom_words_words_list + //var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) trigger2 = lowertext(trigger2) if ((findtext(trigger2, custom_words_words))) if (trigger2 == "speak" || trigger2 == "echo") @@ -1100,6 +1100,28 @@ user.SetStun(0) H.SetStun(0) + //CUSTOM ECHO + else if((findtext(message, custom_echo))) + for(var/V in listeners) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) + if(E.phase == 3) + if (get_dist(user, H) > 1)//Requires user to be next to their pet. + to_chat(user, "You need to be next to your pet to give them a new echophrase!") + return + else + user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") + user.SetStun(1000)//Hands are handy, so you have to stay still + H.SetStun(1000) + var/trigger = stripped_input(user, "Enter the loop phrase", MAX_MESSAGE_LEN) + var/customSpan = list("Notice", "Warning", "Hypnophrase", "Love") + var/trigger2 = input(user, "Pick the style", "Style") in customSpan + trigger2 = lowertext(trigger2) + E.customEcho = trigger + E.customSpan = trigger2 + user.SetStun(0) + H.SetStun(0) + //CUSTOM OBJECTIVE else if((findtext(message, objective_words))) for(var/V in listeners) @@ -1113,7 +1135,7 @@ user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") user.SetStun(1000)//So you can't run away! H.SetStun(1000) - if (E.mental_capacity >= 250 || message == "objective") + if (E.mental_capacity >= 200) var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", MAX_MESSAGE_LEN) if(!LAZYLEN(objective)) return @@ -1128,7 +1150,6 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.lewd?"Your [E.enthrallGender]":"[E.master]")] whispers you a new objective."), 5) brainwash(H, objective) E.mental_capacity -= 200 - //else if (E.mental_capacity >= 150) else to_chat(user, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") user.SetStun(0) @@ -1197,7 +1218,7 @@ var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only - L.adjust_bodytemperature(-50 * power_multiplier)//This + L.adjust_bodytemperature(-50 * power_multiplier) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You feel your metabolism slow down!"), 5) @@ -1241,7 +1262,8 @@ return if(message_admins)//Do you want this in? message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") - log_game("FERMICHEM: [key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") + if(debug == TRUE) + log_game("FERMICHEM: [key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") //SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) If this is on, it fills the thing up and OOFs the server return diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index f7c1d7c72b..d320a54fd6 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -212,6 +212,9 @@ var/DistApart = 1 //Distance between master and owner var/tranceTime = 0 //how long trance effects apply on trance status + var/customEcho //Custom looping text in owner + var/customSpan //Custom spans for looping text + /datum/status_effect/chem/enthrall/on_apply() var/mob/living/carbon/M = owner var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list @@ -496,6 +499,13 @@ //Truth serum? //adrenals? + //customEcho + if(customEcho) + if(prob(5)) + if(!customSpan) //just in case! + customSpan = "notice" + to_chat(owner, "[customEcho].") + //final tidying resistanceTally += deltaResist deltaResist = 0 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 20334a2151..1cb8731092 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -150,7 +150,7 @@ Creating a chem with a low purity will make you permanently fall in love with so name = "MKUltraTest" id = "enthrallTest" description = "A forbidden deep red mixture that overwhelms a foreign body with waves of joy, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." - color = "#2C051A" // rgb: , 0, 255 + color = "#c40020" // rgb: , 0, 255 data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Fermis Yakumo") creatorID = "honkatonkbramblesnatch"//ckey creatorGender = "Mistress" From 226dbe78041180cd51ec4b63e4815b1fc69d3ef2 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 22 Jun 2019 13:09:18 +0100 Subject: [PATCH 292/608] Fixed blank sprite for velvet chord organ --- code/modules/surgery/organs/vocal_cords.dm | 17 +++++++++++++++-- icons/obj/surgery.dmi | Bin 34739 -> 35031 bytes .../code/datums/status_effects/chems.dm | 5 +++-- .../reagents/chemistry/reagents/MKUltra.dm | 2 +- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 0f8e8dd570..9c09937908 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -614,9 +614,22 @@ //Heavily modified voice of god code /obj/item/organ/vocal_cords/velvet - name = "velvet chords" + name = "Velvet chords" desc = "The voice spoken from these just make you want to drift off, sleep and obey." - icon_state = "in_love" + icon_state = "velvet_chords" + +/datum/action/item_action/organ_action/velvet + name = "Velvet speech" + var/obj/item/organ/vocal_cords/velvet/cords = null + icon_icon = 'icons/mob/screen_alert.dmi' + button_icon_state = "in_love" + +/datum/action/item_action/organ_action/velvet/New() + ..() + cords = target + +/datum/action/item_action/organ_action/velvet/IsAvailable() + return TRUE /datum/action/item_action/organ_action/velvet/Trigger() . = ..() diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 9a2d2ceb1a45bf002333e9255cbac8229197528f..c6819b770f3394cd352b02ec6f045e92e70df491 100755 GIT binary patch delta 15779 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 0) //custom trances only last 50 ticks. tranceTime -= 1 - else if (!tranceTime == null) //remove trance after. + else if (tranceTime <= 0) //remove trance after. M.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) M.remove_status_effect(/datum/status_effect/trance) tranceTime = null + message_admins("test") //..() //Remove all stuff @@ -597,7 +598,7 @@ C.lay_down() //strip (some) clothes - else if (lowertext(customTriggers[trigger]) == "strip")//This wasn't meant to just be a lewd thing oops, is this pref breaking? + else if (lowertext(customTriggers[trigger]) == "strip")//This wasn't meant to just be a lewd thing oops. var/mob/living/carbon/human/o = owner var/items = o.get_contents() for(var/obj/item/W in items) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 1cb8731092..ae70175842 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -133,7 +133,7 @@ Creating a chem with a low purity will make you permanently fall in love with so name = "MKUltra" id = "enthrall" description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." - color = "#2C051A" // rgb: , 0, 255 + color = "#80000c" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. DoNotSplit = TRUE From 1f5a7c0a256f7c092c58a8b2e8606327e04d3991 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 22 Jun 2019 13:31:55 +0100 Subject: [PATCH 293/608] Added velvet styling --- code/modules/surgery/organs/vocal_cords.dm | 5 +++-- interface/stylesheet.dm | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 9c09937908..8a42752615 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -617,6 +617,7 @@ name = "Velvet chords" desc = "The voice spoken from these just make you want to drift off, sleep and obey." icon_state = "velvet_chords" + spans = list("velvet","croon") /datum/action/item_action/organ_action/velvet name = "Velvet speech" @@ -633,7 +634,7 @@ /datum/action/item_action/organ_action/velvet/Trigger() . = ..() - var/command = input(owner, "Speak with the Voice of God", "Command") + var/command = input(owner, "Speak in a sultry tone", "Command") if(QDELETED(src) || QDELETED(owner)) return if(!command) @@ -1127,7 +1128,7 @@ user.SetStun(1000)//Hands are handy, so you have to stay still H.SetStun(1000) var/trigger = stripped_input(user, "Enter the loop phrase", MAX_MESSAGE_LEN) - var/customSpan = list("Notice", "Warning", "Hypnophrase", "Love") + var/customSpan = list("Notice", "Warning", "Hypnophrase", "Love", "Velvet") var/trigger2 = input(user, "Pick the style", "Style") in customSpan trigger2 = lowertext(trigger2) E.customEcho = trigger diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index b7c8dbc19e..9fb09a3d3a 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -153,6 +153,7 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 3;} .clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.velvet {color: #840000; font-style: italic} .hypnophrase {color: #3bb5d3; font-weight: bold; animation: hypnocolor 1500ms infinite;} @keyframes hypnocolor { 0% { color: #0d0d0d; } From 4b0efa962cbbf756384e4752e64c90ae4e2796d1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 22 Jun 2019 13:36:19 +0100 Subject: [PATCH 294/608] Forgot to saveee --- icons/obj/surgery.dmi | Bin 35031 -> 35064 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index c6819b770f3394cd352b02ec6f045e92e70df491..d55624940bd19096757224d635151529e2ed096f 100755 GIT binary patch delta 14926 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 delta 14893 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 From f096e8440a872ae711a8ce51f793a4fbd9d87450 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 22 Jun 2019 21:00:20 +0100 Subject: [PATCH 295/608] Finally fixed the vocalchord button --- .../browserassets/css/browserOutput.css | 7 ++++ code/modules/surgery/organs/vocal_cords.dm | 34 ++++++++++-------- goon/browserassets/css/browserOutput.css | 9 ++++- icons/mob/actions.dmi | Bin 9310 -> 9484 bytes icons/obj/surgery.dmi | Bin 35064 -> 35060 bytes interface/stylesheet.dm | 8 ++++- .../code/datums/status_effects/chems.dm | 2 +- .../reagents/chemistry/reagents/MKUltra.dm | 3 +- 8 files changed, 44 insertions(+), 19 deletions(-) diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index ab8fee1616..2e8dd17163 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -395,6 +395,13 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 24px;} .clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.velvet {color: #660015; font-weight: bold; animation: velvet 3000ms infinite;} +@keyframes velvet { + 0% { color: #400020; } + 50% { color: #FF0000; } + 100% { color: #400020; } +} + .hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;} @keyframes hypnocolor { 0% { color: #202020; } diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 8a42752615..2ef8d52f8c 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -617,13 +617,16 @@ name = "Velvet chords" desc = "The voice spoken from these just make you want to drift off, sleep and obey." icon_state = "velvet_chords" - spans = list("velvet","croon") + actions_types = list(/datum/action/item_action/organ_action/velvet) + spans = list("velvet") /datum/action/item_action/organ_action/velvet - name = "Velvet speech" + name = "Velvet chords" var/obj/item/organ/vocal_cords/velvet/cords = null - icon_icon = 'icons/mob/screen_alert.dmi' - button_icon_state = "in_love" + //icon_icon = 'icons/mob/screen_alert.dmi' + //button_icon_state = "velvet_chords" + //icon = 'icons/mob/screen_alert.dmi' + //icon_state = "in_love" /datum/action/item_action/organ_action/velvet/New() ..() @@ -641,6 +644,9 @@ return owner.say(".x[command]") +/obj/item/organ/vocal_cords/velvet/can_speak_with() + return TRUE + /obj/item/organ/vocal_cords/velvet/handle_speech(message) //actually say the message owner.say(message, spans = spans, sanitize = FALSE) velvetspeech(message, owner) @@ -814,7 +820,7 @@ if(L == user) continue if (L.lewd) - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] has praised me!!"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] has praised me!!"), 5) if(HAS_TRAIT(L, TRAIT_NYMPHO)) L.adjustArousalLoss(2*power_multiplier) if(HAS_TRAIT(L, TRAIT_MASO)) @@ -1070,11 +1076,12 @@ var/speaktrigger = "" var/mob/living/carbon/C = V var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) - if (E.phase > 2) + if (E.phase == 3) for (var/trigger in E.customTriggers) speaktrigger += "[trigger], " - ADD_TRAIT(C, TRAIT_DEAF, "Triggers") //So you don't trigger yourself! Actually this will trigger yourself oops. - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, /atom/movable/proc/say, "[speaktrigger]"), 5) + ADD_TRAIT(C, TRAIT_DEAF, "Triggers") //So you don't trigger yourself! + //addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, /atom/movable/proc/say, "[speaktrigger]"), 5) + C.say("[speaktrigger]") REMOVE_TRAIT(C, TRAIT_DEAF, "Triggers") @@ -1088,12 +1095,12 @@ to_chat(user, "You need to be next to your pet to give them a new trigger!") return else - user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") + user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.") user.SetStun(1000)//Hands are handy, so you have to stay still H.SetStun(1000) if (E.mental_capacity >= 10) var/trigger = stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN) - var/custom_words_words_list = list("speak", "echo", "shock", "cum", "kneel", "strip", "trance") + var/custom_words_words_list = list("Speak", "Echo", "Shock", "Cum", "Kneel", "Strip", "Trance") var/trigger2 = input(user, "Pick an effect", "Effects") in custom_words_words_list //var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) trigger2 = lowertext(trigger2) @@ -1124,7 +1131,7 @@ to_chat(user, "You need to be next to your pet to give them a new echophrase!") return else - user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") + user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.") user.SetStun(1000)//Hands are handy, so you have to stay still H.SetStun(1000) var/trigger = stripped_input(user, "Enter the loop phrase", MAX_MESSAGE_LEN) @@ -1146,12 +1153,13 @@ to_chat(user, "You need to be next to your pet to give them a new objective!") return else - user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") + user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") user.SetStun(1000)//So you can't run away! H.SetStun(1000) if (E.mental_capacity >= 200) var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", MAX_MESSAGE_LEN) if(!LAZYLEN(objective)) + to_chat(user, "You can't give your pet an objective to do nothing!") return //Pets don't understand harm objective = replacetext(lowertext(objective), "kill", "hug") @@ -1272,8 +1280,6 @@ E.status = "charge" E.cooldown += 10 - else - return if(message_admins)//Do you want this in? message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") if(debug == TRUE) diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index 674ab7c2b6..c24de22f84 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -392,6 +392,13 @@ h1.alert, h2.alert {color: #000000;} .greentext {color: #00FF00; font-size: 24px;} .redtext {color: #FF0000; font-size: 24px;} .clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} +.velvet {color: #660015; font-weight: bold; animation: velvet 3000ms infinite;} +@keyframes velvet { + 0% { color: #400020; } + 50% { color: #FF0000; } + 100% { color: #400020; } +} + .hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;} @keyframes hypnocolor { 0% { color: #202020; } @@ -864,4 +871,4 @@ h1.alert, h2.alert {color: #000000;} /* HELPER CLASSES */ .text-normal {font-weight: normal; font-style: normal;} -.hidden {display: none; visibility: hidden;} \ No newline at end of file +.hidden {display: none; visibility: hidden;} diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 65b5733ffe6223ee83d79d4d43cfbb2a9024b675..4e23c102ce34a83c6515259088004aa8e2f19413 100644 GIT binary patch delta 9339 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 delta 9166 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 diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index d55624940bd19096757224d635151529e2ed096f..3641e8a9235c34ab439bf45333d3b614033dca9e 100755 GIT binary patch delta 14863 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 jI+ueTUOeQxsjeO*1$>5+3|JEZu`QTM|cm4hE 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 diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 9fb09a3d3a..d2af0cf9d7 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -153,7 +153,13 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 3;} .clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} -.velvet {color: #840000; font-style: italic} +.velvet {color: #660015; font-weight: bold; animation: velvet 3000ms infinite;} +@keyframes velvet { + 0% { color: #400020; } + 50% { color: #FF0000; } + 100% { color: #400020; } +} + .hypnophrase {color: #3bb5d3; font-weight: bold; animation: hypnocolor 1500ms infinite;} @keyframes hypnocolor { 0% { color: #0d0d0d; } diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 8c5fbed8cb..9b5cf5d445 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -522,7 +522,7 @@ cooldown = 0 if (tranceTime > 0) //custom trances only last 50 ticks. tranceTime -= 1 - else if (tranceTime <= 0) //remove trance after. + else if (!tranceTime == null) //remove trance after. M.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) M.remove_status_effect(/datum/status_effect/trance) tranceTime = null diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index ae70175842..10e6bc2239 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -133,7 +133,7 @@ Creating a chem with a low purity will make you permanently fall in love with so name = "MKUltra" id = "enthrall" description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." - color = "#80000c" // rgb: , 0, 255 + color = "#660015" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. DoNotSplit = TRUE @@ -150,7 +150,6 @@ Creating a chem with a low purity will make you permanently fall in love with so name = "MKUltraTest" id = "enthrallTest" description = "A forbidden deep red mixture that overwhelms a foreign body with waves of joy, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." - color = "#c40020" // rgb: , 0, 255 data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Fermis Yakumo") creatorID = "honkatonkbramblesnatch"//ckey creatorGender = "Mistress" From 59b6d85c4e155b5dfd71a6e925ba5cd70b8d6213 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 22 Jun 2019 21:59:20 +0100 Subject: [PATCH 296/608] Few phrasing and span editing fixes. --- code/modules/surgery/organs/vocal_cords.dm | 17 ++++--- .../code/datums/status_effects/chems.dm | 49 ++++++++++--------- .../reagents/chemistry/reagents/MKUltra.dm | 16 ++++-- 3 files changed, 46 insertions(+), 36 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 2ef8d52f8c..e93d97c3c3 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1070,19 +1070,20 @@ //tier3 //STATE TRIGGERS - //Doesn't work, Maintaners, help. else if((findtext(message, statecustom_words)))//doesn't work for(var/V in listeners) - var/speaktrigger = "" var/mob/living/carbon/C = V var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) if (E.phase == 3) + var/speaktrigger = "" + user.emote("me", 1, "whispers something quietly.") + if (get_dist(user, H) > 1)//Requires user to be next to their pet. + to_chat(user, "You need to be next to your pet to hear them!") + return for (var/trigger in E.customTriggers) speaktrigger += "[trigger], " - ADD_TRAIT(C, TRAIT_DEAF, "Triggers") //So you don't trigger yourself! - //addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, /atom/movable/proc/say, "[speaktrigger]"), 5) - C.say("[speaktrigger]") - REMOVE_TRAIT(C, TRAIT_DEAF, "Triggers") + to_chat(user, "C whispers, [speaktrigger] are my triggers.")//So they don't trigger themselves! + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You whisper your triggers to [(H.lewd?"Your [E.enthrallGender]":"[E.master]")]."), 5) //CUSTOM TRIGGERS @@ -1099,14 +1100,14 @@ user.SetStun(1000)//Hands are handy, so you have to stay still H.SetStun(1000) if (E.mental_capacity >= 10) - var/trigger = stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN) + var/trigger = html_decode(stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN)) var/custom_words_words_list = list("Speak", "Echo", "Shock", "Cum", "Kneel", "Strip", "Trance") var/trigger2 = input(user, "Pick an effect", "Effects") in custom_words_words_list //var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) trigger2 = lowertext(trigger2) if ((findtext(trigger2, custom_words_words))) if (trigger2 == "speak" || trigger2 == "echo") - var/trigger3 = stripped_input(user, "Enter the phrase spoken.", MAX_MESSAGE_LEN) + var/trigger3 = html_decode(stripped_input(user, "Enter the phrase spoken.", MAX_MESSAGE_LEN)) E.customTriggers[trigger] = list(trigger2, trigger3) message_admins("[H] has been implanted by [user] with [trigger], triggering [trigger2], to send [trigger3].") else diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 9b5cf5d445..744827b0d0 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -236,7 +236,7 @@ H.lewd = FALSE var/message = "[(owner.lewd?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) - to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") + to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") log_game("FERMICHEM: MKULTRA: Status applied on [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].") return ..() @@ -244,10 +244,7 @@ var/mob/living/carbon/M = owner //chem calculations - if (owner.reagents.has_reagent("enthrall")) - if (phase >= 2) - enthrallTally += phase - else + if!owner.reagents.has_reagent("enthrall"))) if (phase < 3 && phase != 0) deltaResist += 3//If you've no chem, then you break out quickly if(prob(10)) @@ -284,7 +281,7 @@ resistanceTally /= 2 enthrallTally = 0 if(owner.lewd) - to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") + to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") else else if (resistanceTally > 150) @@ -295,7 +292,7 @@ owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) if(owner.lewd) - to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") + to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") if (2) //partially enthralled if (enthrallTally > 250) phase += 1 @@ -303,7 +300,7 @@ enthrallTally = 0 resistanceTally /= 2 if(owner.lewd) - to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") + to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. else to_chat(owner, "You are unable to put up a resistance any longer, and now are under the control of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [master] in death. ") @@ -317,7 +314,7 @@ to_chat(owner, "You manage to shake some of the effects from your addled mind, however you can still feel yourself drawn towards [master].") if(prob(10)) if(owner.lewd) - to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") + to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (3)//fully entranced if ((resistanceTally >= 200 && withdrawalTick >= 150) || (HAS_TRAIT(M, TRAIT_MINDSHIELD) && (resistanceTally >= 100))) enthrallTally = 0 @@ -330,7 +327,7 @@ if(owner.lewd) to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken - if (mental_capacity >= 499 && (owner.getBrainLoss() >=20 || HAS_TRAIT(M, TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra")) + if (mental_capacity >= 499 && (owner.getBrainLoss() <=20 || HAS_TRAIT(M, TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra")) phase = 2 mental_capacity = 500 customTriggers = list() @@ -357,16 +354,20 @@ if(0 to 8)//If the enchanter is within range, increase enthrallTally, remove withdrawal subproc and undo withdrawal effects. if(phase <= 2) enthrallTally += distancelist[get_dist(master, owner)+1] - withdrawal = FALSE if(withdrawalTick > 0) withdrawalTick -= 2 - M.hallucination = max(0, M.hallucination - 2) - M.stuttering = max(0, M.stuttering - 2) - M.jitteriness = max(0, M.jitteriness - 2) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing4") + //calming effects + M.hallucination = max(0, M.hallucination - 1) + M.stuttering = max(0, M.stuttering - 1) + M.jitteriness = max(0, M.jitteriness - 1) + if(owner.getBrainLoss() >=60) + owner.adjustBrainLoss(-0.1) + if(withdrawal == TRUE) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing4") + withdrawal = FALSE if(9 to INFINITY)//If they're not nearby, enable withdrawl effects. withdrawal = TRUE @@ -500,7 +501,7 @@ //adrenals? //customEcho - if(customEcho) + if(customEcho && withdrawl == FALSE) if(prob(5)) if(!customSpan) //just in case! customSpan = "notice" @@ -520,12 +521,12 @@ to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") cooldownMsg = TRUE cooldown = 0 - if (tranceTime > 0) //custom trances only last 50 ticks. + if (tranceTime > 0 && tranceTime != 51) //custom trances only last 50 ticks. tranceTime -= 1 - else if (!tranceTime == null) //remove trance after. + else if (tranceTime == 0) //remove trance after. M.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) M.remove_status_effect(/datum/status_effect/trance) - tranceTime = null + tranceTime = 51 message_admins("test") //..() @@ -632,9 +633,9 @@ return else if (phase == 3 && withdrawal == FALSE) if(owner.lewd) - to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance. Try getting away from them.") + to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance. If you get split up from them, then you might be able to entertain the idea of resisting.") else - to_chat(owner, "You are unable to resist [master] in your current state. Try getting away from them.") + to_chat(owner, "You are unable to resist [master] in your current state. If you get split up from them, then you might be able to resist.") return else if (status == "Antiresist")//If ordered to not resist; resisting while ordered to not makes it last longer, and increases the rate in which you are enthralled. if (statusStrength > 0) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 10e6bc2239..0eb61ce136 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -227,7 +227,9 @@ Creating a chem with a low purity will make you permanently fall in love with so return if(volume < 1)//You don't get to escape that easily FallInLove(pick(GLOB.player_list), M) - if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it does nothing. + if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it supresses the vocal effects, for stealth. + var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) + Vc.spans = null return if(!M.client) metabolization_rate = 0 //Stops powergamers from quitting to avoid affects. but prevents affects on players that don't exist for performance. @@ -239,8 +241,7 @@ Creating a chem with a low purity will make you permanently fall in love with so return else E.enthrallTally += 1 - if(prob(1)) - M.adjustBrainLoss(1)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it. + M.adjustBrainLoss(0.05)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it. ..() /datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I made it so the creator is set to gain the status for someone random. @@ -282,7 +283,13 @@ Creating a chem with a low purity will make you permanently fall in love with so E.customTriggers = list() /datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M) - M.adjustBrainLoss(0.1)//should be 15 in total + M.adjustBrainLoss(0.025)//should be ~40 in total + ..() + +/datum/reagent/fermi/enthrall/on_mob_delete(mob/living/carbon/M) + if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it supresses the vocal effects, for stealth. + var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) + Vc.spans = list("velvet") ..() //Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system. @@ -348,3 +355,4 @@ Creating a chem with a low purity will make you permanently fall in love with so return //For addiction see chem.dm +//For vocal commands see vocal_cords.dm From 21c17813b89eba256e9d34599df068bca87ee250 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 23 Jun 2019 01:20:11 +0100 Subject: [PATCH 297/608] Guess who should've compile tested! --- code/datums/brain_damage/hypnosis.dm | 2 +- .../mood_events/generic_positive_events.dm | 4 +- .../browserassets/css/browserOutput.css | 4 +- code/modules/surgery/organs/vocal_cords.dm | 167 ++++++++++++++++-- goon/browserassets/css/browserOutput.css | 4 +- icons/obj/surgery.dmi | Bin 35060 -> 35071 bytes interface/stylesheet.dm | 4 +- .../code/datums/status_effects/chems.dm | 51 +++--- .../reagents/chemistry/reagents/MKUltra.dm | 14 +- 9 files changed, 198 insertions(+), 52 deletions(-) diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm index 8ffffa8693..aa8d385092 100644 --- a/code/datums/brain_damage/hypnosis.dm +++ b/code/datums/brain_damage/hypnosis.dm @@ -53,7 +53,7 @@ /datum/brain_trauma/hypnosis/on_lose() message_admins("[ADMIN_LOOKUPFLW(owner)] is no longer hypnotized with the phrase '[hypnotic_phrase]'.") log_game("[key_name(owner)] is no longer hypnotized with the phrase '[hypnotic_phrase]'.") - to_chat(owner, "You suddenly snap out of your hypnosis. The phrase '[hypnotic_phrase]' no longer feels important to you.") + to_chat(owner, "You suddenly snap out of your fixation. The phrase '[hypnotic_phrase]' no longer feels important to you.") ..() /datum/brain_trauma/hypnosis/on_life() diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index bdf1f69e10..422ec4476c 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -108,8 +108,8 @@ /datum/mood_event/happy_empath description = "Someone seems happy!\n" - mood_change = 2 + mood_change = 3 timeout = 600 /datum/mood_event/happy_empath/add_effects(var/mob/happytarget) - description = "[happytarget.name]'s happiness is infectious!\n" + description = "[happytarget.name]'s happiness is infectious!\n" diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 2e8dd17163..ee199a7b0d 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -398,7 +398,9 @@ h1.alert, h2.alert {color: #000000;} .velvet {color: #660015; font-weight: bold; animation: velvet 3000ms infinite;} @keyframes velvet { 0% { color: #400020; } - 50% { color: #FF0000; } + 25% { color: #FF0000; } + 50% { color: #FFAAAA; } + 75% { color: #FF0000; } 100% { color: #400020; } } diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index e93d97c3c3..2cb70928b7 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -655,7 +655,7 @@ ///////////FermiChem////////////////// ////////////////////////////////////// //Removed span_list from input arguments. //mob/living/user -/proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = TRUE, message_admins = TRUE, debug = FALSE) +/proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = TRUE, message_admins = FALSE, debug = FALSE) if(!user || !user.can_speak() || user.stat) return 0 //no cooldown @@ -749,14 +749,15 @@ to_chat(world, "[user]'s power is [power_multiplier].") //Mixables - var/static/regex/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara") //enthral_words works - var/static/regex/reward_words = regex("good boy|good girl|good pet|good job") //reward_words works - var/static/regex/punish_words = regex("bad boy|bad girl|bad pet|bad job") ////punish_words works + var/static/regex/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara") + var/static/regex/reward_words = regex("good boy|good girl|good pet|good job") + var/static/regex/punish_words = regex("bad boy|bad girl|bad pet|bad job") //phase 0 - var/static/regex/saymyname_words = regex("say my name|who am i|whoami") //works I think + var/static/regex/saymyname_words = regex("say my name|who am i|whoami") var/static/regex/wakeup_words = regex("revert|awaken|snap") //works //phase1 - var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") //works + var/static/regex/petstatus_words = regex("how are you|what is your status|are you okay") + var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") var/static/regex/antiresist_words = regex("unable to resist|give in")//useful if you think your target is resisting a lot var/static/regex/resist_words = regex("resist|snap out of it|fight")//useful if two enthrallers are fighting var/static/regex/forget_words = regex("forget|muddled|awake and forget") @@ -860,6 +861,8 @@ SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold, descmessage) E.cooldown += 1 + + //teir 0 //SAY MY NAME works if((findtext(message, saymyname_words))) @@ -890,6 +893,136 @@ //tier 1 + + //PETSTATUS i.e. how they are + else if((findtext(message, petstatus_words))) + for(var/V in listeners) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) + REMOVE_TRAIT(H, TRAIT_MUTE, "enthrall") + var/speaktrigger = "" + //phase + switch(E.phase) + if(0) + continue + if(1) + addtimer(CALLBACK(H, /atom/movable/proc/say, "I feel happy being with you."), 5) + continue + if(2) + speaktrigger += "I think I'm in love with you... " + if(3) + speaktrigger += "I'm devoted to [(H.lewd?"being your pet":"following you")]! " + if(4) + speaktrigger += "[(H.lewd?"You are my whole world and all of my being belongs to you, ":"I cannot think of anything else but you, ")] "//Redflags!! + + //mood + GET_COMPONENT_FROM(mood, /datum/component/mood, H) + switch(mood.sanity) + if(SANITY_GREAT to INFINITY) + speaktrigger += "I'm beyond elated!! " + if(SANITY_NEUTRAL to SANITY_GREAT) + speaktrigger += "I'm really happy! " + if(SANITY_DISTURBED to SANITY_NEUTRAL) + speaktrigger += "I'm a little sad, " + if(SANITY_UNSTABLE to SANITY_DISTURBED) + speaktrigger += "I'm really upset, " + if(SANITY_CRAZY to SANITY_UNSTABLE) + speaktrigger += "I'm about to fall apart without you! " + if(SANITY_INSANE to SANITY_CRAZY) + speaktrigger += "Hold me, please.. " + + //Withdrawal + switch(E.withdrawalTick) + if(10 to 36) + speaktrigger += "I missed you, " + if(36 to 66) + speaktrigger += "I missed you, but I knew you'd come back for me! " + if(66 to 90) + speaktrigger += "I couldn't take being away from you like that, " + if(90 to 140) + speaktrigger += "I was so scared you'd never come back, " + if(140 to INFINITY) + speaktrigger += "I'm hurt that you left me like that... I felt so alone... " + + //hunger + switch(H.nutrition) + if(0 to NUTRITION_LEVEL_STARVING) + speaktrigger += "I'm famished, please feed me..! " + if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) + speaktrigger += "I'm so hungry... " + if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) + speaktrigger += "I'm hungry, " + if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) + speaktrigger += "I'm sated, " + if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) + speaktrigger += "I've a full belly! " + if(NUTRITION_LEVEL_FULL to INFINITY) + speaktrigger += "I'm fat... " + + //health + switch(H.health) + if(100) + speaktrigger += "I feel fit, " + if(80 to 99) + speaktrigger += "I ache a little bit, " + if(40 to 80) + speaktrigger += "I'm really hurt, " + if(0 to 40) + speaktrigger += "I'm in a lot of pain, help! " + if(-INFINITY to 0) + speaktrigger += "I'm barely concious and in so much pain, please help me! " + //toxin + switch(H.getToxLoss()) + if(10 to 30) + speaktrigger += "I feel a bit queasy... " + if(30 to 60) + speaktrigger += "I feel nauseous... " + if(60 to INFINITY) + speaktrigger += "My head is pounding and I feel like I'm going to be sick... " + //oxygen + if (H.getOxyLoss() >= 25) + speaktrigger += "I can't breathe! " + //blind + if (HAS_TRAIT(H, TRAIT_BLIND)) + speaktrigger += "I can't see! " + //deaf..? + if (HAS_TRAIT(H, TRAIT_DEAF))//How the heck you managed to get here I have no idea, but just in case! + speaktrigger += "I can barely hear you! " + //And the brain damage. And the brain damage. And the brain damage. And the brain damage. And the brain damage. + switch(H.getBrainLoss()) + if(20 to 40) + speaktrigger += "I have a mild head ache, " + if(40 to 80) + speaktrigger += "I feel disorentated and confused, " + if(80 to 120) + speaktrigger += "My head feels like it's about to explode, " + if(120 to 160) + speaktrigger += "You are the only thing keeping my brain sane, " + if(160 to INFINITY) + speaktrigger += "I feel like I'm on the brink of losing my mind, " + + //horny + if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && H.lewd) + switch(H.getArousalLoss()) + if(40 to 60) + speaktrigger += "I'm feeling a little horny, " + if(60 to 80) + speaktrigger += "I'm feeling horny, " + if(80 to INFINITY) + speaktrigger += "I'm really, really horny, " + + //collar + if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar)) + speaktrigger += "and thank you for the collar, " + //End + if(H.lewd) + speaktrigger += "[E.enthrallGender]!" + else + speaktrigger += "[user.first_name()]!" + //say it! + addtimer(CALLBACK(H, /atom/movable/proc/say, "[speaktrigger]"), 5) + E.cooldown += 1 + //SILENCE else if((findtext(message, silence_words))) for(var/mob/living/carbon/C in listeners) @@ -1076,14 +1209,14 @@ var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) if (E.phase == 3) var/speaktrigger = "" - user.emote("me", 1, "whispers something quietly.") - if (get_dist(user, H) > 1)//Requires user to be next to their pet. + C.emote("me", 1, "whispers something quietly.") + if (get_dist(user, C) > 1)//Requires user to be next to their pet. to_chat(user, "You need to be next to your pet to hear them!") - return + continue for (var/trigger in E.customTriggers) speaktrigger += "[trigger], " - to_chat(user, "C whispers, [speaktrigger] are my triggers.")//So they don't trigger themselves! - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You whisper your triggers to [(H.lewd?"Your [E.enthrallGender]":"[E.master]")]."), 5) + to_chat(user, "[C] whispers, \"[speaktrigger] are my triggers.\"")//So they don't trigger themselves! + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You whisper your triggers to [(C.lewd?"Your [E.enthrallGender]":"[E.master]")]."), 5) //CUSTOM TRIGGERS @@ -1094,12 +1227,12 @@ if(E.phase == 3) if (get_dist(user, H) > 1)//Requires user to be next to their pet. to_chat(user, "You need to be next to your pet to give them a new trigger!") - return + continue else user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.") user.SetStun(1000)//Hands are handy, so you have to stay still H.SetStun(1000) - if (E.mental_capacity >= 10) + if (E.mental_capacity >= 5) var/trigger = html_decode(stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN)) var/custom_words_words_list = list("Speak", "Echo", "Shock", "Cum", "Kneel", "Strip", "Trance") var/trigger2 = input(user, "Pick an effect", "Effects") in custom_words_words_list @@ -1113,7 +1246,7 @@ else E.customTriggers[trigger] = trigger2 message_admins("[H] has been implanted by [user] with [trigger], triggering [trigger2].") - E.mental_capacity -= 10 + E.mental_capacity -= 5 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.lewd?"your [E.enthrallGender]":"[E.master]")] whispers you a new trigger."), 5) else to_chat(user, "Your pet looks at you confused, it seems they don't understand that effect!") @@ -1130,7 +1263,7 @@ if(E.phase == 3) if (get_dist(user, H) > 1)//Requires user to be next to their pet. to_chat(user, "You need to be next to your pet to give them a new echophrase!") - return + continue else user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.") user.SetStun(1000)//Hands are handy, so you have to stay still @@ -1152,7 +1285,7 @@ if(E.phase == 3) if (get_dist(user, H) > 1)//Requires user to be next to their pet. to_chat(user, "You need to be next to your pet to give them a new objective!") - return + continue else user.emote("me", 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") user.SetStun(1000)//So you can't run away! @@ -1161,7 +1294,7 @@ var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", MAX_MESSAGE_LEN) if(!LAZYLEN(objective)) to_chat(user, "You can't give your pet an objective to do nothing!") - return + continue //Pets don't understand harm objective = replacetext(lowertext(objective), "kill", "hug") objective = replacetext(lowertext(objective), "murder", "cuddle") diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index c24de22f84..102c8ac40c 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -395,7 +395,9 @@ h1.alert, h2.alert {color: #000000;} .velvet {color: #660015; font-weight: bold; animation: velvet 3000ms infinite;} @keyframes velvet { 0% { color: #400020; } - 50% { color: #FF0000; } + 25% { color: #FF0000; } + 50% { color: #FFAAAA; } + 75% { color: #FF0000; } 100% { color: #400020; } } diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 3641e8a9235c34ab439bf45333d3b614033dca9e..eed8ee64e7228757af820e8285e69003dbe23d56 100755 GIT binary patch delta 14772 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%0Dro|QN_m71rDDIly-DZ=N{A~)j?9ix z-WKnILc-~$(4x}Al`xaRTASoQW`}uogGg9hAzFdI=>ZsrLo-KR|QF! zAE-h3(9BR0za7!BXj#DwlxG?ku4MiRXDAk$uUK1`m+i$*D!Ef=fI8qn_B0H6!eqm* z7}h%aH^dBto%#fc*e&ZSdOy1HFm8fA%rtB$@yF@DH-urIsnGU(&;q zH-;|m61Ghk5l!1t8OY8duox(T!385FWhQx|R>T4Mkq7;x&;CB%jMnzVm{7=Jgcy+N z(u?VR=fyt%W>gi#f7D&@>N;YjPBz81CG?moawsPsk0J``= zTKO>XFDL^Y@e8FT%%J{Lqhnp@$Ez_8p0%-P{&el8;k^_=W1+%(ui|A*!sY#LJ}kJc z)duBVolN?Ft)|S|{d($yi$ji7g>U2RXB^i>^9mNj;&d2`*$Wd;9_W`K%5hjByVv~6 z8dF-$WTNr8H|gYk1llX)L++`uF%X5VX*iGq@e)2KV&^OoFogeIcpj&XK*WQtU6aa1 zK=@9Rwa!Qq^N{A5WGZ@iEiN2qI+e$7fv=9;gLGsuhu%gNT*4=k8prJ{_D?E$|qOlYp zN#Kw3Tbb&rw|i-WU$3w;^>JcjTpBq)NX%T|>WpU1zR;%Pir{BU`qHtAl<`sW67l=U zO!a^ZX8%d6!uwUqn>C>}9?*c|j2c>g;eCgFDdP7UYf5R@(sC{(O(Q^qCxOBF>YAx? zxiyYoKb$0x;tT^C&23_fOyS)+A6Bk~v9d)(WaBq2{~o(_Uy|BU>HNuK_jrpW_YSth zNQce4C08JM&80Vw-->*fERz46H*OkJ>-cy2pe-$f`2It)OKa?f8|cp_;wOoN7C=rN zkCFJE;5+q0VsGBk4f3#+q0i6EVKuS1i!0AA&G{LsOE330XZ~;{H;xB0sMayZ0u={r*&$WG}$&N%@MaqnY=eKDcV-~tyMVi zSqr+LFVnswEqYg6z@G=qyAeHc+S-`dczG)H80#A0>ewiNR1sfZiAqt*6a@4AgzRJF z>32U!fYpYB&ZHL4)lG$CnUcPQ?&O6uK|6K=rA1#;&hKQ{N(ANBki{_7CR8zhD0ga@^j`!|==7d%6dP`*g^Z$c>#BKsF8 zWI~*oycTcj22B2&#rkv70Vgq0(9Vk{nA%}{`+_g3P>F2q@Jy4fY_%4-0;EP7 z>dlV<-|FS9Se!h*jY%t=({f=OBjR?lo+MN|a|arQ`a#!}`8AG45|fHrJqm+TU$(TXuarLY1BL`CDy^>!=J`ic3!1ei zC?L-c3*#bNmfWAlA(81oGwrxW$C&gNaum|PK0OcR3-qo&&DPzcs1Y)mxLFI5LZbs_ zm)j&|v);Y4D!f(Vo%I|(n|laD0T`_a3k!>pOg&J}y#j^U`>n^@RE}B#Umf1!)c>AP2@~JjA z&moXqMj(6&yLn)D)Bu&c8M+@&!COkL*ykP2kHS%eCfs8&x9(9ayQRf~M==;uX>AD- zH6Gsikeyj-rRPlyztTu2F~{oU>K7}zML!ub;F`big+joxX7lh>^;Ls8 zW+HW{HGv95#q3c!U2oVKM$v=g+pDY>9)0e z7EUECksWDZCwL?21{|og3o%x74Wya;6wR)emNG%GJ5cAG+lylo|Dj78c9quky{@dx z)vM~JW~H>Yx&HBMA^6gv#olBwaL~@{j2lN!y-dSoLx;73$5b>msDW9Mk!F{0_iIo? z-rj>(=+P#HKtL0I)g;SK7dnHggWO(zuaPHGiU&=G&+i^hV|Tu9#vlJLW6Kfu;(mKA z0q6C~Qf%Lg4Z<(v5uiBCnIA`qSjzv}!nSzQR!ldhI}j$q6e9t&S8S>WbCk)964!|Z zVh-~k6Hyais3d&A#pkw1r9|*{(0qu3+V!Wya>kh9F}nvF zFe@hwoJ=;NKJipo<-(%U@Kf|MYj@4%-%X%Rj4mlGs@>ApdK1L&*3bLER$sbCxj5Y^ zE@8c}?&w3IQ@(6-pXq%~<9Il-7HhgF(#p}}_lw-$58+#W;;e)G_^yzDlI=la`=ti}u8HJ_q1kDAZ8lK~-esjK6+*(C4N0cgjtkfHlNX1~ z^sUzl234WLtS9YGwDeI?FKxM}HXd}PuXu0v^Ug4U0z}#E0dVG0F6F2DaL@{Sk`t1% zbw|;8a-usYyaWIBy*QSE?eXwP0YQnzZDEk`x_8?SSpD%0d2tKVLh9XXojU6}^NL%j zm(3va4=c2V>&ayL1-N}VyvPHa^T5B|p*Ouesi~re4A_LYI>X`1%m)(W#R2!pL9xr? zHp}4z>QKSE#v~j1EFsjQG+O!Hp0@c`mmK4Y35klU(Aj`f8(jpYogX71|bK{37jn8;X5`uLP;4jdXRSyk4P}3F@k3Kz6Ji zJ(?_Q<^0n2ylR-k{!)|H_t$f+wCM7#pSyfB=`)>YtemOC#O;07pH`XQmTFE-ck&b= zZzT1|o!(KO8FXskmuD` znT-{N+am)P7Z+A9oZh|D(LaC12rSZNnOwepb!=G~aIiAhznWn)Jl`Q+r@&QZOKF$* zjVRRc31<}`^O-VIEu=RV^i>cGPC<)Sca(hJAQgZs#Q`Ikn0`fEbNrz$8}tz+?7*xr z%fE=ckdh2k#t>x3%%};DX>b&ktK!paJS|VKTKaI0vMi4v+vr<86jM~fam*d;mCna` z^5oW2-S4HoPxe=C>6V)x;RId-1DY+O7mv6iemjF{ZFl?^d1E)oP&Jn7u)tX@=>J+} zucZ6Rmo^S-8UL;&fH*_VJ1L*na!LFsXSlu%LSo>M#j%r zn)AnIw*LTiy?5{mAt3JPkkfo^fI0Tva`O>}7PdoU;e_#`DrkOZQj7;Y;pwS^8h$@R{8|}80YsGtLFlrKeH(y z^Iw!A;_+kZ24$4UFD2R9f0YLE^;C$y#)4qKMY{ReXLmnn0DFM=rjLuh9x zU}Qif3U>wz67;n9H5aSPxV3#RoobDdkpcU+@b@Y!mjpg7S3b)ly%&-0B*J8Q^$oLE zV8%YqY*od6Sgz@AY-H1xRoBx33*TisM1}}0ZL=C#QEf@MgKOf( zhcIUu#d^*yzalb2==M;k|2)aR$h>Htao*^12HKSuRzeWJef_YXBmQiY)5u8_phx6L z0BYq`en=6eMt%kZ!w&!@H*Xsr=D@&0C);3zpXL*ZgYa&jhPk; z6=5>?m_A`N5&PILc7|;gP-_tjzblkrthxfb#$GlWO;0(t9&?NxyQks! z@Q)D)qosV9>}xR>ix~$16yE^xz`*situNjUT=FUxp@K~jb`MKK_wcm8HfVsJayupX zUWFjWVfq&G%7P1O+?ho_BYxyVJ8k7Jf@F6LmSF(Tb4d=H=DEa@@WNsXa`<;gTZ@-m zUEUY5k%Pa#MmO}4+L8c37Ag1<5t)lpTX-ZwnYE%Q_Zp^L<&9n1zkgBx$~XPu_`sn) zS-X)Zd?Yvj(+1KmM7R2qI*_d*seQ5EH9CCJ@K-3uOwlo5jKmhW@_4b_b8zy`Zs^?BOAVlD=mC%%o9F)~aM`N2Icf0N6{h#eOpIUT7XO*01TTXbQFQY^{yJb-HH89E^G^Q&6ERW|_2 z(6OE@{XW-J=w{>{HaEm;|4aYvVyN(S^r9ycKTpbL&z1F}QMwlUhm|QuQDZ;qhROyE zV@gg+kaG&DeOi3mkLb&*)4|xGL*ceYT_EeB?&f7k$3r0$MFw0@Iw?&{^^nk6moD@IH;F(tI>DN&-Scatpa( zbBm~ndIwq?ZHNGLM^X8rg1+*VHP{oL^!wA(5T`y1w1l-(%)!gph121t@*E|dnetO7 zi8peuZLAp#C_*Mv-<&)oY8d^ww{d#FS~xjF6rvAkJcC)q#UC^;CbT9qz!vBPy60nR zljO`z0aqrzn++=wKdb4>c?M*BPzFVonEZi*iWV^cbuE)~J+QYL7o$8XgTMFen;cJrMc zY%>MrvWS!f6pz`!5pEiukk$cSl-CO6@_t%CZT~xWb|74;Zh|*M@ttuDf~ehhUa*MW zv{u=vVy7lj-*pF+)qN&pjem^%{+q9l!ZcmsV{cmM3-LpIp^XS}tko;n;e>pc^)ahS zl76+T^OQPqYn!D^sCG=_3QEq60-@^+r)L9a`tl~5fyJsmbWOa1)8;X$+FL8`(A)zJK2w2hvqwffVH7R{E14nHQ~qZ2_WC5wDfmq!I< zpc7)!QAI5V9e60*17HGFV%4bTmE<|6ypD${Ll{+E18s~I2M3Vb#+&;m`AcA56TiyUFtPLc^`uMfh5@$F}xL` zsIATdNT%|f{^%)$1CN3u^##*FUl-cq~IAQ_hb?Z&jX;2O&g{eZRfJk}R5iWJI(GIU`ua$h-2!Sb;vNkN@DX6csD(aDfMt@0 zW3~8lxE7i{#6rk@hCOru`_B&qWMs$v-YOUk54QG9rjQB`ry>QAOE4Bq1WoMc3>&jDf2pCyG|*2XY; znX;Op^HmJn%e&CAm{Oauf{=D?!{f7z_U2|{Z+a#T8la66J6&eJoAF>G%fb;mLyo<% zsX_xB-d^w;K`;c2i7H|fGx?~9LQ8+0%uiJLj-a^a@XTq zIJw#l(F`Y3Yp<6IUzpO0G{u8b2CnIGWvRXHB6=v@VooBHNTjxx)>xRsuAq=g?>7g& znnk5JQ8T-53dOURT%)sXl&t9NEqnZ_Up}6^i8oH(_W}uYSppmC4*)c5xF$M1b+H`Z zi^eQz*tF{>ebP@aYU?t793Cjv7iG#(1}Im=wbOpMc{aRymPdb(g}!Mksz}a^gB+HH z0whRv$DjMZ{3yIi8Ia=#yV8``a6vaVeyZ3ho%z(@AY!jf9gwM4IoKN4toQask;$n? zZoxN2SqG(m2d962+X?RrLfW%^M)Fbhgb&jmpXQ&D`{zWN;C~$6HGEu%)<0*rV}O|l zVeQt-MSN8H*n;`rY5(8vWfDTsF2bxDGG={-LrbS@{mR5{f?ML0VXELx>c{cnetZW$ z(>O%?LvY`zV2jgg(StxF=zYdK_^tH|r{Qn_+O@%Ye{{m$n*gUhzx%tqlio;d$Xu2` z;Osv{6X44%*J14MC3#~9w7i7POX^2#wDhBTFCeS?0Zq;`A#FV~_nw#fN6#KNV-^v2TM@o!33$}H zu^JT*s{UosFF$4=u|g0Yky}&Wzxa1b&*TS7WCiQe#{iR{`!?3~1pSE_qN`jEZZW(g zcxGg06?kW89DoH^d(oR=)m^`RR3K4??_CGeUJ<|ZHvuoCfMdQwWD!yt^(rcZuV;gk z{QWkn1(xr7KXp{7s?*eP9?mYSp|XM-IG?}KGZI}7n;14WNqmb+5Degoiczf!aC)ul zD?rR-cV}=mb=`uWVN~m!+I!jZ4*Yp686Z_I4ekNW(emh;nW=~~=Ej>~T%VIfH!K7Y zk6{|%f0G6jCXIYicd_oRPW#lC)Atf>#{=a^3?kG+L6L&uBfsmm zQHpAVH0rTE(l;*xvD)fK6E?KsSTlqe=%R>?J$#c938N~gTbuv@uAzi?e=vJ@20ZfF0{Q@(}TM+%SWo9cyseawlWJ*XTB6!Fi!=3=YP--h(<-?FH^q@FTS z{SL?O2+HJ3);0cBs;W+j5A?0vGF0Vb=b02?G9GinJFZ&V?v8KDd7ecrJAzI#ZLf(H zz6XWS!C&IO!lZd2;tsssz<&mH1P>E=TnLEKh!rp>4TDB+`i>6Ac3w&uvS%zME7VIq zX0Bwq2)s1SfO3SnC*N61?sE4w(zKB=OdXHGS3rk>+300r#EO}&j*n9`Y$kn(NbxYO3psITp3X1hdFsM=}y`E%9h|ipj6jH*6Fq* zzji&@ifJm|fv?n?^}@jNKpWi|=t9;0?c{bot(YMw^@a$sxNo^kT6bk`L*tE{GG2-( zlor`hh|atVGX9)Eiz4y|7CrmT{k^PVDX@EhV_Ih;L$LT%X@pvK?;xM~^%sHg&G(<| zLBu#NW+LBw*pATDO+UT{8UHO-ZCr2W;{N7T2#ct2_qa?uDsU_b`BALO6JQbXyXcNe z94C0kujvsHHUEw`xRa$6$?sb5+i?h0Y|>gVL^J^amG9r8fkSZyYXB-;B9x8`-+AP` zF)iEl07SH3vs%eG>n+8V>b?{}C;dDqtN7H7t?H9Y_f0j}!hQ8!nDPSAnBL4|uZuay zk!$f1);3xEc3<9;G3>m%fJ@9unFZ|#w{4BT!LciGL&;Lcc zVdoKk97^5t-`Kxv6Z3Ia8My6PxV-iVaH0dT+AdPi*x5(a1Yf!us{QTEfe=uc?tGBn zIe1PCjYja6-%qFo7ntx6`$Tw)+%=A(G>@4mhFhAk-32+58LyTuIHK9X-(QLw#w}>@ z0$-k?PSx#|x3e$gu~JvAlNBeR!Y)Xam;m~5%U|KdFzg2xXu$E!u_qv_zPIO&v0MA1UlRP6C2-CqZ(v9CyAfiJ{nKy~p*ewIyF1dS=LBx_ zG6sZ&FC*Hj<_2|TllWcDq<<}+KgNLr;hp^y4SgyvHXi5LwA*y0+iY?tECm>4*iiv@ ztnBjLx$7p~ax_z1MQ0anI6|Qro`1kO9?3sd`iFMhMdyW>(c|$90E80o#0ZY7%4B0E zU`@kF%*amy0MDLf!gnz$oVD&$kPc`fpjP0)7+HyyGLQZe*CRZ)ipUcD{#|sitU~%0 zGW&cyCi&OEbG@I(tuRS1>9Ck&fry2i9g*X^y&kbH#n?(ok5AEgchw^WQPGqewL+_p zSJ$484R=@;=*xz#Eu8_yRQt~RMBIZs}P5GGhQcDt(Q)Zf8G4=_nWvEuBM%& zB9timilr327d?Sby9RHzqe6j50|;_E56~D)pE_s0p5y-r8Y`r%U`gK~xZgK%JQ9iX zeWYNmvV0)rw(Y+xYv*)R>M$3P)f}dA4w_+)Vd#T47q=yCkFCp1zJiYT*LJpeShZZy zJij)UigmGbH3*;78Dk{**J@*}=2|vRPgxbhwFe80(b7g08c4gC8OZfhOLyCZ=)-^ZFto}-W< z+Yl#NHuf;5&V5+tBqMQZ#z{j|3_qnME}k8A4ydk4njPr7bHxJBvqFD8FSye-(Th3s zZI}JiQu$8f@)=Vc;ibB1`@L`nq5;z>Xo&dxmA>~ToS$jSU$QcTX22hnpp+M;Ic8bq>pOVbUl0*8%ysk7Mi{+!Ul#Z;(|gtRTvop_ znk27?S1()ag;O>7>mw+_)Bype4G->{YK#k0oHYY}j_{2##nDLS2T|_5Q9^>#DOP!n UpiIvC1BmT~qPjwvoN4g?1Hx#6*Z=?k delta 14788 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 pet [owner] appears to have finished internalising your last command.") else to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") + if(get_dist(master, owner) > 10) + if(prob(10)) + to_chat(owner, "You NEED to return to [(owner.lewd?"your [enthrallGender]":"[master]")].") + M.throw_at(get_step_towards(master,owner), 3, 1) return//If you break the mind of someone, you can't use status effects on them. @@ -355,7 +359,7 @@ if(phase <= 2) enthrallTally += distancelist[get_dist(master, owner)+1] if(withdrawalTick > 0) - withdrawalTick -= 2 + withdrawalTick -= 1 //calming effects M.hallucination = max(0, M.hallucination - 1) M.stuttering = max(0, M.stuttering - 1) @@ -375,7 +379,7 @@ if (withdrawal == TRUE)//Your minions are really REALLY needy. switch(withdrawalTick)//denial if(5)//To reduce spam - to_chat(owner, "You are unable to complete your [master]'s orders without their presence, and any commands and objectives given to you prior are not in effect until you are back with them.") + to_chat(owner, "You are unable to complete [(owner.lewd?"your [enthrallGender]":"[master]")]'s orders without their presence, and any commands and objectives given to you prior are not in effect until you are back with them.") if(10 to 35)//Gives wiggle room, so you're not SUPER needy if(prob(5)) to_chat(owner, "You're starting to miss [(owner.lewd?"your [enthrallGender]":"[master]")].") @@ -396,10 +400,11 @@ if(66) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") var/message = "[(owner.lewd?"I feel so lost in this complicated world without [enthrallGender]..":"I have to return to [master]!")]" + to_chat(owner, "You start to feel really angry about how you're not with [(owner.lewd?"your [enthrallGender]":"[master]")]!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2, message) - owner.stuttering += 200 - owner.jitteriness += 200 - if(67 to 90) //anger + owner.stuttering += 50 + owner.jitteriness += 500 + if(67 to 89) //anger if(prob(10)) addtimer(CALLBACK(M, /mob/verb/a_intent_change, INTENT_HARM), 2) addtimer(CALLBACK(M, /mob/proc/click_random_mob), 2) @@ -416,29 +421,29 @@ to_chat(owner, "You need to find your [enthrallGender] at all costs, you can't hold yourself back anymore!") else to_chat(owner, "You need to find [master] at all costs, you can't hold yourself back anymore!") - if(91 to 120)//depression + if(91 to 100)//depression if(prob(20)) owner.adjustBrainLoss(2.5) - owner.stuttering += 20 - owner.jitteriness += 20 - if(prob(25)) - M.hallucination += 20 - if(121) + owner.stuttering += 435 + owner.jitteriness += 35 + else if(prob(25)) + M.hallucination += 10 + if(101) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") var/message = "[(owner.lewd?"I'm all alone, It's so hard to continute without [enthrallGender]...":"I really need to find [master]!!!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4, message) - to_chat(owner, "You can hardly find the strength to continue without your [enthrallGender].") - if(120 to 140) //depression 2, revengeance - if(prob(15)) + to_chat(owner, "You can hardly find the strength to continue without [(owner.lewd?"your [enthrallGender]":"[master]")].") + if(102 to 140) //depression 2, revengeance + if(prob(20)) owner.Stun(50) owner.emote("cry")//does this exist? if(owner.lewd) to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.") else to_chat(owner, "You are overwheled with withdrawl from [master].") - owner.adjustBrainLoss(5) - owner.stuttering += 20 - owner.jitteriness += 20 + owner.adjustBrainLoss(4) + owner.stuttering += 35 + owner.jitteriness += 35 if(prob(5)) deltaResist += 5 if(140 to INFINITY) //acceptance @@ -449,11 +454,11 @@ to_chat(owner, "Maybe you'll be okay without your [enthrallGender].") else to_chat(owner, "You feel your mental functions slowly begin to return.") - if(prob(10)) - owner.adjustBrainLoss(2) - M.hallucination += 50 + if(prob(5)) + owner.adjustBrainLoss(2.5) + M.hallucination += 10 - withdrawalTick += 0.5//Usually enough to leave you with a major brain trauma, but not kill you. + withdrawalTick += 0.5//Enough to leave you with a major brain trauma, but not kill you. //Status subproc - statuses given to you from your Master //currently 3 statuses; antiresist -if you press resist, increases your enthrallment instead, HEAL - which slowly heals the pet, CHARGE - which breifly increases speed, PACIFY - makes pet a pacifist, ANTIRESIST - frustrates resist presses. @@ -501,7 +506,7 @@ //adrenals? //customEcho - if(customEcho && withdrawl == FALSE) + if(customEcho && withdrawal == FALSE) if(prob(5)) if(!customSpan) //just in case! customSpan = "notice" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 0eb61ce136..d8f01e445d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -229,23 +229,24 @@ Creating a chem with a low purity will make you permanently fall in love with so FallInLove(pick(GLOB.player_list), M) if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it supresses the vocal effects, for stealth. var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) - Vc.spans = null + Vc.spans = list("say") return if(!M.client) metabolization_rate = 0 //Stops powergamers from quitting to avoid affects. but prevents affects on players that don't exist for performance. return if(metabolization_rate == 0) - metabolization_rate = 0.5 + metabolization_rate = 0.1 var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)//If purity is over 5, works as intended if(!E) return else E.enthrallTally += 1 - M.adjustBrainLoss(0.05)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it. + M.adjustBrainLoss(0.1)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it. ..() /datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I made it so the creator is set to gain the status for someone random. . = ..() + metabolization_rate = 1//Mostly to manage brain damage and reduce server stress if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 100u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.) to_chat(M, "You are unable to resist your own charms anymore, and become a full blown narcissist.") /*Old way of handling, left in as an option B @@ -283,11 +284,12 @@ Creating a chem with a low purity will make you permanently fall in love with so E.customTriggers = list() /datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M) - M.adjustBrainLoss(0.025)//should be ~40 in total + M.adjustBrainLoss(0.2)//should be ~40 in total ..() /datum/reagent/fermi/enthrall/on_mob_delete(mob/living/carbon/M) - if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it supresses the vocal effects, for stealth. + message_admins("Del enthrall") + if (M.getorganslot(ORGAN_SLOT_VOICE))//Returns spans var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) Vc.spans = list("velvet") ..() @@ -296,7 +298,7 @@ Creating a chem with a low purity will make you permanently fall in love with so /datum/reagent/fermi/enthrallExplo//Created in a gas cloud when it explodes name = "MKUltra" id = "enthrallExplo" - description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." + description = "A forbidden deep red mixture that overwhelms a foreign body with waves of desire, inducing a chemial love for another. Also, how the HECC did you get this?" color = "#2C051A" // rgb: , 0, 255 metabolization_rate = 0.1 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses." From 537161dd015ad66e6e7daabcffd7be9f70897b67 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 23 Jun 2019 03:22:54 +0100 Subject: [PATCH 298/608] Lil flavour tweaks. --- .../browserassets/css/browserOutput.css | 8 +++--- code/modules/surgery/organs/vocal_cords.dm | 2 +- goon/browserassets/css/browserOutput.css | 10 +++---- interface/stylesheet.dm | 8 +++--- .../code/datums/status_effects/chems.dm | 18 ++++++------ .../reagents/chemistry/reagents/MKUltra.dm | 28 +++++++++---------- 6 files changed, 38 insertions(+), 36 deletions(-) diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index ee199a7b0d..30532e5ed3 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -395,12 +395,12 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 24px;} .clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} -.velvet {color: #660015; font-weight: bold; animation: velvet 3000ms infinite;} +.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} @keyframes velvet { 0% { color: #400020; } - 25% { color: #FF0000; } - 50% { color: #FFAAAA; } - 75% { color: #FF0000; } + 40% { color: #FF0000; } + 50% { color: #FF8888; } + 60% { color: #FF0000; } 100% { color: #400020; } } diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 2cb70928b7..bf684cdd6e 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1234,7 +1234,7 @@ H.SetStun(1000) if (E.mental_capacity >= 5) var/trigger = html_decode(stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN)) - var/custom_words_words_list = list("Speak", "Echo", "Shock", "Cum", "Kneel", "Strip", "Trance") + var/custom_words_words_list = list("Speak", "Echo", "Shock", "Cum", "Kneel", "Strip", "Trance", "Cancel") var/trigger2 = input(user, "Pick an effect", "Effects") in custom_words_words_list //var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) trigger2 = lowertext(trigger2) diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index 102c8ac40c..58129ac1cb 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -392,12 +392,13 @@ h1.alert, h2.alert {color: #000000;} .greentext {color: #00FF00; font-size: 24px;} .redtext {color: #FF0000; font-size: 24px;} .clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} -.velvet {color: #660015; font-weight: bold; animation: velvet 3000ms infinite;} +.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} @keyframes velvet { 0% { color: #400020; } - 25% { color: #FF0000; } - 50% { color: #FFAAAA; } - 75% { color: #FF0000; } + 40% { color: #FF0000; } + 50% { color: #FF8888; } + 60% { color: #FF0000; } 100% { color: #400020; } } @@ -416,7 +417,6 @@ h1.alert, h2.alert {color: #000000;} 50% { color: #dd0000; } 100% { color: #f75a5a; } } -.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} .icon {height: 1em; width: auto;} diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 59ed84c177..2ecd9f9004 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -153,12 +153,12 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 3;} .clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} -.velvet {color: #660015; font-weight: bold; animation: velvet 3000ms infinite;} +.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} @keyframes velvet { 0% { color: #400020; } - 25% { color: #FF0000; } - 50% { color: #FFAAAA; } - 75% { color: #FF0000; } + 40% { color: #FF0000; } + 50% { color: #FF8888; } + 60% { color: #FF0000; } 100% { color: #400020; } } diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 06616e1990..c1e9c1af03 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -361,9 +361,9 @@ if(withdrawalTick > 0) withdrawalTick -= 1 //calming effects - M.hallucination = max(0, M.hallucination - 1) - M.stuttering = max(0, M.stuttering - 1) - M.jitteriness = max(0, M.jitteriness - 1) + M.hallucination = max(0, M.hallucination - 5) + M.stuttering = max(0, M.stuttering - 5) + M.jitteriness = max(0, M.jitteriness - 5) if(owner.getBrainLoss() >=60) owner.adjustBrainLoss(-0.1) if(withdrawal == TRUE) @@ -564,19 +564,21 @@ cTriggered = TRUE log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been triggered with [cached_trigger] from [speaker] saying: \"[message]\". (their master being [master] ckey: [enthrallID].)") - //Speak (Forces player to talk) works + //Speak (Forces player to talk) if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2 var/saytext = "Your mouth moves on it's own before you can even catch it." if(HAS_TRAIT(C, TRAIT_NYMPHO)) saytext += " You find yourself fully believing in the validity of what you just said and don't think to question it." - to_chat(C, "[saytext]") - (C.say(customTriggers[trigger][2]))//trigger3 + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "[saytext]"), 5) + addtimer(CALLBACK(C, /atom/movable/proc/say, "[customTriggers[trigger][2]]"), 5) + //(C.say(customTriggers[trigger][2]))//trigger3 log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been forced to say: \"[customTriggers[trigger][2]]\" from previous trigger.") - //Echo (repeats message!) + //Echo (repeats message!) allows customisation, but won't display var calls! Defaults to hypnophrase. else if (lowertext(customTriggers[trigger][1]) == "echo")//trigger2 - (to_chat(owner, "[customTriggers[trigger][2]]"))//trigger3 + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "[customTriggers[trigger][2]]"), 5) + //(to_chat(owner, "[customTriggers[trigger][2]]"))//trigger3 //Shocking truth! else if (lowertext(customTriggers[trigger]) == "shock") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index d8f01e445d..40497f4957 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -205,18 +205,28 @@ Creating a chem with a low purity will make you permanently fall in love with so /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) . = ..() if(purity < 0.5)//DO NOT SPLIT INTO DIFFERENT CHEM: This relies on DoNotSplit - has to be done this way. + if(volume < 0.5)//You don't get to escape that easily + FallInLove(pick(GLOB.player_list), M) + M.reagents.remove_reagent(id, volume) + if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. if(M.has_status_effect(STATUS_EFFECT_INLOVE))//Can't be enthralled when enthralled, so to speak. return var/list/seen = viewers(7, get_turf(M)) for(var/victim in seen) - if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (!M.client) || (M.stat == DEAD)) + if(ishuman(victim)) + var/mob/living/carbon/V = victim + if((V == M) || (!V.client) || (V.stat == DEAD)) + seen = seen - victim + else seen = seen - victim - if(!seen) + + if(LAZYLEN(seen)) return M.reagents.remove_reagent(id, volume) FallInLove(M, pick(seen)) return + else // If someone else drinks it, the creator falls in love with them! var/mob/living/carbon/C = get_mob_by_key(creatorID) if(M.has_status_effect(STATUS_EFFECT_INLOVE)) @@ -225,11 +235,8 @@ Creating a chem with a low purity will make you permanently fall in love with so M.reagents.remove_reagent(id, volume) FallInLove(C, M) return - if(volume < 1)//You don't get to escape that easily - FallInLove(pick(GLOB.player_list), M) - if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it supresses the vocal effects, for stealth. - var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) - Vc.spans = list("say") + + if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it supresses the vocal effects, for stealth. NEVERMIND ADD THIS LATER I CAN'T GET IT TO WORK return if(!M.client) metabolization_rate = 0 //Stops powergamers from quitting to avoid affects. but prevents affects on players that don't exist for performance. @@ -287,13 +294,6 @@ Creating a chem with a low purity will make you permanently fall in love with so M.adjustBrainLoss(0.2)//should be ~40 in total ..() -/datum/reagent/fermi/enthrall/on_mob_delete(mob/living/carbon/M) - message_admins("Del enthrall") - if (M.getorganslot(ORGAN_SLOT_VOICE))//Returns spans - var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) - Vc.spans = list("velvet") - ..() - //Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system. /datum/reagent/fermi/enthrallExplo//Created in a gas cloud when it explodes name = "MKUltra" From f7696041ca1c7540cc342099b05108e6ab9ef243 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 23 Jun 2019 03:43:36 +0100 Subject: [PATCH 299/608] Fumblefingered some numbers. --- modular_citadel/code/datums/status_effects/chems.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index c1e9c1af03..bd1710dd79 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -403,7 +403,7 @@ to_chat(owner, "You start to feel really angry about how you're not with [(owner.lewd?"your [enthrallGender]":"[master]")]!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2, message) owner.stuttering += 50 - owner.jitteriness += 500 + owner.jitteriness += 250 if(67 to 89) //anger if(prob(10)) addtimer(CALLBACK(M, /mob/verb/a_intent_change, INTENT_HARM), 2) @@ -424,7 +424,7 @@ if(91 to 100)//depression if(prob(20)) owner.adjustBrainLoss(2.5) - owner.stuttering += 435 + owner.stuttering += 35 owner.jitteriness += 35 else if(prob(25)) M.hallucination += 10 @@ -515,6 +515,8 @@ //final tidying resistanceTally += deltaResist deltaResist = 0 + if(cTriggered >= 0) + cTriggered -= 1 if (cooldown > 0) cooldown -= (0.8 + (mental_capacity/500)) cooldownMsg = FALSE @@ -554,14 +556,14 @@ /datum/status_effect/chem/enthrall/proc/owner_hear(var/hearer, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - if (cTriggered == TRUE) + if (cTriggered > 0) return var/mob/living/carbon/C = owner raw_message = lowertext(raw_message) for (var/trigger in customTriggers) var/cached_trigger = lowertext(trigger) if (findtext(raw_message, cached_trigger))//if trigger1 is the message - cTriggered = TRUE + cTriggered = 5 //Stops triggerparties and as a result, stops servercrashes. log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been triggered with [cached_trigger] from [speaker] saying: \"[message]\". (their master being [master] ckey: [enthrallID].)") //Speak (Forces player to talk) @@ -621,8 +623,6 @@ tranceTime = 50 log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been tranced from previous trigger.") - - cTriggered = FALSE return /datum/status_effect/chem/enthrall/proc/owner_resist() From 7c19f5e0fab1b2fadebe9a8963da98fb8364292a Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 23 Jun 2019 13:06:45 +0100 Subject: [PATCH 300/608] Forgot to comment out hypnoquirk. --- code/modules/surgery/organs/vocal_cords.dm | 16 ++++++++-------- .../code/datums/status_effects/chems.dm | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index bf684cdd6e..93558e2664 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -919,7 +919,7 @@ GET_COMPONENT_FROM(mood, /datum/component/mood, H) switch(mood.sanity) if(SANITY_GREAT to INFINITY) - speaktrigger += "I'm beyond elated!! " + speaktrigger += "I'm beyond elated!! " //did you mean byond elated? hohoho if(SANITY_NEUTRAL to SANITY_GREAT) speaktrigger += "I'm really happy! " if(SANITY_DISTURBED to SANITY_NEUTRAL) @@ -933,15 +933,15 @@ //Withdrawal switch(E.withdrawalTick) - if(10 to 36) + if(10 to 36) //denial speaktrigger += "I missed you, " - if(36 to 66) + if(36 to 66) //barganing speaktrigger += "I missed you, but I knew you'd come back for me! " - if(66 to 90) + if(66 to 90) //anger speaktrigger += "I couldn't take being away from you like that, " - if(90 to 140) + if(90 to 140) //depression speaktrigger += "I was so scared you'd never come back, " - if(140 to INFINITY) + if(140 to INFINITY) //acceptance speaktrigger += "I'm hurt that you left me like that... I felt so alone... " //hunger @@ -997,7 +997,7 @@ if(80 to 120) speaktrigger += "My head feels like it's about to explode, " if(120 to 160) - speaktrigger += "You are the only thing keeping my brain sane, " + speaktrigger += "You are the only thing keeping my mind sane, " if(160 to INFINITY) speaktrigger += "I feel like I'm on the brink of losing my mind, " @@ -1013,7 +1013,7 @@ //collar if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar)) - speaktrigger += "and thank you for the collar, " + speaktrigger += "I love the collar you gave me, " //End if(H.lewd) speaktrigger += "[E.enthrallGender]!" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index bd1710dd79..6bdc05ca98 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -364,7 +364,7 @@ M.hallucination = max(0, M.hallucination - 5) M.stuttering = max(0, M.stuttering - 5) M.jitteriness = max(0, M.jitteriness - 5) - if(owner.getBrainLoss() >=60) + if(owner.getBrainLoss() >=50) owner.adjustBrainLoss(-0.1) if(withdrawal == TRUE) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") @@ -396,7 +396,7 @@ if(prob(10)) if(owner.lewd) to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.") - owner.adjustBrainLoss(-1) + owner.adjustBrainLoss(-1.5) if(66) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") var/message = "[(owner.lewd?"I feel so lost in this complicated world without [enthrallGender]..":"I have to return to [master]!")]" From 8992dbfa4dd60ee02d9fa0892a9afa4dd4ff9b22 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 23 Jun 2019 18:59:15 +0100 Subject: [PATCH 301/608] Commented out hypnoquirk and edited it so that it functions differently --- code/datums/brain_damage/hypnosis.dm | 9 ++--- code/datums/status_effects/debuffs.dm | 47 +++++++++++++++++----- code/datums/traits/negative.dm | 11 +---- code/modules/surgery/organs/vocal_cords.dm | 3 +- 4 files changed, 45 insertions(+), 25 deletions(-) diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm index aa8d385092..1b592ec3a8 100644 --- a/code/datums/brain_damage/hypnosis.dm +++ b/code/datums/brain_damage/hypnosis.dm @@ -5,14 +5,13 @@ gain_text = "" lose_text = "" resilience = TRAUMA_RESILIENCE_SURGERY - var/priority = TRUE var/hypnotic_phrase = "" var/regex/target_phrase -/datum/brain_trauma/hypnosis/New(phrase, priority) +/datum/brain_trauma/hypnosis/New(phrase, quirk = FALSE) if(!phrase) qdel(src) - if(priority == TRUE) + if(quirk == TRUE) hypnotic_phrase = phrase else friendliify(phrase) @@ -42,11 +41,11 @@ "You feel a part of your mind repeating this over and over. You need to follow these words.",\ "Something about this sounds... right, for some reason. You feel like you should follow these words.",\ "These words keep echoing in your mind. You find yourself completely fascinated by them.")]") - if(priority == TRUE) + if(!HAS_TRAIT(owner, "hypnotherapy")) to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\ as long as you act like the words are your highest priority.") else - to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\ + to_chat(owner, "You've been hypnotized by this sentence. You feel an incredible desire to follow these words, but are able to resist it somewhat. If it isn't a clear order, you can freely interpret how to do so,\ however this does not take precedence over your other objectives.") ..() diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 0ec09f4965..e3df8db9d1 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -534,8 +534,8 @@ datum/status_effect/pacify tick_interval = 10 examine_text = "SUBJECTPRONOUN seems slow and unfocused." var/stun = TRUE - var/priority = TRUE - alert_type = /obj/screen/alert/status_effect/trance + var/triggered = FALSE + alert_type = null /obj/screen/alert/status_effect/trance name = "Trance" @@ -543,6 +543,22 @@ datum/status_effect/pacify icon_state = "high" /datum/status_effect/trance/tick() + if(HAS_TRAIT(owner, "hypnotherapy")) + message_admins("has trait") + if(triggered == TRUE) + message_admins("triggered") + UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) + RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize) + ADD_TRAIT(owner, TRAIT_MUTE, "trance") + if(!owner.has_quirk(/datum/quirk/monochromatic)) + owner.add_client_colour(/datum/client_colour/monochrome) + to_chat(owner, "[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")]") + triggered = FALSE + duration = 300 + else + message_admins("not triggered") + return + message_admins("stunning") if(stun) owner.Stun(60, TRUE, TRUE) owner.dizziness = 20 @@ -550,19 +566,26 @@ datum/status_effect/pacify /datum/status_effect/trance/on_apply() if(!iscarbon(owner)) return FALSE + if(HAS_TRAIT(owner, "hypnotherapy")) + message_admins("stunning") + RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/listen) + return TRUE + alert_type = /obj/screen/alert/status_effect/trance RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize) ADD_TRAIT(owner, TRAIT_MUTE, "trance") if(!owner.has_quirk(/datum/quirk/monochromatic)) owner.add_client_colour(/datum/client_colour/monochrome) - if(priority == TRUE) - owner.visible_message("[stun ? "[owner] stands still as [owner.p_their()] eyes seem to focus on a distant point." : ""]", \ + owner.visible_message("[stun ? "[owner] stands still as [owner.p_their()] eyes seem to focus on a distant point." : ""]", \ "[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")]") return TRUE -/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE, _priority = priority)//priority == FALSE makes no visible message, prevents self antag messages, and places phrase below objectives. +/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE, source_quirk = FALSE)//hypnoquirk makes no visible message, prevents self antag messages, and places phrase below objectives. duration = _duration stun = _stun - priority = _priority + var/mob/living/carbon/C = new_owner + if(source_quirk == FALSE && HAS_TRAIT(C, "hypnotherapy")) + message_admins("removing quirk") + REMOVE_TRAIT(owner, "hypnotherapy", ROUNDSTART_TRAIT) return ..() /datum/status_effect/trance/on_remove() @@ -573,16 +596,22 @@ datum/status_effect/pacify owner.remove_client_colour(/datum/client_colour/monochrome) to_chat(owner, "You snap out of your trance!") +/datum/status_effect/trance/proc/listen(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + message_admins("Trigger start") + to_chat(owner, "[speaker] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") + triggered = TRUE + /datum/status_effect/trance/proc/hypnotize(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + message_admins("Hypnotize") if(!owner.can_hear()) return if(speaker == owner) return var/mob/living/carbon/C = owner C.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) //clear previous hypnosis - if(priority == TRUE) - addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10) + if(HAS_TRAIT(C, "hypnotherapy")) + addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message, TRUE), 10) else - addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message, FALSE), 10) + addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10) addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it qdel(src) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index efa9e9a4cb..6b5f2abfbb 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -380,12 +380,5 @@ //DOES NOT give any indication when someone is triggered - this is intentional so people don't abuse it, you're supposed to get a random thing said to you as a mini objective. /datum/quirk/hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. - var/mob/living/carbon/human/H = quirk_holder - var/list/seen = viewers(8, get_turf(H)) - seen -= quirk_holder - if(LAZYLEN(seen) == 0) - to_chat(H, "That object accidentally sets off your implanted trigger, sending you into a hypnotic daze!") - else - to_chat(H, "[pick(seen)] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") - H.apply_status_effect(/datum/status_effect/trance, 200, TRUE, FALSE) - qdel(src) + var/mob/living/carbon/human/H = quirk_holder + H.apply_status_effect(/datum/status_effect/trance, 1000, TRUE, TRUE) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 93558e2664..d9ed8fae11 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1236,11 +1236,10 @@ var/trigger = html_decode(stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN)) var/custom_words_words_list = list("Speak", "Echo", "Shock", "Cum", "Kneel", "Strip", "Trance", "Cancel") var/trigger2 = input(user, "Pick an effect", "Effects") in custom_words_words_list - //var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) trigger2 = lowertext(trigger2) if ((findtext(trigger2, custom_words_words))) if (trigger2 == "speak" || trigger2 == "echo") - var/trigger3 = html_decode(stripped_input(user, "Enter the phrase spoken.", MAX_MESSAGE_LEN)) + var/trigger3 = html_decode(stripped_input(user, "Enter the phrase spoken. Abusing this to self antag is bannable.", MAX_MESSAGE_LEN)) E.customTriggers[trigger] = list(trigger2, trigger3) message_admins("[H] has been implanted by [user] with [trigger], triggering [trigger2], to send [trigger3].") else From b3094901900211896faca13bd6374bcbb43220de Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 23 Jun 2019 19:02:53 +0100 Subject: [PATCH 302/608] Forgot to ctrl+s --- code/datums/status_effects/debuffs.dm | 14 ++------------ code/datums/traits/negative.dm | 5 +++-- .../code/datums/status_effects/chems.dm | 1 - 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index e3df8db9d1..70d3f38c9f 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -544,9 +544,7 @@ datum/status_effect/pacify /datum/status_effect/trance/tick() if(HAS_TRAIT(owner, "hypnotherapy")) - message_admins("has trait") if(triggered == TRUE) - message_admins("triggered") UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize) ADD_TRAIT(owner, TRAIT_MUTE, "trance") @@ -554,11 +552,8 @@ datum/status_effect/pacify owner.add_client_colour(/datum/client_colour/monochrome) to_chat(owner, "[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")]") triggered = FALSE - duration = 300 else - message_admins("not triggered") return - message_admins("stunning") if(stun) owner.Stun(60, TRUE, TRUE) owner.dizziness = 20 @@ -567,7 +562,6 @@ datum/status_effect/pacify if(!iscarbon(owner)) return FALSE if(HAS_TRAIT(owner, "hypnotherapy")) - message_admins("stunning") RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/listen) return TRUE alert_type = /obj/screen/alert/status_effect/trance @@ -582,9 +576,7 @@ datum/status_effect/pacify /datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE, source_quirk = FALSE)//hypnoquirk makes no visible message, prevents self antag messages, and places phrase below objectives. duration = _duration stun = _stun - var/mob/living/carbon/C = new_owner - if(source_quirk == FALSE && HAS_TRAIT(C, "hypnotherapy")) - message_admins("removing quirk") + if(source_quirk == FALSE && HAS_TRAIT(owner, "hypnotherapy")) REMOVE_TRAIT(owner, "hypnotherapy", ROUNDSTART_TRAIT) return ..() @@ -597,19 +589,17 @@ datum/status_effect/pacify to_chat(owner, "You snap out of your trance!") /datum/status_effect/trance/proc/listen(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - message_admins("Trigger start") to_chat(owner, "[speaker] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") triggered = TRUE /datum/status_effect/trance/proc/hypnotize(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - message_admins("Hypnotize") if(!owner.can_hear()) return if(speaker == owner) return var/mob/living/carbon/C = owner C.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) //clear previous hypnosis - if(HAS_TRAIT(C, "hypnotherapy")) + if(source_quirk == TRUE) addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message, TRUE), 10) else addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 6b5f2abfbb..9f393a6432 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -364,8 +364,8 @@ lose_text = "Your mind finally feels calm." medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events." -//For reviewers: If you think it's a bad idea, feel free to remove it. Removal requested, commented out until the end of review (will remove when fixing merge conflicts). - +//For reviewers: Removal requested, commented out until the end of review (will remove when fixing merge conflicts). I'll probably rewrited +/*Fixed quirk so that it's less impactful at the moment and doesn't override player autonomy (For the people in the discord who really want it.) See if that helps /datum/quirk/hypno name = "Hypnotherapy user" desc = "You had hypnotherapy right before your shift, you're not sure it had any effects, though." @@ -382,3 +382,4 @@ /datum/quirk/hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. var/mob/living/carbon/human/H = quirk_holder H.apply_status_effect(/datum/status_effect/trance, 1000, TRUE, TRUE) +*/ diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 6bdc05ca98..7cdc809f46 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -534,7 +534,6 @@ M.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) M.remove_status_effect(/datum/status_effect/trance) tranceTime = 51 - message_admins("test") //..() //Remove all stuff From fdba8c000fbfacecf8bdcd06ad8ebfe609321b58 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 23 Jun 2019 20:03:37 +0100 Subject: [PATCH 303/608] Fixing compiling errors. --- code/datums/status_effects/debuffs.dm | 2 +- code/modules/research/techweb/all_nodes.dm | 2 +- .../code/modules/reagents/chemistry/recipes/fermi.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 70d3f38c9f..e930c77c36 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -599,7 +599,7 @@ datum/status_effect/pacify return var/mob/living/carbon/C = owner C.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) //clear previous hypnosis - if(source_quirk == TRUE) + if(HAS_TRAIT(C, "hypnotherapy")) addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message, TRUE), 10) else addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index cdda7c4c5c..2dea40d382 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -69,7 +69,7 @@ display_name = "Advanced Biotechnology" description = "Advanced Biotechnology" prereq_ids = list("biotech") - design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker", "healthanalyzer_advanced","harvester","holobarrier_med","smartdartgun","medicinalsmartdart", "pHmeter")) + design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker", "healthanalyzer_advanced","harvester","holobarrier_med","smartdartgun","medicinalsmartdart", "pHmeter") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 39c53f49ad..4040735356 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -17,8 +17,8 @@ if(!pH)//Dunno how things got here without a pH, but just in case pH = 7 var/ImpureTot = 0 - //var/pHmod = 1 var/turf/T = get_turf(my_atom) + if(temp>500)//if hot, start a fire switch(temp) if (500 to 750) From 26cd24a79d315efcad8eb195f0a32b4a1c4d107d Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 23 Jun 2019 20:33:07 +0100 Subject: [PATCH 304/608] Tweaked reagent colours. --- .../code/modules/reagents/chemistry/reagents/SDGF.dm | 4 ++-- .../code/modules/reagents/chemistry/reagents/enlargement.dm | 4 ++-- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index cdcc4c03b2..dc75bab9c3 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -41,7 +41,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING name = "synthetic-derived growth factor" id = "SDGF" description = "A rapidly diving mass of Embryonic stem cells. These cells are missing a nucleus and quickly replicate a host’s DNA before growing to form an almost perfect clone of the host. In some cases neural replication takes longer, though the underlying reason underneath has yet to be determined." - color = "#60A584" // rgb: 96, 0, 255 + color = "#a502e0" // rgb: 96, 0, 255 var/playerClone = FALSE var/unitCheck = FALSE metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -221,7 +221,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING name = "synthetic-derived growth factor" id = "SDZF" description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. This message should never appear, how did you manage to get a hold of this?" - color = "#60A584" // rgb: 96, 0, 255 + color = "#a502e0" // rgb: 96, 0, 255 metabolization_rate = 0.5 * REAGENTS_METABOLISM var/startHunger diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 37224c9b94..0cc1f2b23f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -223,7 +223,7 @@ M.reagents.remove_reagent(id, 5) P = nP - P.cached_length = P.cached_length + 0.05 + P.cached_length = P.cached_length + 0.1 if (P.cached_length >= 20.5 && P.cached_length < 21) if(H.w_uniform || H.wear_suit) var/target = M.get_bodypart(BODY_ZONE_CHEST) @@ -282,6 +282,6 @@ //otherwise proceed as normal return..() - P.cached_length = P.cached_length - 0.05 + P.cached_length = P.cached_length - 0.1 P.update() ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 2d496dbaa5..73337f2715 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -72,7 +72,7 @@ name = "Hat growth serium" id = "hatmium" description = "A strange substance that draws in a hat from the hat dimention." - color = "#A080H4" // rgb: , 0, 255 + color = "#7c311a" // rgb: , 0, 255 taste_description = "like jerky, whiskey and an off aftertaste of a crypt." overdose_threshold = 25 DoNotSplit = TRUE @@ -114,7 +114,7 @@ name = "Furranium" id = "furranium" description = "OwO whats this?" - color = "#H04044" // rgb: , 0, 255 + color = "#f9b9bc" // rgb: , 0, 255 taste_description = "dewicious degenyewacy" metabolization_rate = 0.5 * REAGENTS_METABOLISM InverseChemVal = 0 @@ -185,7 +185,7 @@ name = "Naninte bain" id = "nanite_b_gone" description = "A stablised EMP that is highly volatile, shocking small nano machines that will kill them off at a rapid rate in a patient's system." - color = "#5a7267" + color = "#708f8f" overdose_threshold = 15 ImpureChem = "nanite_b_goneTox" //If you make an inpure chem, it stalls growth InverseChemVal = 0.25 From 8605d3a246010f02f78b85c1497eb948fbc111b3 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 24 Jun 2019 15:06:18 +0100 Subject: [PATCH 305/608] Found a pH overflow. --- code/modules/reagents/chemistry/holder.dm | 1 + code/modules/surgery/organs/vocal_cords.dm | 2 +- .../code/modules/reagents/chemistry/reagents/SDGF.dm | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index f412967670..baa31d0f56 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -129,6 +129,7 @@ if(total_volume > 0) var/part = amount / total_volume for(var/reagent in cached_reagents) + pH = 7 var/datum/reagent/R = reagent remove_reagent(R.id, R.volume * part) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index d9ed8fae11..0d8ca1f37f 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -961,7 +961,7 @@ //health switch(H.health) - if(100) + if(100 to INFINITY) speaktrigger += "I feel fit, " if(80 to 99) speaktrigger += "I ache a little bit, " diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index dc75bab9c3..80fcc303bc 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -208,7 +208,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/SDGFtox name = "synthetic-derived growth factor" id = "SDGFtox" - description = "A chem that makes Fermis angry at you if you're reading this, how did you get this???" + description = "A chem that makes a certain chemcat angry at you if you're reading this, how did you get this???"//i.e. tell me please, figure it's a good way to get pinged for bugfixes. metabolization_rate = 1 /datum/reagent/fermi/SDGFtox/on_mob_life(mob/living/carbon/M)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good) From 4145b0f256e0ebee742e761ff670504d387a9d47 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 25 Jun 2019 07:22:20 +0100 Subject: [PATCH 306/608] Hotfix for egregious oversights. --- code/datums/brain_damage/hypnosis.dm | 3 +++ code/modules/surgery/organs/vocal_cords.dm | 22 +++++++++---------- .../reagents/chemistry/reagents/MKUltra.dm | 4 +++- .../reagents/chemistry/reagents/SDGF.dm | 1 + .../chemistry/reagents/enlargement.dm | 4 ++-- .../chemistry/reagents/fermi_reagents.dm | 15 ++++++++++--- .../reagents/chemistry/recipes/fermi.dm | 8 ++++++- 7 files changed, 39 insertions(+), 18 deletions(-) diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm index 1b592ec3a8..8909d1b85f 100644 --- a/code/datums/brain_damage/hypnosis.dm +++ b/code/datums/brain_damage/hypnosis.dm @@ -15,6 +15,9 @@ hypnotic_phrase = phrase else friendliify(phrase) + if(IsAdminAdvancedProcCall()) + to_chat(usr, "Hypnosis New() skipped due to try/catch incompatibility with admin proccalling.") + qdel(src) try target_phrase = new("(\\b[hypnotic_phrase]\\b)","ig") catch(var/exception/e) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 0d8ca1f37f..6c3c7e89c6 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1148,7 +1148,7 @@ var/mob/living/carbon/human/H = V var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) - if(2 to INFINITY)//Tier 2 only + if(2 to INFINITY) var/items = H.get_contents() for(var/obj/item/W in items) if(W == H.w_uniform || W == H.wear_suit) @@ -1156,24 +1156,24 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Before you can even think about it, you quickly remove your clothes in response to [(H.lewd?"your [E.enthrallGender]'s command'":"[E.master]'s directive'")]."), 5) E.cooldown += 10 - //WALK doesn't work? it does, randomly, work now + //WALK else if((findtext(message, walk_words))) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) - if(2 to INFINITY)//Tier 2 only + if(2 to INFINITY) if(L.m_intent != MOVE_INTENT_WALK) L.toggle_move_intent() E.cooldown += 1 - //RUN doesn't work? Nope, it randomly works now + //RUN else if((findtext(message, run_words))) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) - if(2 to INFINITY)//Tier 2 only + if(2 to INFINITY) if(L.m_intent != MOVE_INTENT_RUN) L.toggle_move_intent() E.cooldown += 1 @@ -1184,7 +1184,7 @@ var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) - if(2 to INFINITY)//Tier 2 only + if(2 to INFINITY) L.lay_down() E.cooldown += 10 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[(L.lewd?"You eagerly lie down!":"You suddenly lie down!'")]"), 5) @@ -1195,7 +1195,7 @@ var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) - if(2 to INFINITY)//Tier 2 only + if(2 to INFINITY) L.Knockdown(30 * power_multiplier * E.phase) E.cooldown += 8 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You suddenly drop to the ground!'"), 5) @@ -1342,7 +1342,7 @@ var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) - if(3 to INFINITY)//Tier 3 only + if(3 to INFINITY) L.Stun(40 * power_multiplier) E.cooldown += 8 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "Your muscles freeze up!"), 5) @@ -1353,7 +1353,7 @@ var/mob/living/carbon/C = V var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) - if(3 to INFINITY)//Tier 3 only + if(3 to INFINITY) new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) //HOT @@ -1362,7 +1362,7 @@ var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) - if(3 to INFINITY)//Tier 3 only + if(3 to INFINITY) L.adjust_bodytemperature(50 * power_multiplier)//This seems nuts, reduced it, but then it didn't do anything, so I reverted it. addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You feel your metabolism speed up!"), 5) @@ -1372,7 +1372,7 @@ var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) - if(3 to INFINITY)//Tier 3 only + if(3 to INFINITY) L.adjust_bodytemperature(-50 * power_multiplier) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You feel your metabolism slow down!"), 5) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 40497f4957..fd54775d76 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -145,6 +145,8 @@ Creating a chem with a low purity will make you permanently fall in love with so var/mob/living/creator pH = 10 OnMobMergeCheck = TRUE //Procs on_mob_add when merging into a human + can_synth = FALSE + /datum/reagent/fermi/enthrall/test name = "MKUltraTest" @@ -309,7 +311,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(!M.has_status_effect(STATUS_EFFECT_INLOVE)) var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers for(var/victim in seen) - if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (M.stat == DEAD)) + if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (M.stat == DEAD) || (isliving(victim))) seen = seen - victim if(seen.len == 0) return diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index 80fcc303bc..cb92285e12 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -195,6 +195,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING name = "synthetic-derived growth factor" id = "SDGFheal" metabolization_rate = 1 + can_synth = FALSE /datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 0cc1f2b23f..ce39d26a6b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -19,7 +19,7 @@ //OD is low for a reason. I'd like fermichems to have low ODs, and dangerous ODs, and since this is a meme chem that everyone will rush to make, it'll be a lesson learnt early. /datum/reagent/fermi/breast_enlarger - name = "Sucubus milk" + name = "Succubus milk" id = "breast_enlarger" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." color = "#E60584" // rgb: 96, 0, 255 @@ -133,7 +133,7 @@ ..() /datum/reagent/fermi/BEsmaller - name = "Sucubus milk" + name = "Succubus milk" id = "BEsmaller" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." color = "#E60584" // rgb: 96, 0, 255 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 73337f2715..743055b279 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -99,6 +99,8 @@ hatArmor = (purity/10) else hatArmor = - (purity/10) + if(hatArmor > 90) + return ..() var/obj/item/W = M.head W.armor = W.armor.modifyAllRatings(hatArmor) ..() @@ -139,7 +141,7 @@ if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers for(var/victim in seen) - if((victim == /mob/living/simple_animal/pet/) || (victim == M)) + if((istype(victim, /mob/living/simple_animal/pet/)) || (victim == M) || (!isliving(victim))) seen = seen - victim if(seen) to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") @@ -160,7 +162,7 @@ if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers for(var/victim in seen) - if((victim = /mob/living/simple_animal/pet/) || (victim == M)) + if((istype(victim, /mob/living/simple_animal/pet/)) || (victim == M) || (!isliving(victim))) seen = seen - victim if(seen) to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") @@ -246,10 +248,15 @@ taste_description = "acid burns, ow" color = "#FFFFFF" pH = 0 + can_synth = FALSE /datum/reagent/fermi/fermiAcid/reaction_mob(mob/living/carbon/C, method) var/target = C.get_bodypart(BODY_ZONE_CHEST) - var/acidstr = ((5-C.reagents.pH)*2) + var/acidstr + if(!C.reagents.pH || C.reagents.pH >5) + acidstr = 3 + else + acidstr = ((5-C.reagents.pH)*2) //runtime - null.pH ? C.adjustFireLoss(acidstr/2, 0) if((method==VAPOR) && (!C.wear_mask)) if(prob(20)) @@ -283,6 +290,7 @@ id = "fermiTest" description = "You should be really careful with this...! Also, how did you get this?" addProc = TRUE + can_synth = FALSE /datum/reagent/fermi/fermiTest/on_new(datum/reagents/holder) ..() @@ -318,6 +326,7 @@ description = "You should be really careful with this...! Also, how did you get this? You shouldn't have this!" data = "merge" color = "FFFFFF" + can_synth = FALSE //I'm concerned this is too weak, but I also don't want deathmixes. /datum/reagent/fermi/fermiTox/on_mob_life(mob/living/carbon/C, method) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 4040735356..3ab3d1391d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -18,7 +18,7 @@ pH = 7 var/ImpureTot = 0 var/turf/T = get_turf(my_atom) - + if(temp>500)//if hot, start a fire switch(temp) if (500 to 750) @@ -89,6 +89,8 @@ PurityMin = 0.4 //The minimum purity something has to be above, otherwise it explodes. /datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. + if(!locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list) + return var/turf/open/location = get_turf(my_atom) var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list if(location) @@ -397,6 +399,8 @@ /datum/chemical_reaction/fermi/fermiABuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this + if(!locate(/datum/reagent/fermi/fermiABuffer) in my_atom.reagents.reagent_list) + return var/datum/reagent/fermi/fermiABuffer/Fa = locate(/datum/reagent/fermi/fermiABuffer) in my_atom.reagents.reagent_list Fa.data = 3 @@ -423,6 +427,8 @@ /datum/chemical_reaction/fermi/fermiBBuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this + if(!locate(/datum/reagent/fermi/fermiBBuffer) in my_atom.reagents.reagent_list) + return var/datum/reagent/fermi/fermiBBuffer/Fb = locate(/datum/reagent/fermi/fermiBBuffer) in my_atom.reagents.reagent_list Fb.data = 11 From eb2dc63a543d4869cecef3663bbd803ab1767b09 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 25 Jun 2019 07:50:44 +0100 Subject: [PATCH 307/608] Oh nooooo I forgot to save!!! --- .../code/modules/reagents/chemistry/reagents/MKUltra.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index fd54775d76..3ae036bd82 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -311,7 +311,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(!M.has_status_effect(STATUS_EFFECT_INLOVE)) var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers for(var/victim in seen) - if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (M.stat == DEAD) || (isliving(victim))) + if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (M.stat == DEAD) || (!isliving(victim))) seen = seen - victim if(seen.len == 0) return From 3928e027b42eb1061aee4366094f9fdfb198b42c Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 25 Jun 2019 23:06:55 +0100 Subject: [PATCH 308/608] Fixes (see dev discussion) --- code/__HELPERS/global_lists.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 3 ++- code/modules/reagents/reagent_containers.dm | 15 +++++++++++---- .../reagents/reagent_containers/glass.dm | 8 ++++++++ .../code/game/machinery/vending.dm | 5 +++-- .../game/objects/items/storage/firstaid.dm | 16 ++++++++++++++++ .../code/modules/arousal/organs/penis.dm | 2 +- .../chemistry/reagents/enlargement.dm | 13 ++++++++++--- .../chemistry/reagents/fermi_reagents.dm | 2 +- .../reagents/reagent container/hypovial.dm | 10 ++++++++++ modular_citadel/icons/firstaid.dmi | Bin 2952 -> 3051 bytes modular_citadel/icons/obj/vial.dmi | Bin 2574 -> 2622 bytes 12 files changed, 63 insertions(+), 13 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 93f2856544..6f1e9c25a3 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -52,7 +52,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) - GLOB.breasts_size_list = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "flat") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing. + GLOB.breasts_size_list = list ("a", "b", "c", "d", "e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing. GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger") for(var/K in GLOB.breasts_shapes_list) var/datum/sprite_accessory/breasts/value = GLOB.breasts_shapes_list[K] diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index baa31d0f56..27df783781 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -931,7 +931,8 @@ pH = 7 //In practice this is really confusing and players feel like it randomly melts their beakers, but I'm not sure how else to handle it. We'll see how it goes and I can remove this if it confuses people. else - pH = (((pH - R.pH) / total_volume) * amount) + pH + if (((pH > R.pH) && (pH <= 7)) || ((pH < R.pH) && (pH >= 7))) + pH = (((pH - R.pH) / total_volume) * amount) + pH if(istype(my_atom, /obj/item/reagent_containers/)) var/obj/item/reagent_containers/RC = my_atom RC.pH_check()//checks beaker resilience) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index bd1f024367..52c40c2ae5 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -16,6 +16,7 @@ var/disease_amount = 20 var/spillable = FALSE var/beaker_weakness_bitflag = NONE//Bitflag! + var/container_HP = 2 /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() @@ -160,7 +161,13 @@ if((reagents.pH < 0.5) || (reagents.pH > 13.5)) var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [src]'s melts from the extreme pH!") - playsound(get_turf(src), 'sound/FermiChem/acidmelt.ogg', 80, 1) - qdel(src) + container_HP-- + if(container_HP <= 0) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [src]'s melts from the extreme pH!") + playsound(get_turf(src), 'sound/FermiChem/acidmelt.ogg', 80, 1) + qdel(src) + else + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [src]'s is damaged by the extreme pH and begins to deform!") + playsound(get_turf(src), 'sound/FermiChem/bufferadd.ogg', 50, 1) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 3cb9b447dc..3efd17b29b 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -6,6 +6,7 @@ reagent_flags = OPENCONTAINER spillable = TRUE resistance_flags = ACID_PROOF + container_HP = 2 /obj/item/reagent_containers/glass/attack(mob/M, mob/user, obj/target) @@ -114,6 +115,7 @@ item_state = "beaker" materials = list(MAT_GLASS=500) beaker_weakness_bitflag = PH_WEAK + container_HP = 3 /obj/item/reagent_containers/glass/beaker/Initialize() . = ..() @@ -165,6 +167,7 @@ volume = 100 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100) + container_HP = 4 /obj/item/reagent_containers/glass/beaker/plastic name = "x-large beaker" @@ -207,6 +210,7 @@ reagent_flags = OPENCONTAINER | NO_REACT volume = 50 amount_per_transfer_from_this = 10 + container_HP = 10//shouldn't be needed /obj/item/reagent_containers/glass/beaker/noreact/Initialize() beaker_weakness_bitflag &= ~PH_WEAK @@ -223,6 +227,7 @@ volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300) + container_HP = 5 /obj/item/reagent_containers/glass/beaker/cryoxadone list_reagents = list("cryoxadone" = 30) @@ -279,6 +284,7 @@ SLOT_L_STORE, SLOT_R_STORE,\ SLOT_GENERC_DEXTROUS_STORAGE ) + container_HP = 2 /obj/item/reagent_containers/glass/bucket/Initialize() beaker_weakness_bitflag |= TEMP_WEAK @@ -332,6 +338,7 @@ materials = list(MAT_GLASS=0) volume = 50 amount_per_transfer_from_this = 10 + container_HP = 1 /obj/item/reagent_containers/glass/beaker/waterbottle/Initialize() beaker_weakness_bitflag |= TEMP_WEAK @@ -347,6 +354,7 @@ list_reagents = list("water" = 100) volume = 100 amount_per_transfer_from_this = 20 + container_HP = 1 /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty list_reagents = list() diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm index bdca91b0e6..c13a77cbed 100755 --- a/modular_citadel/code/game/machinery/vending.dm +++ b/modular_citadel/code/game/machinery/vending.dm @@ -26,12 +26,13 @@ /obj/item/storage/hypospraykit/toxin = 2, /obj/item/storage/hypospraykit/o2 = 2, /obj/item/storage/hypospraykit/brute = 2, + /obj/item/storage/hypospraykit/enlarge = 2, /obj/item/reagent_containers/glass/bottle/vial/small = 5) - + /obj/machinery/vending/wardrobe/chap_wardrobe premium = list(/obj/item/toy/plush/plushvar = 1, /obj/item/toy/plush/narplush = 1) - + #define STANDARD_CHARGE 1 #define CONTRABAND_CHARGE 2 #define COIN_CHARGE 3 diff --git a/modular_citadel/code/game/objects/items/storage/firstaid.dm b/modular_citadel/code/game/objects/items/storage/firstaid.dm index 6ff1bfbe2c..0fab7e04d9 100755 --- a/modular_citadel/code/game/objects/items/storage/firstaid.dm +++ b/modular_citadel/code/game/objects/items/storage/firstaid.dm @@ -103,6 +103,22 @@ new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin(src) new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin(src) +/obj/item/storage/hypospraykit/enlarge + name = "organomegaly trauma hypospray kit" + icon_state = "enlarge-mini" + item_state = "firstaid-brute" + +/obj/item/storage/hypospraykit/enlarge/PopulateContents() + if(empty) + return + new /obj/item/hypospray/mkii(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction(src) + /obj/item/storage/hypospraykit/brute name = "brute trauma hypospray kit" icon_state = "brute-mini" diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 59acb9f42d..6d5342dbee 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -12,7 +12,7 @@ size = 2 //arbitrary value derived from length and girth for sprites. var/length = 6 //inches var/cached_length //used to detect a change in length - var/girth = 0 + var/girth = 4.38 var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF var/list/dickflags = list() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index ce39d26a6b..52aef76be0 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -27,7 +27,7 @@ overdose_threshold = 12 metabolization_rate = 0.25 ImpureChem = "BEsmaller" //If you make an inpure chem, it stalls growth - InverseChemVal = 0.3 + InverseChemVal = 0.35 InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse /datum/reagent/fermi/breast_enlarger/on_mob_add(mob/living/carbon/M) @@ -155,6 +155,9 @@ B.update() ..() +/datum/reagent/fermi/PEsmaller/hypo + name = "Modesty milk" + description = "A medicine used to treat organomegaly in a patient's breasts." //////////////////////////////////////////////////////////////////////////////////////////////////// // PENIS ENLARGE @@ -171,7 +174,7 @@ overdose_threshold = 12 //ODing makes you male and removes female genitals metabolization_rate = 0.25 ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth - InverseChemVal = 0.3 + InverseChemVal = 0.35 InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse and shrinks instead. /datum/reagent/fermi/penis_enlarger/on_mob_add(mob/living/carbon/M) @@ -265,7 +268,7 @@ /datum/reagent/fermi/PEsmaller // Due to cozmo's request...! name = "Incubus draft" id = "PEsmaller" - description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? dumb + description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." color = "#888888" // This is greyish..? taste_description = "chinese dragon powder" metabolization_rate = 0.5 @@ -285,3 +288,7 @@ P.cached_length = P.cached_length - 0.1 P.update() ..() + +/datum/reagent/fermi/PEsmaller/hypo + name = "Chastity draft" + description = "A medicine used to treat organomegaly in a patient's penis." diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 743055b279..fa1c2f714b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -184,7 +184,7 @@ //Writen by Trilby!! Embellsished a little by me. /datum/reagent/fermi/nanite_b_gone - name = "Naninte bain" + name = "Naninte bane" id = "nanite_b_gone" description = "A stablised EMP that is highly volatile, shocking small nano machines that will kill them off at a rapid rate in a patient's system." color = "#708f8f" diff --git a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm index a58a7fc825..82cfb08e68 100755 --- a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm +++ b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm @@ -146,6 +146,16 @@ icon_state = "hypovial" comes_with = list("tricordrazine" = 30) +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction + name = "pink hypovial (breast reduction)" + icon_state = "hypovial-p" + comes_with = list("BEsmaller" = 30) + +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction + name = "pink hypovial (penis reduction)" + icon_state = "hypovial-p" + comes_with = list("PEsmaller" = 30) + /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO name = "deluxe hypovial" icon_state = "hypoviallarge-cmos" diff --git a/modular_citadel/icons/firstaid.dmi b/modular_citadel/icons/firstaid.dmi index 693f5a2fa4a3b1994a95408b80a642684d28dfe5..1e000e000f9daa2f61d945cf144e39773c0a4235 100644 GIT binary patch delta 2875 zcmYjTc{G&kAGZxL6Pb*qL~gdY2H|RuC0nAgG)4BLvEH(ky_eC7xMeFbrkP|3qo$-} z#w0X^q_JOPrF zGO7P(T>U~(C;ZgQC_X+u{wNpZSw8crJ~Z!L^g)v4r>thODOGe@y(5T!9 z-&7addIN(dMD2^tMTvs02xJ>5yXC8O=TZ4bvQ_r!r&uQ~m40)8brp*RG_9!AY95u( zm4(|wfD+K1-ZOhUTy7GiMxS}eTru#j{u1VPy;jS(pqD(HPQ92Kmh+n*W$0)tjjpd; zQ<3)xzYGnyVWvxXq5ttv>_g_!34bG)Jl$*3*IT}W$x^o5ENKm5e205-4I#5r)yVB) z3EGD-%aKQwulV>xf7)4DpkfMU3q>Qxj_x zItXmkv}S$xu#Qs~CWuGCWuQ>#f-UrELcykLW(1(n^p|4LL*nm(_cl$<*9ELNTN9cg zH_0ZcX*yh&V=GWusj}oxiHf*{r;zb(GYTJLVy-RHS#l(EO-+b<&)!-?J-kyy-KVMn z;9Kt0meRPaF+z)^L!-EQNWtyw)AY=6hDho8Wd8gj3Bii*Kie!0+q?v+{9NUuYk;IY z8ZxKL!(l4V1+#0X1yP#coy1TLS<`q81@jzks_4)ve`_xr@_hzzzL7I1e?V>~P(n~0 z-zT^waw}rzSapJ%p4H}C^gdn-2rNoF?N)6i;`Z^76V}vR*hmoBpe6Gok6@p%#~@qRhr|q2*-Q#F`=$<;eE|_Yf$+F^gnS z3m#YZ#YUgcSeSJ7p&F6wJG_TcT8GW$1Bz8Z!jFHD1bw4CanbKN&KCcVU zeaoDML!1`T0BP{K0M?U9>H3kJG*x+?XbA%Gx*J}yxKW*kE8ApGCh%2|ztI9`xF##p z=E1qLze$=s?y{ZY4Q`VDGW9Mvo#EU)c8bz(8|1?8=zU+egd^cDm@N&Hih<*o4dTRC z<{?Wz5Irq=zLA0cI6|To;)IAu%x&Q%dHE6UQ9y>}j+Fts&4Pw!E>aZ=Ee6aAsdBLE%=^D(ByI~)M|9!a>VESjGUsCXkEMe*pkm~^|5Z@O(WqHLQkAhcJ6 z+SCgDQbn{|uA59q_XDqm^S=9G{J>(%Z-Ubil?<&G`)pkpdx9<-Ij|l4>f~c5>T51q zLBW=zg)hLS*qaF2$7N{EL;7}Iq3De41gJ19HRqamjS<>T*XwYNW@&!{0*mJvgcY5w zHoG_Kjm%o`G0T?$)ptM@=QNWgrrpAj0e7q7oK0H<&c`QbO1p(!tatd3iZiXo$Qxq9 z3$y}lXrfF(&ClUSWLt<@rEQKChdXm{aSz8qIVRer2+hxtDy191WopSbERi3emH@j% z=u}c3kL8oNs%$0lz}r0KFiywR*U#nwykD^EM0@e+0i4;cG$b@n`aeuOvp;mte!0$| zmGjQcOo|x-&0|Kh_FB#FhLLBLBD%L%8BU+;d7_o>xVSfgMAnvBHOu)mH!Ch&x(=X8 zgFM~Bm$iF#M^}t@h5t8~Cw!j@qMc_sV>bHWPUP5g(v}VGxnBAb#JNK0Cxn(JsS%qW zb#q4#ncWbYiRbcw#u2#EJWQ!4u*oM*w5-$uPb`lJ9-2MUS{eCQ&s>FEK|5O5h)x??Gox6F~&xguYuNRw+5aYdL{J<6T2}} zE4h<9dZ&?2if$GelvJEMYzkx$0E(>=qG!o#mrlf5v|q5mQd0jBIgZv%b`YY@X*@bO zx=~o~&wo`C5=Cbylbc;PR~`!eWbgn6b`ajwHnQ8=0arrwpIUE5;D(B}XA8ec*xoHC zs`y+uvNSoy0V@_X&I^rqFTXjG5Lv4&!-~%A7>&Bk&)gW`Y1o+uW6zvIVVj(AATva# zVR4e|S-~iNfOPzU1b;zl1t;0=;Fz{-yyk;ff2ZxDn_92{ymL48flG-^CSZqa&lLL* z-#%$a*Llww&rHTxApS{|x6Ei-&;gZIb_yXLx_B!gBFp0Vd$pIt6>3i&ee5#0cL$73 z2A^nw#|Vdt--krK&Qy;cic~)Tmi^)thN*DN;Jnjp@<6nhcZQl&$n8K*N4^Cwh+fn; z?592y1&+AsUKFZR?T|CMMAh5PnRU6HoDqNbt~lfD2s*`EjnePJ3K9EQY`)-t8mkgm zxOEZ~(-bZbv z^}ms}H6ObZW0wDh81G3AduA-B0~i->WxVdbx0ILh&A2S&Ap~1!LFfv4<6dZ!GAw)M zGD05NGCm)5+|y`1SU>-aYF2-sl_3(q^Vob2&B6T`h6SHxN z@c`h+eQ?<`==A}bDj_V&aV*Tl;Sc^>Joap}oEMZVdF+MPUr@$Z357%KiQ{DQ@smg!U&sz_;wgekX)9Tfu8gg#11n`-vyT@;#D zO&|GqQ*!9B4klo~4cjNnQEWIgj5T5C;euFi7x66InsWSBxP_**(HK>#MW!Mi^~W>f zGrT@^Lt4fW?01*)fH{2v&7VJEw9oo*dmO2spMfx)ESd^4!6p|S0<5#AHdwvJ>{TC% zDMz#X4DpFaGnSe2_j?}2gb_g|Uu?<39YP=?gVFQq?qkB4a9%I4;Zp-;EZcY1^ z=&9$NPRY1N2+bLddM`vS_;!EgnhmL6Y%Li5=QHA~;VY{Rs~+#WZu6}7o{v&6qqy+H zlQBG;)HqKfrceyw{zU6*xk&N`hpO^R6|rAgzQ1k`q)9W^&GG?B+T(5Bb(qgi#2RT; Ibv3E&VKKAqxAePyhtD7Pb$>sf>%PAC^?rZu*L~CF?#Vq;1}CPeB=1@K zZW9awfxw|ocFrKP*%3d%TsUn=74Y$xH*$G#Bnkhby?fl~YRF}pVbkrHWK-R{#TT-k zFeraToL^m@Mqc;L2|rwzOVc>}C(Fk~?<8Z!qcbMtAu@X34mCL1=9uoul4q2>JethJ z@Em(bufJj0j8NB!`KNO-;%CIjDwfZ~ii;(sO7G7*-Tm8#BR!ENBW@#>qmlp&;@jw@ zuqzs^j`xEHUWwL;dRBc3J{MlEZIn-LraT~BydRu(z=t?-xa;!;|I^ppb&^ifReHB# zeJtIs-Z5HH9(MllF;o*((bPqHi^?A+TP6IkXI1_-c7td~%#)ZqHpDPiGVlR`-~=lR zbC<|`M!`Zj4JB!L__u6u0!|O$G&l1(wxj8r4rkNp&o4))5txaI`9}9c9mOn%KV(^- zK7IOwlGUA+u%#!O*58fq|IWW;rF2+0iDP0uyw`%uTa!{O)_F)nKOm;1z5~O;0``YY zsg+{_TQ}C2l_ZH_pD2|I;Vm_uoDe@rF-%iEq))AU>>3HgVpa}gY&8Mu$3qNQC=Z(t zgBjn>&8)Lo5Z9~!w`Vg#eWYpiBpR9`sx$)(g@K8I>ub@JRwl7gm>#10N?3v zB7erx#ewP*6^Kp%?-dtD*eB08@&AVJlouDu7$w)AqvWM>)IC}r+Hm_+g=LVreTNwG zz|+$9w5!1Vfij`OxBGnUI7Pes)P*(Gm#r=6foq6-nnLct&1?6s#NG72L@2>o82+*2 zN@Rkcpfb(VkfR3<@+9x}NWKE5suk{7!p6o#WAx>Vs}!Dd2Ng11OB#K(P^EenZtv8U ze8FElsqf&j`Tg6)EqQbDK%LZsuQBF&);RN|Dya58$cN{@j^@DOEhxevb@2@Ip*&Uyd>m%uW5d!`gQ(w>Acayk56( z&&ytZzKI!4wv%4J5Gn%y6>O3eJ@7a;DD|iM_6}OHJ~(Y+tbv!AjJ;B|)aH#B{7Z00 zW88bOlFd99;u9TLU6UTU<+iuykgOstGPR5?9ZN`X!r4|#^|&d@6K0d!{Z2xS1@-{1 zDR{zc_e{7gbbIOeb?>-@HjqJ+z&n1dC_W*c8r}z4r3X53gX-J~!C+G)i#UaJtS2~l z1$O2RZcYYOpKx~o+fz~xmvNanw=z}sd|JfLE>sUq9q3vxtZ&n+dNwyA-Upi7?)!T; zqQ#fKi!F^BqU0Z|v;)^}=ejwpvV*FRU(~apM`V^UcGc9%ZNxTMPV1paLf3|^sjItW zC;AnhzVyt*R)GR_mM%Lv5IYU?^jd_}-Zt5zuNBshRlPVJ$a!|grNV~k--p<^> z4ZnD@SG)Y5Nqn9WbkYM}!83JVX7DXc&6XLzToCLND6RK449A=8Ex8JOeRUaa6f1J8UTR5nH+zUyT5J)AR zvlx;172Z+CmWoBmbhmTu1=7AR*_@mXO#lbP8W-BTv}D+DlUc`-02@|Qw*t%`CAJ)+ zk^L+8GsV8w3f-z7BA)Zgh&1ZR|H4Feigu-mM6QHCFk~p1eE)hSE_SwW5evgCVx?x* z5O1jp_5C-$;W=}Ny$b$Ul^lC}%`rq@y?W2eT{S~f%CUxp4kH4zjEWsUD14m(^|YF= zkSic*1G0pduF|IY)zrtml8mAiJy~xClxK+d%S4*vf<+qZ|F6@xoFT&%Rp%XUmJyyD zGG`r_6ZCe_FWzY2v3#{nFkThQ(U*b%72YZ&mQnL1u#%Km&9LDAEpD6`E1~s1!=p#~ z$2_S#L3``m`fLTz{>_%(O;K){H1-rlgBu-RzKPk!O7gmnmLYk3Uq=}|&|qU4qa{a= zxI7mPw1C2JjPP3%FXGg;Gwe8U-sWDhd1R^yoA;U0oaBN;QbRak8;j0o`ZVo z&)2TxXxBEE?e`FQUTLw5eAcYiH4uz-UpkOqGR}N>`=NGICh;e82nr=O4odlWr02&V zZYDP%yie`mh?64Ged)z>NN0er{u{ONI_W<}@wVo{xjN;Z|4iVmDca=?&iy^L-haHS zyO8P)yfO4o^?nmI7a^;43&!Ua&7UudXQ4f+^~bh40x(sh-$2ZxqbYA|slh0y$-V(a z=zbEBZL&chtXjpmbVg}ctlCcP= zWMbPwq;aA6j?H$BtT|RRaWZI~o+aleVukIuF;KWGux2hfsu8Y^U}WTKWvtmG1lQQp zrXx=iAv;fTls&QJnh!fW(^aL`hF)>=@c|N_3!EJo-y0%CDgdUWXFk5dlC5PM>_d~B z$VEZwRK-buC!JWn=#)cb7xZ+$I&*;w|K21<|wRic}CKvVTy(ikd*@wilPsywA< zq|guj(G>@Tw7xEL&u(+aRg+c<612#P7?k$)o};@FaQq?jVC|iSP|~T7_|e%sL&1DSQMX#V^IuSKr5=%k^=ks}Z$n&!oSXntSDX%X;9OwC1kq z&_)n3f8J6NP3CanTTx~FN0sHDVy}D5zm+{QJnGKok>zso$xqR}fsO^~lpQCIZwE!2 aFRTvAltb@(k|}t)f~-#3S^Ra}8~-mt9%`ik diff --git a/modular_citadel/icons/obj/vial.dmi b/modular_citadel/icons/obj/vial.dmi index bc282ab1d3df0d243d034f54c0abcc4a5c7013e7..38402d4ad0e6dc7c20d05135d73b6f5fe2568959 100755 GIT binary patch literal 2622 zcmb7`dpwhUAIGoFVQ$Phhs~)}4k6t+q%b0-A~!0TaHp8Nm~w0r$(@m7Dd(&bN|943 zhfPSukh5}_FezKJIn2zqXFR>0`*~jd@x1!ux<1$Sy6B8AjJ#>6e3uG4K<{oNyF2wgzKyYXPItTzF^NV^brJ6Nmu6|Z2 zn0)Xg*Tuw1zql>5f*$-SL#_v=X>tV%8LfFQYj(&=N{(kvm3~_n`^~K*HmZUvWPIVo zb%mWHZBoWhkLd2LDozTJ-(nAjRtH5b#~moSk)u$y1TxmqEmx=C9`vpmt@@gY2z!e! z73aB|dKR#2D6Z3eaJ&`UxazCapKZ~MHoF|%^nPK7Qvv=GGe_i{9qj}BOr|By*3~Aglmc&W$&j?K z{rfQh{3h#QXX6%`PaCsA!B47-&L8{kC0-PNC*ZuZ1J!g`v{KACWtw_JSl{>bWUss5 z=G#k~WweW|guPt`rey}bP$!f#dwp!B<8LM1wT{^Ndu5Zo!-W#L1kH3u zvD=od(mUF$iZQW_3zqo)eK8Nm9p&Xm%JoA|LZYO!J^mNQ4j;$cj5Xbt#O~ z@r=M&l2+YyMb#9hDDm z6n3(KX&eOPQbaU+U>NaM-2~5@@;6szJglCMET1xWvQ@e|t*0PCdC_IvT}|uw8l7)? zB|l3Kz{kEf;29FpAqMzCG}1g3_hi4bR_@9i`SA0!ZEaTAA?ihU!K!rdO_ct>U-rwA ziIBfAv`QuU6Y|)Z2s!owPN-;js*p4Cc*dZCM|14MzpwdgvH!hX*PME`=&ht9-_L zymZfq`9mVb+clf4u!afJLxyn0V|eK24UJU|4W1cj^&hUT+aNIahv*Zbm?fM>%RGwn zWWg(Nyo&O-SAS5D$y2B=LgUqOK(L9pV=bQ+tLG5&M|O#nL-6tUJBaGS1v(^h=iMY} zZ1EIlWKW5aT4W8^Xmo7s?qDEtZz=_RH2U7=@O{sTR-ChF{ks(yBZ-C{<(ZNK3M;U+ zx5@t-)67F^hSk=K<8s1}^iONw=C7gelmrcV5$o_VZ!4Whh%9sg1?;(MD8UsAc3_BA zRHrw`%KB^;Nq!6mg@3BO=p&3esR#wKQRMh&;cV2&ePF77J_Cv^9%9vA6jgT3BJ#Mf zMJ?+hm&(xmEEs6Jv_&s?KnpMpm9_&7Xf?$~y^#xJ9!~?1tARl2L7>qr%>=nuiY{&a zfN@&$zdib2$Nt|P3xfI(RfVH~M_+LOd^Gdot2!>_Bza{Ok~$o60-Db6nIcXU^1rD^ zO6oTjez#?xm0stgL*$(RisxaXm{RW?Y>xT9V^qE+e-%zH+4 z6;z3Sto5qf7glFm`zl#zv9s;=OopYtQWIIw)pAN-E@Uq6JiCV2@oZ6LSWpX4e;8v4 zp|BU?bT#5Dy|}p=N7pyuUI5;7<2v*D&5n8dKL|!(K!-I|6R5qsg*}dvRI&%q3OWh{ zGYD2P5wx|f|7jXu&(UVIjU$wfic(6j^98ME$uEjw@;Mh;)htFY^N>HGkqu=h8kr&F zR=V@}pZa!ol(RbIXeDY~4WGq+j4rBTCq(nrFrz$!jfmOfe8bYpBf`7%vc$6(Y+sLn zTkRuz&=n!DLxzSq?OzlU?4}gnJtQ@fJee9X{01K3GlK{6M{F>7POsj>jQ>(mKx(it zznw!bYn5a^L)~YbPc0U5eEp%Fs~b1hokNU1A~I1byjVK1vD%~8p4`uGjVwIsz7u8) z-uU;exL+0Bz5Jz6d3O|iR_E5??qWtI04>&KOcGEDwSwIN{paWv`A zif+cX-iVMd%`F9A>*!$GWPTr`oG9@;4+%Zr@+dEDRL_UGeVhJOhXHs`SI*If6&p=aphJNzK^|6 z!r#XjOr4N4nz_I$qE{KgK!&=?pm0SOBUO;1OH=kW*(Ms|a`0{<##crtmHe;;-gw=h z@Cx9T3}nP(k@wCBH^sm1((zedg)_VFCsLauHs-}I_P9?Y;qt&B&YwVy5?rb@?(%5f zEYYvsyAASB_Yz54~JtJ)QTy~3;Y8238mD=}GK158j9x_YB7It|P&0srf!-_F~RaaxJz0t21xhhAMd`hmsaXn(rkKOX25JBcL*TG)G$8uA@aO&5rI^&iwS|7Uhw|`mT zf*RlkZFAK-(pOTVHfc3w_E-UW_J9^z{d~AFe1)R2(kwQSGWm*reaplmS62MZ{*UmK r*R!gTF~Ao26+@YgiT~3OUPd_Lnl05(c(~w)5O6r)WLLi5=i0vj#+~Q> delta 2316 zcmX|?2T;@56UUQ)lmLPxh(|w8Mefi9>4zjJC`f3E6j5RjrAZM%f>M4#QRFZbBRzl( za#9kpgepW35ELW56Ph%EP=kSx{DU|1e=~1(X7}yRyxH$(w-%lRPca74I?AB+NV%qE zlUx5-xTewnv_JnsQ*}+%KCii!dVBr$f{^7y$3^1|>LYZbhj_!4^{Qd>nKsKCrKGJ$RaD5P8T`Qh7!q$%c*C(wOCZFKdC%9lO}c#C2;_u8_U5OempEj`gh@ojwddSK367! zy`u()EMVTsmR1GfIY%e>f`&!*R_tXTtz34=San^<0>9bF$VgoCrBV$FtcfTC?N^dA zfA)Vv8kLX$27-5DM*IzyV15W#@(tcX0DM@?#?~JwO0y^UlR*P=FJ53qYOxISW&ukQ z?Dt#rch%d=TKT&+HV< zy};J`ScobFaok^B3zX0VN%1v^mi&m3bF6&U{9NSP=Su7La7J5*e-&tdMwU_OPND4u z%q)t0BZ_RHK%g-u({NVES9CH)F}T_!DY^KB<6$Mi78+WROic2K>7EU71IZKFkW^AC z!=^VHZo+`?Hu)h*b|@|4MxMrqnV!c`=Zp)Vn-BU9JKg>?}=Pgzc(vT4TUd z$kh~tpvfBi^qKf;^Ob#28fO3%m`^7%bBC2U*uEtflxA?{h<~7r5xUN`PM)JHoA#!uYf~ncm#a~4)VRU7v@p&g59|LBh z$GS7?a?Q}lnH;6Q!KPcpSq7=CIh9JKhPBg+Cn}CGJ}QfiUh_En@1{M*1vxK65qe`18)R~sOre4(c2&K&MdG5gFTbO9n&=S7Aw3&6(5tvCjWp) z1G&eSMfdd_1Jk{ojFDh(Cq`zi-2N zIH8X$L;&A&uEHG%M52sqvq_g|rty+BEX)B^ve!&bB+P*z!p$ZsrML8&fqN3m!83WF zM(p1`Gjql@XrYGiu_Ts_BM|YKR2s1bd9P-5DNOs?g94!)5xQyzIv;L>jFXXoUYJf!W}S?KFNzwMY2>W zxp@h(p7c<^hWIpLslWU7bZtUagg$BYjym#P&dwV|?3Wrpk9}35fOOBj-$8_K@#wk) zgVn1+F`!N~GK00- z)Mrs=7^a4%6vE_?**mV$Dd@jTiYdo(!XEDsP&#!a)+Xa5y24>wepcqGgQAum=ISa- zAE=icwJ6}aVu3*2AQI3hp+(iU6IVJh)<`=TmKv zO$9IffuLw}ntdtoHIq%uK%DxoLTKNDQ*NC>q*6Ex=PpHw)qTfpxa5N~0^c{VC6xBV z1GE?c(0xv(V7j}JrzzMySDon$uBqAcagk^eaH#I|eRR0;kMJ$fOeP3MkIZ@E1;KTD z`$&J&1qZBpjLICf)~}Vad{#zkmw?N44+Y&X#Em-{(hfZg0(9~1OPD;sR8#K4JwzjJq!<(1I zIy*aUR@vx?xYi9Te|oK%1KU}wo0}V zmsS@OV$+kA^woU1cVYglId_xSUl1$A;D!E{t(DK{N5^x1bZC+k(%mzfbLQ}m&d6#M zFjy8o^fHr{{tK_$1p6!DgmD@_^Zq*5E2OxOu2@ z_5Pc-gqzjTpfFpIDMIzyxojC84;r Date: Tue, 25 Jun 2019 23:11:43 +0100 Subject: [PATCH 309/608] Fixed empty hypovial --- modular_citadel/code/game/objects/items/storage/firstaid.dm | 2 +- .../code/modules/reagents/reagent container/hypospraymkii.dm | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/modular_citadel/code/game/objects/items/storage/firstaid.dm b/modular_citadel/code/game/objects/items/storage/firstaid.dm index 0fab7e04d9..125330a9b9 100755 --- a/modular_citadel/code/game/objects/items/storage/firstaid.dm +++ b/modular_citadel/code/game/objects/items/storage/firstaid.dm @@ -111,7 +111,7 @@ /obj/item/storage/hypospraykit/enlarge/PopulateContents() if(empty) return - new /obj/item/hypospray/mkii(src) + new /obj/item/hypospray/mkii/enlarge(src) new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src) new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src) new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src) diff --git a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm index bee56cde15..6cd9e1badc 100755 --- a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm +++ b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm @@ -50,6 +50,9 @@ /obj/item/hypospray/mkii/tricord start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord +/obj/item/hypospray/mkii/enlarge + spawnwithvial = FALSE + /obj/item/hypospray/mkii/CMO name = "hypospray mk.II deluxe" allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small, /obj/item/reagent_containers/glass/bottle/vial/large) From 1f0dec53ffa688c9c28fc13088667c4f5c3947ad Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 25 Jun 2019 23:13:22 +0100 Subject: [PATCH 310/608] Fixed wrong chem --- .../code/modules/reagents/chemistry/reagents/enlargement.dm | 2 ++ .../code/modules/reagents/reagent container/hypovial.dm | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 52aef76be0..0a4496566f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -157,6 +157,7 @@ /datum/reagent/fermi/PEsmaller/hypo name = "Modesty milk" + id = "BEsmaller_hypo" description = "A medicine used to treat organomegaly in a patient's breasts." //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -291,4 +292,5 @@ /datum/reagent/fermi/PEsmaller/hypo name = "Chastity draft" + id = "PEsmaller_hypo" description = "A medicine used to treat organomegaly in a patient's penis." diff --git a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm index 82cfb08e68..37d5a59f4c 100755 --- a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm +++ b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm @@ -149,12 +149,12 @@ /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction name = "pink hypovial (breast reduction)" icon_state = "hypovial-p" - comes_with = list("BEsmaller" = 30) + comes_with = list("BEsmaller_hypo" = 30) /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction name = "pink hypovial (penis reduction)" icon_state = "hypovial-p" - comes_with = list("PEsmaller" = 30) + comes_with = list("PEsmaller_hypo" = 30) /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO name = "deluxe hypovial" From 1ad92b97586c8f7dd02a68e54c3e4ba2c6629250 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 25 Jun 2019 23:44:04 +0100 Subject: [PATCH 311/608] Final round of fixes from testing. --- .../code/modules/arousal/organs/breasts.dm | 2 +- .../code/modules/arousal/organs/penis.dm | 2 +- .../chemistry/reagents/enlargement.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 4 ++-- .../reagents/reagent container/hypovial.dm | 4 ++-- modular_citadel/icons/firstaid.dmi | Bin 3051 -> 3060 bytes modular_citadel/icons/obj/vial.dmi | Bin 2622 -> 2625 bytes 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 6260878735..d7c518d415 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -123,7 +123,7 @@ to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") var/mob/living/carbon/human/H = owner H.Force_update_genitals() - else if (breast_values[size] < breast_values[prev_size]) + else if ((breast_values[size] < breast_values[prev_size]) && (breast_values[size] > 0.5)) to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size)]-cup.") var/mob/living/carbon/human/H = owner H.Force_update_genitals() diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 6d5342dbee..43a512acf6 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -60,7 +60,7 @@ if (round(length) > round(prev_length)) to_chat(o, "Your [pick(GLOB.gentlemans_organ_names)] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.") - else if (round(length) < round(prev_length)) + else if ((round(length) < round(prev_length)) && (length > 0.5)) to_chat(o, "Your [pick(GLOB.gentlemans_organ_names)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.") prev_length = length icon_state = sanitize_text("penis_[shape]_[size]") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 0a4496566f..f4e90f45a9 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -173,7 +173,7 @@ color = "#888888" // This is greyish..? taste_description = "chinese dragon powder" overdose_threshold = 12 //ODing makes you male and removes female genitals - metabolization_rate = 0.25 + metabolization_rate = 0.5 ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth InverseChemVal = 0.35 InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse and shrinks instead. diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index fa1c2f714b..1cd642e2db 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -143,7 +143,7 @@ for(var/victim in seen) if((istype(victim, /mob/living/simple_animal/pet/)) || (victim == M) || (!isliving(victim))) seen = seen - victim - if(seen) + if(LAZYLEN(seen)) to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") if(16) T = M.getorganslot(ORGAN_SLOT_TONGUE) @@ -164,7 +164,7 @@ for(var/victim in seen) if((istype(victim, /mob/living/simple_animal/pet/)) || (victim == M) || (!isliving(victim))) seen = seen - victim - if(seen) + if(LAZYLEN(seen)) to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") ..() diff --git a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm index 37d5a59f4c..07c2ce861d 100755 --- a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm +++ b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm @@ -148,12 +148,12 @@ /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction name = "pink hypovial (breast reduction)" - icon_state = "hypovial-p" + icon_state = "hypovial-pink" comes_with = list("BEsmaller_hypo" = 30) /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction name = "pink hypovial (penis reduction)" - icon_state = "hypovial-p" + icon_state = "hypovial-pink" comes_with = list("PEsmaller_hypo" = 30) /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO diff --git a/modular_citadel/icons/firstaid.dmi b/modular_citadel/icons/firstaid.dmi index 1e000e000f9daa2f61d945cf144e39773c0a4235..e7ac37822268e1aeaa5ddb80fca59c8b0697f56e 100644 GIT binary patch delta 2625 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 Date: Tue, 25 Jun 2019 23:46:42 +0100 Subject: [PATCH 312/608] Sprites --- .../code/modules/reagents/reagent container/hypovial.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm index 07c2ce861d..624c25e87e 100755 --- a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm +++ b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm @@ -14,7 +14,8 @@ "green hypovial" = "hypovial-a", "orange hypovial" = "hypovial-k", "purple hypovial" = "hypovial-p", - "black hypovial" = "hypovial-t" + "black hypovial" = "hypovial-t", + "pink hypovial" = "hypovial-pink" ) /obj/item/reagent_containers/glass/bottle/vial/Initialize() From fa9ae6d2e7feb4d54cbde43ac30e449391078a30 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 25 Jun 2019 23:52:38 +0100 Subject: [PATCH 313/608] Feedback regarding trait --- code/datums/traits/good.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 0becce0458..dffdc92630 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -190,7 +190,7 @@ /datum/quirk/bloodpressure name = "Polycythemia vera" desc = "You've a treated form of Polycythemia vera that increases the total blood volume inside of you as well as the rate of replenishment!" - value = 1 //I honeslty dunno if this is a good trait? I just means you use more of medbays blood and make janitors madder, but you also regen blood a lil faster. + value = 2 //I honeslty dunno if this is a good trait? I just means you use more of medbays blood and make janitors madder, but you also regen blood a lil faster. mob_trait = TRAIT_HIGH_BLOOD gain_text = "You feel full of blood!" lose_text = "You feel like your blood pressure went down." From a53ca38eb98d418b3fdde280f1948b0ef65647c4 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 25 Jun 2019 23:54:23 +0100 Subject: [PATCH 314/608] Lil fix --- .../code/modules/reagents/chemistry/reagents/enlargement.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index f4e90f45a9..e00fa1f4aa 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -155,7 +155,7 @@ B.update() ..() -/datum/reagent/fermi/PEsmaller/hypo +/datum/reagent/fermi/BEsmaller/hypo name = "Modesty milk" id = "BEsmaller_hypo" description = "A medicine used to treat organomegaly in a patient's breasts." From 19b79b8232e1dd217d8523a3f2b2481bd3fb9262 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 26 Jun 2019 01:29:34 +0100 Subject: [PATCH 315/608] The great botany purge of our time. --- .../code/modules/reagents/chemistry/reagents/astrogen.dm | 1 + .../code/modules/reagents/chemistry/reagents/enlargement.dm | 4 ++++ .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 1 + .../code/modules/reagents/chemistry/recipes/fermi.dm | 1 - 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index 9376519954..af84f46608 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -26,6 +26,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die var/antiGenetics = 255 var/sleepytime = 0 InverseChemVal = 0.25 + can_synth = FALSE /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! M.alpha = 255 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index e00fa1f4aa..dcd4169ac8 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -29,6 +29,7 @@ ImpureChem = "BEsmaller" //If you make an inpure chem, it stalls growth InverseChemVal = 0.35 InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse + can_synth = FALSE /datum/reagent/fermi/breast_enlarger/on_mob_add(mob/living/carbon/M) . = ..() @@ -139,6 +140,7 @@ color = "#E60584" // rgb: 96, 0, 255 taste_description = "a milky ice cream like flavour." metabolization_rate = 0.25 + can_synth = FALSE /datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M) var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") @@ -177,6 +179,7 @@ ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth InverseChemVal = 0.35 InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse and shrinks instead. + can_synth = FALSE /datum/reagent/fermi/penis_enlarger/on_mob_add(mob/living/carbon/M) . = ..() @@ -273,6 +276,7 @@ color = "#888888" // This is greyish..? taste_description = "chinese dragon powder" metabolization_rate = 0.5 + can_synth = FALSE /datum/reagent/fermi/PEsmaller/on_mob_life(mob/living/carbon/M) var/mob/living/carbon/human/H = M diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 1cd642e2db..ecf081168f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -387,6 +387,7 @@ color = "#ffc224" var/catshift = FALSE var/mob/living/simple_animal/pet/cat/custom_cat/catto = null + can_synth = FALSE /datum/reagent/fermi/secretcatchem/New() name = "Catbalti[pick("a","u","e","y")]m [pick("apex", "prime", "meow")]"//rename diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 3ab3d1391d..ac6fcc4799 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -48,7 +48,6 @@ if(pH < 4) //if acidic, make acid spray R.add_reagent("fermiAcid", (volume/3)) if(R.reagent_list) - message_admins("gas") s.set_up(R, (volume/5), my_atom) s.start() From fbf54cd560e696e364161c22057e81874e79c4d4 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 26 Jun 2019 12:01:26 +0100 Subject: [PATCH 316/608] Ninja fix. --- code/modules/ninja/suit/suit.dm | 2 +- modular_citadel/code/modules/reagents/objects/clothes.dm | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index 12492c8043..6110f2b0c0 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -101,7 +101,7 @@ Contents: to_chat(H, "fÄTaL ÈÈRRoR: 382200-*#00CÖDE RED\nUNAU†HORIZED USÈ DETÈC†††eD\nCoMMÈNCING SUB-R0U†IN3 13...\nTÈRMInATING U-U-USÈR...") H.gib() return FALSE - if(!istype(H.head, /obj/item/clothing/head/helmet/space/space_ninja) || !istype(H.head, /obj/item/clothing/head/hattip))//Fermichem edit, so ninjas can still use their suit with a fancy hat. + if(!istype(H.head, /obj/item/clothing/head/helmet/space/space_ninja)) to_chat(H, "ERROR: 100113 UNABLE TO LOCATE HEAD GEAR\nABORTING...") return FALSE if(!istype(H.shoes, /obj/item/clothing/shoes/space_ninja)) diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm index cab2e41947..5c9f814a94 100644 --- a/modular_citadel/code/modules/reagents/objects/clothes.dm +++ b/modular_citadel/code/modules/reagents/objects/clothes.dm @@ -10,6 +10,9 @@ //item_flags = NODROP //Tips their hat! /obj/item/clothing/head/hattip/attack_hand(mob/user) + if(is_ninja(user)) + to_chat(user, "Using your superior ninja reflexes, you take the hat off before tipping.") + return ..() if(iscarbon(user)) var/mob/living/carbon/C = user if(src == C.head) @@ -20,6 +23,9 @@ return ..() /obj/item/clothing/head/hattip/MouseDrop(atom/over_object) + if(is_ninja(user)) + to_chat(user, "Using your superior ninja reflexes, you take the hat off before tipping.") + return ..() //You sure do love tipping your hat. if(usr) var/mob/living/carbon/C = usr From 0954f0f50c9b099e1ee14844afad545c7e44a832 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 26 Jun 2019 12:07:21 +0100 Subject: [PATCH 317/608] This is why you always compile test before merging. --- .../code/modules/reagents/objects/clothes.dm | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm index 5c9f814a94..73bd7f84d5 100644 --- a/modular_citadel/code/modules/reagents/objects/clothes.dm +++ b/modular_citadel/code/modules/reagents/objects/clothes.dm @@ -10,11 +10,12 @@ //item_flags = NODROP //Tips their hat! /obj/item/clothing/head/hattip/attack_hand(mob/user) - if(is_ninja(user)) - to_chat(user, "Using your superior ninja reflexes, you take the hat off before tipping.") - return ..() if(iscarbon(user)) var/mob/living/carbon/C = user + if(is_ninja(C)) + to_chat(C, "Using your superior ninja reflexes, you take the hat off before tipping.") + return ..() + if(src == C.head) C.emote("me",1,"tips their hat.",TRUE) return @@ -23,12 +24,13 @@ return ..() /obj/item/clothing/head/hattip/MouseDrop(atom/over_object) - if(is_ninja(user)) - to_chat(user, "Using your superior ninja reflexes, you take the hat off before tipping.") - return ..() //You sure do love tipping your hat. if(usr) var/mob/living/carbon/C = usr + if(is_ninja(C)) + to_chat(C, "Using your superior ninja reflexes, you take the hat off before tipping.") + return ..() + if(src == C.head) C.emote("me",1,"tips their hat.",TRUE) return From afe43070a0f6d12271423ec9642f5f9990530049 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 26 Jun 2019 12:20:10 +0100 Subject: [PATCH 318/608] Improved logging and renamed buffer IDs --- code/modules/surgery/organs/vocal_cords.dm | 12 +++++---- .../code/datums/status_effects/chems.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 12 ++++----- .../reagents/chemistry/recipes/fermi.dm | 26 +++++++++---------- 4 files changed, 27 insertions(+), 25 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 6c3c7e89c6..a1469ad629 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1241,10 +1241,12 @@ if (trigger2 == "speak" || trigger2 == "echo") var/trigger3 = html_decode(stripped_input(user, "Enter the phrase spoken. Abusing this to self antag is bannable.", MAX_MESSAGE_LEN)) E.customTriggers[trigger] = list(trigger2, trigger3) - message_admins("[H] has been implanted by [user] with [trigger], triggering [trigger2], to send [trigger3].") + log_game("FERMICHEM: [H] has been implanted by [user] with [trigger], triggering [trigger2], to send [trigger3].") + if(findtext(trigger3, "admin")) + message_admins("FERMICHEM: [user] maybe be trying to abuse MKUltra by implanting by [H] with [trigger], triggering [trigger2], to send [trigger3].") else E.customTriggers[trigger] = trigger2 - message_admins("[H] has been implanted by [user] with [trigger], triggering [trigger2].") + log_game("FERMICHEM: [H] has been implanted by [user] with [trigger], triggering [trigger2].") E.mental_capacity -= 5 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.lewd?"your [E.enthrallGender]":"[E.master]")] whispers you a new trigger."), 5) else @@ -1302,6 +1304,7 @@ objective = replacetext(lowertext(objective), "strangle", "meow at") objective = replacetext(lowertext(objective), "suicide", "self-love") message_admins("[H] has been implanted by [user] with the objective [objective].") + log_game("FERMICHEM: [H] has been implanted by [user] with the objective [objective] via MKUltra.") addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.lewd?"Your [E.enthrallGender]":"[E.master]")] whispers you a new objective."), 5) brainwash(H, objective) E.mental_capacity -= 200 @@ -1413,10 +1416,9 @@ E.status = "charge" E.cooldown += 10 - if(message_admins)//Do you want this in? + if(message_admins || debug)//Do you want this in? message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") - if(debug == TRUE) - log_game("FERMICHEM: [key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") + log_game("FERMICHEM: [key_name(user)] ckey: [user.key] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") //SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) If this is on, it fills the thing up and OOFs the server return diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 7cdc809f46..1a65dfa796 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -219,7 +219,7 @@ var/mob/living/carbon/M = owner var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list if(!E) - message_admins("WARNING: FermiChem: No master found in thrall, did you bus in the chem? You need to set up the vars manually if it's not reacted/bussed. Someone set up the reaction incorrectly if not (Don't use donor blood). Console them with a fermiplush maybe?") + message_admins("WARNING: FermiChem: No master found in thrall, did you bus in the status? You need to set up the vars manually in the chem if it's not reacted/bussed. Someone set up the reaction/status proc incorrectly if not (Don't use donor blood). Console them with a chemcat plush maybe?") owner.remove_status_effect(src) enthrallID = E.creatorID enthrallGender = E.creatorGender diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index ecf081168f..6511773731 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -336,16 +336,16 @@ C.adjustToxLoss(2) ..() -/datum/reagent/fermi/fermiABuffer +/datum/reagent/fermi/acidic_buffer name = "Acidic buffer" - id = "fermiABuffer" + id = "acidic_buffer" description = "This reagent will consume itself and move the pH of a beaker towards 3 when added to another." taste_description = "an acidy sort of taste, blech." color = "#fbc314" pH = 3 //Consumes self on addition and shifts pH -/datum/reagent/fermi/fermiABuffer/on_new(datapH) +/datum/reagent/fermi/acidic_buffer/on_new(datapH) data = datapH if(LAZYLEN(holder.reagent_list) == 1) return @@ -357,15 +357,15 @@ holder.remove_reagent(id, volume) ..() -/datum/reagent/fermi/fermiBBuffer +/datum/reagent/fermi/basic_buffer name = "Basic buffer" - id = "fermiBBuffer" + id = "basic_buffer" description = "This reagent will consume itself and move the pH of a beaker towards 11 when added to another." taste_description = "an soapy sort of taste, blech." color = "#3853a4" pH = 11 -/datum/reagent/fermi/fermiBBuffer/on_new(datapH) +/datum/reagent/fermi/basic_buffer/on_new(datapH) data = datapH if(LAZYLEN(holder.reagent_list) == 1) return diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index ac6fcc4799..6c090b9b71 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -376,10 +376,10 @@ RateUpLim = 1 FermiChem = TRUE -/datum/chemical_reaction/fermi/fermiABuffer//done test +/datum/chemical_reaction/fermi/acidic_buffer//done test name = "Acetic acid buffer" - id = "fermiABuffer" - results = list("fermiABuffer" = 2) //acetic acid + id = "acidic_buffer" + results = list("acidic_buffer" = 2) //acetic acid required_reagents = list("salglu_solution" = 0.2, "ethanol" = 0.6, "oxygen" = 0.6, "water" = 0.6) //FermiChem vars: OptimalTempMin = 250 @@ -397,17 +397,17 @@ FermiChem = TRUE -/datum/chemical_reaction/fermi/fermiABuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this - if(!locate(/datum/reagent/fermi/fermiABuffer) in my_atom.reagents.reagent_list) +/datum/chemical_reaction/fermi/acidic_buffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this + if(!locate(/datum/reagent/fermi/acidic_buffer) in my_atom.reagents.reagent_list) return - var/datum/reagent/fermi/fermiABuffer/Fa = locate(/datum/reagent/fermi/fermiABuffer) in my_atom.reagents.reagent_list + var/datum/reagent/fermi/acidic_buffer/Fa = locate(/datum/reagent/fermi/acidic_buffer) in my_atom.reagents.reagent_list Fa.data = 3 -/datum/chemical_reaction/fermi/fermiBBuffer//done test +/datum/chemical_reaction/fermi/basic_buffer//done test name = "Ethyl Ethanoate buffer" - id = "fermiBBuffer" - results = list("fermiBBuffer" = 1.5) - required_reagents = list("fermiABuffer" = 0.5, "ethanol" = 0.5, "salglu_solution" = 0.1, "water" = 0.5) + id = "basic_buffer" + results = list("basic_buffer" = 1.5) + required_reagents = list("acidic_buffer" = 0.5, "ethanol" = 0.5, "salglu_solution" = 0.1, "water" = 0.5) required_catalysts = list("sacid" = 1) //vagely acetic //FermiChem vars: OptimalTempMin = 250 @@ -425,10 +425,10 @@ FermiChem = TRUE -/datum/chemical_reaction/fermi/fermiBBuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this - if(!locate(/datum/reagent/fermi/fermiBBuffer) in my_atom.reagents.reagent_list) +/datum/chemical_reaction/fermi/basic_buffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this + if(!locate(/datum/reagent/fermi/basic_buffer) in my_atom.reagents.reagent_list) return - var/datum/reagent/fermi/fermiBBuffer/Fb = locate(/datum/reagent/fermi/fermiBBuffer) in my_atom.reagents.reagent_list + var/datum/reagent/fermi/basic_buffer/Fb = locate(/datum/reagent/fermi/basic_buffer) in my_atom.reagents.reagent_list Fb.data = 11 //secretcatchemcode, shh!! Of couse I hide it amongst cats. Though, I moved it with your requests. From a2a5bbdb11dec5c8f40ab7a0fc6246372946cf66 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Wed, 26 Jun 2019 19:40:46 +0100 Subject: [PATCH 319/608] Found the "the floor" message admin! --- code/modules/mob/living/simple_animal/friendly/cat.dm | 3 --- code/modules/surgery/organs/organ_internal.dm | 1 - code/modules/surgery/organs/vocal_cords.dm | 4 ++-- .../code/modules/reagents/chemistry/recipes/fermi.dm | 1 + 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 19e7d58912..33d10a4c19 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -316,14 +316,11 @@ var/pseudo_death = FALSE /mob/living/simple_animal/pet/cat/custom_cat/death() - message_admins("dedcat") if (pseudo_death == TRUE) //secret cat chem icon_state = "custom_cat_dead" Stun(1000) canmove = 0 - message_admins("dedcat") friendly = "deads at" return else - message_admins("deddercat") ..() diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 6b1d385f82..b16967b6b0 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -22,7 +22,6 @@ if(replaced) replaced.Remove(M, special = 1) if(drop_if_replaced) - message_admins("[get_turf(M)]") replaced.forceMove(get_turf(M)) else qdel(replaced) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index a1469ad629..cc734cb9a7 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1187,7 +1187,7 @@ if(2 to INFINITY) L.lay_down() E.cooldown += 10 - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[(L.lewd?"You eagerly lie down!":"You suddenly lie down!'")]"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[(L.lewd?"You eagerly lie down!":"You suddenly lie down!")]"), 5) //KNOCKDOWN else if(findtext(message, knockdown_words)) @@ -1198,7 +1198,7 @@ if(2 to INFINITY) L.Knockdown(30 * power_multiplier * E.phase) E.cooldown += 8 - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You suddenly drop to the ground!'"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You suddenly drop to the ground!"), 5) //tier3 diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 6c090b9b71..7792b6b1c9 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -35,6 +35,7 @@ message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].") + log_game("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].") var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case. var/datum/effect_system/smoke_spread/chem/s = new() R.my_atom = my_atom //Give the gas a fingerprint From 7830b27b07b5e61bd1259adf29c8d3465cd4836d Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Wed, 26 Jun 2019 19:27:22 -0400 Subject: [PATCH 320/608] Update backpack.dm --- code/game/objects/items/storage/backpack.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index c2929dafbd..2468184d12 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -248,12 +248,13 @@ desc = "A bone satchel fashend with watcher wings and large bones from goliath. Can be worn on the belt." icon = 'icons/obj/mining.dmi' icon_state = "goliath_saddle" - slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_BELT + slot_flags = ITEM_SLOT_BACK /obj/item/storage/backpack/satchel/bone/ComponentInitialize() . = ..() GET_COMPONENT(STR, /datum/component/storage) - STR.max_combined_w_class = 10 + STR.max_combined_w_class = 20 + STR.max_items = 15 /obj/item/storage/backpack/satchel/cap name = "captain's satchel" From 4b7ac0be7940682e954ae76d1a4b911dfd0fb366 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Fri, 28 Jun 2019 16:50:48 +0100 Subject: [PATCH 321/608] More fun ssblackbox tallies. --- code/modules/reagents/chemistry/holder.dm | 10 +++++++--- code/modules/surgery/organs/lungs.dm | 1 + code/modules/surgery/organs/tongue.dm | 1 + modular_citadel/code/datums/status_effects/chems.dm | 4 ++++ .../modules/reagents/chemistry/reagents/MKUltra.dm | 3 +++ .../code/modules/reagents/chemistry/reagents/SDGF.dm | 3 +++ .../modules/reagents/chemistry/reagents/astrogen.dm | 2 ++ .../reagents/chemistry/reagents/eigentstasium.dm | 3 ++- .../reagents/chemistry/reagents/fermi_reagents.dm | 1 + 9 files changed, 24 insertions(+), 4 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 27df783781..e97c25996e 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -465,6 +465,7 @@ if (chem_temp > C.ExplodeTemp) //This is first to ensure explosions. var/datum/chemical_reaction/fermi/Ferm = selected_reaction fermiIsReacting = FALSE + SSblackbox.record_feedback("tally", "fermi_chem", 1, (Ferm+" explosion")) Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH) return 0 @@ -484,7 +485,6 @@ fermiIsReacting = TRUE fermiReactID = selected_reaction reaction_occurred = 1 - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log else //It's a little bit of a confusing nest, but esstentially we check if it's a fermireaction, then temperature, then pH. If this is true, the remainer of this handler is run. return 0 //If pH is out of range @@ -656,7 +656,8 @@ //add product var/TotalStep = 0 for(var/P in cached_results) - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + SSblackbox.record_feedback("tally", "chemical_reaction", addChemAmmount, P)//log + SSblackbox.record_feedback("tally", "fermi_chem", addChemAmmount, P) add_reagent(P, (addChemAmmount), null, cached_temp, purity)//add reagent function!! I THINK I can do this: TotalStep += addChemAmmount//for multiple products //Above should reduce yeild based on holder purity. @@ -665,6 +666,7 @@ if(P == R.id) if (R.purity < C.PurityMin)//If purity is below the min, blow it up. fermiIsReacting = FALSE + SSblackbox.record_feedback("tally", "fermi_chem", 1, (P+" explosion")) C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) STOP_PROCESSING(SSprocessing, src) return 0 @@ -681,7 +683,8 @@ if (chem_temp > C.ExplodeTemp) //go to explode proc fermiIsReacting = FALSE - C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) + SSblackbox.record_feedback("tally", "fermi_chem", 1, (P+" explosion")) + C.FermiExplode(src, my_atom, (reactedVol+targetVol), chem_temp, pH) STOP_PROCESSING(SSprocessing, src) return @@ -816,6 +819,7 @@ if (D.id == "water") //Do like an otter, add acid to water. if (pH <= 2) + SSblackbox.record_feedback("tally", "fermi_chem", 1, "water-acid explosions") var/datum/effect_system/smoke_spread/chem/s = new var/turf/T = get_turf(my_atom) var/datum/reagents/R = new/datum/reagents(3000) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 0dce595ef7..39ae90d87f 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -72,6 +72,7 @@ if ((damage / maxHealth) > 1) to_chat(M, "You feel your lungs collapse within your chest as you gasp for air, unable to inflate them anymore!") M.emote("gasp") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Lungs lost") qdel(src) else if ((damage / maxHealth) > 0.75) to_chat(M, "It's getting really hard to breathe!!") diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 71ea0a34a1..b657c93beb 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -49,6 +49,7 @@ damage += damage_mod if ((damage / maxHealth) > 1) to_chat(M, "Your tongue is singed beyond recognition, and disintegrates!") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Tongues lost to Fermi") qdel(src) else if ((damage / maxHealth) > 0.85) to_chat(M, "Your tongue feels like it's about to fall out!.") diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 1a65dfa796..59c48ca16b 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -238,6 +238,7 @@ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") log_game("FERMICHEM: MKULTRA: Status applied on [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Enthrall attempts") return ..() /datum/status_effect/chem/enthrall/tick() @@ -282,6 +283,7 @@ enthrallTally = 0 if(owner.lewd) to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Enthralled to state 2") else else if (resistanceTally > 150) @@ -289,6 +291,7 @@ to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") if(DistApart < 10) to_chat(master, "[(master.lewd?"Your pet":"Your thrall")] seems to have broken free of your enthrallment!") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Thralls broken free") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) if(owner.lewd) @@ -306,6 +309,7 @@ to_chat(owner, "You are unable to put up a resistance any longer, and now are under the control of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [master] in death. ") ADD_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") //IMPORTANT log_game("FERMICHEM: MKULTRA: Status on [owner] ckey: [owner.key] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "thralls fully enthralled.") else if (resistanceTally > 200) enthrallTally *= 0.5 phase -= 1 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 3ae036bd82..e27efbff36 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -291,6 +291,7 @@ Creating a chem with a low purity will make you permanently fall in love with so E.phase = 4 E.mental_capacity = 0 E.customTriggers = list() + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Thralls mindbroken") /datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M) M.adjustBrainLoss(0.2)//should be ~40 in total @@ -321,6 +322,7 @@ Creating a chem with a low purity will make you permanently fall in love with so M.apply_status_effect(STATUS_EFFECT_INLOVE, love) to_chat(M, "You develop overwhelmingly deep feelings for [love], your heart beginning to race as you look upon them with new eyes. You are determined to keep them safe above all other priorities.") log_game("FERMICHEM: [M] ckey: [M.key] has temporarily fallen for [love] ckey: [love.key]") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have fallen in love") else if(get_dist(M, love) < 8) if(HAS_TRAIT(M, TRAIT_NYMPHO)) //Add this back when merged/updated. @@ -355,6 +357,7 @@ Creating a chem with a low purity will make you permanently fall in love with so Lover.faction |= "[REF(Love)]" Lover.apply_status_effect(STATUS_EFFECT_INLOVE, Love) forge_valentines_objective(Lover, Love, TRUE) + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have become infatuated.") log_game("FERMICHEM: [Lover] ckey: [Lover.key] has been chemically made to fall for [Love] ckey: [Love.key]") return diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index cb92285e12..1f50c2669b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -117,6 +117,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING SM.reagents.add_reagent("SDGFheal", volume) M.reagents.remove_reagent(id, volume) log_game("FERMICHEM: [volume]u of SDGFheal has been transferred to the clone") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Sentient clones made") return else if(playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). @@ -159,6 +160,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) log_game("FERMICHEM: [M] ckey: [M.key] has created a mindless clone of themselves") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Braindead clones made") if(87 to INFINITY) M.reagents.remove_reagent(id, volume)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. @@ -277,6 +279,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.reagents.remove_reagent(id, volume) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") log_game("FERMICHEM: [M] ckey: [M.key]'s clone has become a horrifying teratoma instead") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Zombie clones made!") if(87 to INFINITY) M.adjustToxLoss(1, 0) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index af84f46608..e977987b68 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -50,6 +50,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die G.name = "[M]'s astral projection" M.mind.transfer_to(G) sleepytime = 15*volume + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Astral projections") if(overdosed) if(prob(50)) to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") @@ -111,6 +112,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die deadchat_broadcast("[M] has become one with the universe, meaning that their IC conciousness is continuous in a new life. If they find a way back to life, they are allowed to remember their previous life. Be careful what you say. If they abuse this, bwoink the FUCK outta them.") M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") message_admins("[M] (ckey: [M.ckey]) has become one with the universe, and have continuous memories thoughout their lives should they find a way to come back to life (such as an inteligence potion, midround antag, ghost role).") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Astral obliterations") qdel(M) //Approx 60minutes till death from initial addiction log_game("FERMICHEM: [M] ckey: [M.key] has been obliterated from Astrogen addiction") ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index c4d8a225e3..e905f7b257 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -58,6 +58,7 @@ do_sparks(5,FALSE,M) do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,M) + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Pure eigentstate jumps") if(prob(20)) @@ -159,7 +160,7 @@ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, Me) //Why does this not work? */ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) - + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Wild rides ridden") if(prob(20)) do_sparks(5,FALSE,M) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 6511773731..11626bf72f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -410,6 +410,7 @@ catto.pseudo_death = TRUE H.forceMove(catto) log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "cats") //Just to deal with rascally ghosts //ADD_TRAIT(catto, TRAIT_NODEATH, "catto")//doesn't work //catto.health = 1000 //To simulate fake death, while preventing ghosts escaping. From 9ee17e404511b09a560eee17cde1315286b8ee20 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Fri, 28 Jun 2019 16:58:08 +0100 Subject: [PATCH 322/608] [TEST] redo pH on reaction. --- code/modules/reagents/chemistry/holder.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index e97c25996e..399854f244 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -498,7 +498,7 @@ multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01)) for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1) + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1, ignore_pH = TRUE) for(var/P in selected_reaction.results) multiplier = max(multiplier, 1) //this shouldnt happen ... @@ -651,7 +651,7 @@ //remove reactants for(var/B in cached_required_reagents) - remove_reagent(B, (removeChemAmmount * cached_required_reagents[B]), safety = 1) + remove_reagent(B, (removeChemAmmount * cached_required_reagents[B]), safety = 1, ignore_pH = TRUE) //add product var/TotalStep = 0 @@ -913,7 +913,7 @@ var/amt = list_reagents[r_id] add_reagent(r_id, amt, data) -/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to +/datum/reagents/proc/remove_reagent(reagent, amount, safety, ignore_pH = FALSE)//Added a safety check for the trans_id_to if(isnull(amount)) amount = 0 @@ -934,7 +934,7 @@ if((total_volume - amount) <= 0)//Because this can result in 0, I don't want it to crash. pH = 7 //In practice this is really confusing and players feel like it randomly melts their beakers, but I'm not sure how else to handle it. We'll see how it goes and I can remove this if it confuses people. - else + else if (ignore_pH == FALSE) if (((pH > R.pH) && (pH <= 7)) || ((pH < R.pH) && (pH >= 7))) pH = (((pH - R.pH) / total_volume) * amount) + pH if(istype(my_atom, /obj/item/reagent_containers/)) From b8028242c00a87e2b329674a8a1b621f11564b84 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Fri, 28 Jun 2019 17:16:21 +0100 Subject: [PATCH 323/608] Compile fixes --- code/modules/reagents/chemistry/holder.dm | 2 +- modular_citadel/code/datums/status_effects/chems.dm | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 399854f244..ac238b4d15 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -683,7 +683,7 @@ if (chem_temp > C.ExplodeTemp) //go to explode proc fermiIsReacting = FALSE - SSblackbox.record_feedback("tally", "fermi_chem", 1, (P+" explosion")) + SSblackbox.record_feedback("tally", "fermi_chem", 1, (C+" explosions")) C.FermiExplode(src, my_atom, (reactedVol+targetVol), chem_temp, pH) STOP_PROCESSING(SSprocessing, src) return diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 59c48ca16b..f6abf22e3c 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -281,10 +281,11 @@ mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. resistanceTally /= 2 enthrallTally = 0 + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Enthralled to state 2") if(owner.lewd) to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") - SSblackbox.record_feedback("tally", "fermi_chem", 1, "Enthralled to state 2") else + to_chat(owner, "Your conciousness slips, as you feel more drawn to following [master].") else if (resistanceTally > 150) phase = -1 From a4edb0b69a3e745cf3764e94bf4b5ab0f0d59d87 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Fri, 28 Jun 2019 18:50:28 +0100 Subject: [PATCH 324/608] Trying alternative fix for pH. --- code/modules/reagents/chemistry/holder.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index ac238b4d15..675ea75198 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -935,8 +935,8 @@ pH = 7 //In practice this is really confusing and players feel like it randomly melts their beakers, but I'm not sure how else to handle it. We'll see how it goes and I can remove this if it confuses people. else if (ignore_pH == FALSE) - if (((pH > R.pH) && (pH <= 7)) || ((pH < R.pH) && (pH >= 7))) - pH = (((pH - R.pH) / total_volume) * amount) + pH + //if (((pH > R.pH) && (pH <= 7)) || ((pH < R.pH) && (pH >= 7))) + pH = (((pH - R.pH) / total_volume) * amount) + pH if(istype(my_atom, /obj/item/reagent_containers/)) var/obj/item/reagent_containers/RC = my_atom RC.pH_check()//checks beaker resilience) From b6309d5a312c4d1d976db7768e5dde69b042e971 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sat, 29 Jun 2019 02:47:32 +0100 Subject: [PATCH 325/608] Fixes explosion bug, tweaks hypo and fiddles pH. --- code/modules/reagents/chemistry/holder.dm | 6 ++-- code/modules/reagents/chemistry/reagents.dm | 3 +- .../reagents/reagent_containers/glass.dm | 12 +++---- .../reagents/chemistry/reagents/astrogen.dm | 14 ++++++++ .../chemistry/reagents/enlargement.dm | 33 +++++++++++++++++-- .../chemistry/reagents/fermi_reagents.dm | 1 + 6 files changed, 57 insertions(+), 12 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 675ea75198..4864470706 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -465,7 +465,7 @@ if (chem_temp > C.ExplodeTemp) //This is first to ensure explosions. var/datum/chemical_reaction/fermi/Ferm = selected_reaction fermiIsReacting = FALSE - SSblackbox.record_feedback("tally", "fermi_chem", 1, (Ferm+" explosion")) + SSblackbox.record_feedback("tally", "fermi_chem", 1, ("[Ferm] explosion")) Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH) return 0 @@ -666,7 +666,7 @@ if(P == R.id) if (R.purity < C.PurityMin)//If purity is below the min, blow it up. fermiIsReacting = FALSE - SSblackbox.record_feedback("tally", "fermi_chem", 1, (P+" explosion")) + SSblackbox.record_feedback("tally", "fermi_chem", 1, ("[P] explosion")) C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) STOP_PROCESSING(SSprocessing, src) return 0 @@ -683,7 +683,7 @@ if (chem_temp > C.ExplodeTemp) //go to explode proc fermiIsReacting = FALSE - SSblackbox.record_feedback("tally", "fermi_chem", 1, (C+" explosions")) + SSblackbox.record_feedback("tally", "fermi_chem", 1, ("[C] explosions")) C.FermiExplode(src, my_atom, (reactedVol+targetVol), chem_temp, pH) STOP_PROCESSING(SSprocessing, src) return diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index fe1bea503d..45c6069318 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -68,7 +68,8 @@ /datum/reagent/proc/on_mob_life(mob/living/carbon/M) current_cycle++ - holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. + if(holder) + holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. return // Called when this reagent is first added to a mob diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 3efd17b29b..014401b72c 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -6,7 +6,7 @@ reagent_flags = OPENCONTAINER spillable = TRUE resistance_flags = ACID_PROOF - container_HP = 2 + container_HP = 3 /obj/item/reagent_containers/glass/attack(mob/M, mob/user, obj/target) @@ -115,7 +115,7 @@ item_state = "beaker" materials = list(MAT_GLASS=500) beaker_weakness_bitflag = PH_WEAK - container_HP = 3 + container_HP = 5 /obj/item/reagent_containers/glass/beaker/Initialize() . = ..() @@ -167,7 +167,7 @@ volume = 100 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100) - container_HP = 4 + container_HP = 6 /obj/item/reagent_containers/glass/beaker/plastic name = "x-large beaker" @@ -227,7 +227,7 @@ volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300) - container_HP = 5 + container_HP = 8 /obj/item/reagent_containers/glass/beaker/cryoxadone list_reagents = list("cryoxadone" = 30) @@ -338,7 +338,7 @@ materials = list(MAT_GLASS=0) volume = 50 amount_per_transfer_from_this = 10 - container_HP = 1 + container_HP = 2 /obj/item/reagent_containers/glass/beaker/waterbottle/Initialize() beaker_weakness_bitflag |= TEMP_WEAK @@ -354,7 +354,7 @@ list_reagents = list("water" = 100) volume = 100 amount_per_transfer_from_this = 20 - container_HP = 1 + container_HP = 2 /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty list_reagents = list() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index e977987b68..2b50c5e132 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -11,6 +11,8 @@ There's afairly major catch regarding the death though. I'm not gonna say here, I'd like to point out from my calculations it'll take about 60-80 minutes to die this way too. Plenty of time to visit me and ask for some pills to quench your addiction. */ + + /datum/reagent/fermi/astral // Gives you the ability to astral project for a moment! name = "Astrogen" id = "astral" @@ -28,6 +30,15 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die InverseChemVal = 0.25 can_synth = FALSE +/datum/action/chem/astral + name = "Return to body" + var/mob/living/carbon/origin = null + var/mob/living/simple_animal/hostile/retaliate/ghost = null + +/datum/action/chem/astral/Trigger() + ghost.mind.transfer_to(origin) + qdel(src) + /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! M.alpha = 255 if(current_cycle == 0) @@ -48,6 +59,9 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die G.incorporeal_move = 1 G.alpha = 35 G.name = "[M]'s astral projection" + var/datum/action/chem/astral/AS = new(G) + AS.origin = M + AS.ghost = G M.mind.transfer_to(G) sleepytime = 15*volume SSblackbox.record_feedback("tally", "fermi_chem", 1, "Astral projections") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index dcd4169ac8..70cef57f0f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -157,10 +157,25 @@ B.update() ..() -/datum/reagent/fermi/BEsmaller/hypo +/datum/reagent/fermi/BEsmaller_hypo name = "Modesty milk" id = "BEsmaller_hypo" + color = "#E60584" + taste_description = "a milky ice cream like flavour." description = "A medicine used to treat organomegaly in a patient's breasts." + var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) + +/datum/reagent/fermi/BEsmaller_hypo/on_mob_life(mob/living/carbon/M) + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + if(!B) + return..() + if(B.cached_size > (sizeConv[M.dna.features["breasts_size"]]+0.1)) + B.cached_size = B.cached_size - 0.05 + B.update() + else if(B.cached_size < (sizeConv[M.dna.features["breasts_size"]])+0.1) + B.cached_size = B.cached_size + 0.05 + B.update() + ..() //////////////////////////////////////////////////////////////////////////////////////////////////// // PENIS ENLARGE @@ -294,7 +309,21 @@ P.update() ..() -/datum/reagent/fermi/PEsmaller/hypo +/datum/reagent/fermi/PEsmaller_hypo name = "Chastity draft" id = "PEsmaller_hypo" + color = "#888888" // This is greyish..? + taste_description = "chinese dragon powder" description = "A medicine used to treat organomegaly in a patient's penis." + +/datum/reagent/fermi/PEsmaller_hypo/on_mob_life(mob/living/carbon/M) + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") + if(!P) + return ..() + if(P.cached_length > (M.dna.features["cock_length"]+0.1)) + P.cached_length = P.cached_length - 0.1 + P.update() + else if(P.cached_length < (M.dna.features["cock_length"]+0.1)) + P.cached_length = P.cached_length + 0.1 + P.update() + ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 11626bf72f..929e0605e3 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -194,6 +194,7 @@ InverseChem = "nanite_b_goneTox" //At really impure vols, it just becomes 100% inverse taste_description = "what can only be described as licking a battery." pH = 9 + can_synth = FALSE /datum/reagent/fermi/nanite_b_gone/on_mob_life(mob/living/carbon/C) //var/component/nanites/N = M.GetComponent(/datum/component/nanites) From 44337c6a085703ceb221f66dfe2056d47cb066cd Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sat, 29 Jun 2019 03:16:54 +0100 Subject: [PATCH 326/608] Forgot to update lists when removing all sizes from GLOB. --- modular_citadel/code/datums/status_effects/chems.dm | 4 ++-- modular_citadel/code/modules/arousal/organs/breasts.dm | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index f6abf22e3c..160959fbc6 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -85,10 +85,10 @@ if((B.cached_size) < 16) switch(round(B.cached_size)) if(9) - if (GLOB.breasts_size_list[B.prev_size] != GLOB.breasts_size_list[B.size]) + if (B.breast_values[B.prev_size] != B.breast_values[B.size]) to_chat(o, "Your expansive chest has become a more managable size, liberating your movements.") if(10 to INFINITY) - if (GLOB.breasts_size_list[B.prev_size] != GLOB.breasts_size_list[B.size]) + if (B.breast_values[B.prev_size] != B.breast_values[B.size]) to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!") if(prob(1)) to_chat(owner, "Your back is feeling a little sore.") diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index d7c518d415..9602c8edad 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -100,12 +100,12 @@ owner.remove_status_effect(/datum/status_effect/chem/breast_enlarger) statuscheck = FALSE if(1 to 8) //If modest size - size = GLOB.breasts_size_list[round(cached_size)] + size = breast_values[round(cached_size)] if(owner.has_status_effect(/datum/status_effect/chem/breast_enlarger)) owner.remove_status_effect(/datum/status_effect/chem/breast_enlarger) statuscheck = FALSE if(9 to 15) //If massive - size = GLOB.breasts_size_list[round(cached_size)] + size = breast_values[round(cached_size)] if(!owner.has_status_effect(/datum/status_effect/chem/breast_enlarger)) owner.apply_status_effect(/datum/status_effect/chem/breast_enlarger) statuscheck = TRUE @@ -118,7 +118,7 @@ if(size == 0)//Bloody byond with it's counting from 1 size = "flat" if(isnum(prev_size)) - prev_size = GLOB.breasts_size_list[prev_size] + prev_size = breast_values[prev_size] if (breast_values[size] > breast_values[prev_size]) to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") var/mob/living/carbon/human/H = owner From f8a93a035fa040cddd8ddb92f63af0a8ddb5275d Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sat, 29 Jun 2019 07:32:00 +0100 Subject: [PATCH 327/608] Tweaking pH based on user feedback. --- code/modules/reagents/chemistry/holder.dm | 4 ++-- code/modules/reagents/reagent_containers.dm | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 4864470706..b3c2f13ad0 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -131,7 +131,7 @@ for(var/reagent in cached_reagents) pH = 7 var/datum/reagent/R = reagent - remove_reagent(R.id, R.volume * part) + remove_reagent(R.id, R.volume * part, ignore_pH = TRUE) update_total() handle_reactions() @@ -199,7 +199,7 @@ R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, T.purity, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. - remove_reagent(T.id, transfer_amount) + remove_reagent(T.id, transfer_amount, ignore_pH = TRUE) update_total() R.update_total() diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 52c40c2ae5..3aeabdfab4 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -153,6 +153,7 @@ for(var/mob/M in seen) to_chat(M, "[iconhtml] \The [src]'s melts from the temperature!") playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) + to_chat(M, "[iconhtml] Have you tried using glass or meta beakers for high temperature reactions? These are immune to temperature effects.") qdel(src) //melts glass beakers @@ -171,3 +172,4 @@ for(var/mob/M in seen) to_chat(M, "[iconhtml] \The [src]'s is damaged by the extreme pH and begins to deform!") playsound(get_turf(src), 'sound/FermiChem/bufferadd.ogg', 50, 1) + to_chat(M, "[iconhtml] Have you tried using plastic beakers (XL) or metabeakers for high pH reactions? These beakers are immune to pH effects.") From 7be7f052288bf1b30455d39f31aed3a064882ac3 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sat, 29 Jun 2019 08:50:20 +0100 Subject: [PATCH 328/608] Reduced pent, tweaked pH, tweaked MK, added beaker tally. --- .../reagents/chemistry/reagents/medicine_reagents.dm | 2 +- code/modules/reagents/reagent_containers.dm | 6 ++++-- code/modules/surgery/organs/vocal_cords.dm | 1 + .../code/modules/reagents/chemistry/reagents/MKUltra.dm | 8 ++++---- .../code/modules/reagents/chemistry/recipes/fermi.dm | 6 +++--- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index f767abd6f7..068680858b 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -509,7 +509,7 @@ reagent_state = LIQUID color = "#E6FFF0" metabolization_rate = 0.5 * REAGENTS_METABOLISM - pH = -1 //One of the best buffers, + pH = 1 //One of the best buffers, NEVERMIND! var/healtoxinlover = FALSE /datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/M) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 3aeabdfab4..48abfcb649 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -153,7 +153,8 @@ for(var/mob/M in seen) to_chat(M, "[iconhtml] \The [src]'s melts from the temperature!") playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) - to_chat(M, "[iconhtml] Have you tried using glass or meta beakers for high temperature reactions? These are immune to temperature effects.") + to_chat(M, "[iconhtml] Have you tried using glass or meta beakers for high temperature reactions? These are immune to temperature effects.") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times beakers have melted from temperature") qdel(src) //melts glass beakers @@ -167,9 +168,10 @@ for(var/mob/M in seen) to_chat(M, "[iconhtml] \The [src]'s melts from the extreme pH!") playsound(get_turf(src), 'sound/FermiChem/acidmelt.ogg', 80, 1) + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times beakers have melted from pH") qdel(src) else for(var/mob/M in seen) to_chat(M, "[iconhtml] \The [src]'s is damaged by the extreme pH and begins to deform!") playsound(get_turf(src), 'sound/FermiChem/bufferadd.ogg', 50, 1) - to_chat(M, "[iconhtml] Have you tried using plastic beakers (XL) or metabeakers for high pH reactions? These beakers are immune to pH effects.") + to_chat(M, "[iconhtml] Have you tried using plastic beakers (XL) or metabeakers for high pH reactions? These beakers are immune to pH effects.") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index cc734cb9a7..69d7fd5cbf 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1419,6 +1419,7 @@ if(message_admins || debug)//Do you want this in? message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") log_game("FERMICHEM: [key_name(user)] ckey: [user.key] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have spoken with a velvet voice") //SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) If this is on, it fills the thing up and OOFs the server return diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index e27efbff36..2eb0508537 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -320,9 +320,9 @@ Creating a chem with a low purity will make you permanently fall in love with so if(!love) return M.apply_status_effect(STATUS_EFFECT_INLOVE, love) - to_chat(M, "You develop overwhelmingly deep feelings for [love], your heart beginning to race as you look upon them with new eyes. You are determined to keep them safe above all other priorities.") - log_game("FERMICHEM: [M] ckey: [M.key] has temporarily fallen for [love] ckey: [love.key]") - SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have fallen in love") + to_chat(M, "You develop a sudden bond with [love][(M.lewd?", your heart beginning to race as you look upon them with new eyes.":".")] You are determined to keep them safe and feel drawn towards them.") + log_game("FERMICHEM: [M] ckey: [M.key] has temporarily bonded with [love] ckey: [love.key]") + SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have bonded") else if(get_dist(M, love) < 8) if(HAS_TRAIT(M, TRAIT_NYMPHO)) //Add this back when merged/updated. @@ -344,7 +344,7 @@ Creating a chem with a low purity will make you permanently fall in love with so SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") to_chat(M, "Your feelings for [love] suddenly vanish!") - log_game("FERMICHEM: [M] ckey: [M.key] is no longer in temp love") + log_game("FERMICHEM: [M] ckey: [M.key] is no longer in temp bond") ..() /datum/reagent/fermi/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 7792b6b1c9..b908297da9 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -232,15 +232,15 @@ mix_message = "the reaction gives off a burgundy plume of smoke!" //FermiChem vars: OptimalTempMin = 780 - OptimalTempMax = 800 - ExplodeTemp = 830 + OptimalTempMax = 820 + ExplodeTemp = 840 OptimalpHMin = 12 OptimalpHMax = 13 ReactpHLim = 2 //CatalystFact = 0 CurveSharpT = 0.5 CurveSharppH = 4 - ThermicConstant = 20 + ThermicConstant = 15 HIonRelease = 0.1 RateUpLim = 1 FermiChem = TRUE From e09f189895ef5ad4b5e72413c639b5d918779a76 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 30 Jun 2019 01:56:10 +0100 Subject: [PATCH 329/608] WELCOME TO PH'S HELL RIDE --- code/modules/reagents/chemistry/holder.dm | 3 ++- .../chemistry/machinery/chem_dispenser.dm | 2 ++ .../chemistry/machinery/chem_heater.dm | 1 + code/modules/surgery/organs/vocal_cords.dm | 12 ++++++++++- .../code/datums/status_effects/chems.dm | 6 +++--- .../reagents/chemistry/reagents/MKUltra.dm | 1 - .../reagents/chemistry/recipes/fermi.dm | 5 +++-- tgui/assets/tgui.js | 20 +++++++++---------- tgui/src/interfaces/chem_dispenser.ract | 1 + tgui/src/interfaces/chem_heater.ract | 2 ++ 10 files changed, 35 insertions(+), 18 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index b3c2f13ad0..770d8186d8 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -126,10 +126,11 @@ /datum/reagents/proc/remove_all(amount = 1) var/list/cached_reagents = reagent_list + if((total_volume - amount) <= 0)//Because this can result in 0, I don't want it to crash. + pH = 7 if(total_volume > 0) var/part = amount / total_volume for(var/reagent in cached_reagents) - pH = 7 var/datum/reagent/R = reagent remove_reagent(R.id, R.volume * part, ignore_pH = TRUE) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 8b18eb7805..4d1cc32564 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -189,10 +189,12 @@ data["beakerCurrentVolume"] = beakerCurrentVolume data["beakerMaxVolume"] = beaker.volume data["beakerTransferAmounts"] = beaker.possible_transfer_amounts + data["beakerCurrentpH"] = beaker.reagents.pH else data["beakerCurrentVolume"] = null data["beakerMaxVolume"] = null data["beakerTransferAmounts"] = null + data["beakerCurrentpH"] = null var/chemicals[0] var/recipes[0] diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index a17b1e8190..9ccb2fafcc 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -97,6 +97,7 @@ data["isBeakerLoaded"] = beaker ? 1 : 0 data["currentTemp"] = beaker ? beaker.reagents.chem_temp : null + data["currentpH"] = beaker ? beaker.reagents.pH : null data["beakerCurrentVolume"] = beaker ? beaker.reagents.total_volume : null data["beakerMaxVolume"] = beaker ? beaker.volume : null diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 69d7fd5cbf..9800c015d2 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -777,6 +777,7 @@ var/static/regex/custom_words = regex("new trigger|listen to me") var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|trance")//What a descriptive name! var/static/regex/custom_echo = regex("obsess|fills your mind|loop") + var/static/regex/instill_words = regex("feel|entice|overwhel") var/static/regex/recognise_words = regex("recognise me|did you miss me?") var/static/regex/objective_words = regex("new objective|obey this command|unable to resist|compulsed") var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die") @@ -1313,7 +1314,16 @@ user.SetStun(0) H.SetStun(0) - + //INSTILL + else if((findtext(message, objective_words))) + for(var/V in listeners) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) + if(E.phase == 3) + var/instill = stripped_input(user, "Instill an emotion in your [(user.lewd?"Your pet":"listener")].", MAX_MESSAGE_LEN) + var/customSpan = list("Notice", "Warning", "Hypnophrase", "Love", "Velvet") + to_chat(H, "[instill]") + //RECOGNISE else if((findtext(message, recognise_words))) for(var/V in listeners) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 160959fbc6..f84b301850 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -332,7 +332,7 @@ if(owner.lewd) to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken - if (mental_capacity >= 499 && (owner.getBrainLoss() <=20 || HAS_TRAIT(M, TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra")) + if (mental_capacity >= 499 && (owner.getBrainLoss() <=0 || HAS_TRAIT(M, TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra")) phase = 2 mental_capacity = 500 customTriggers = list() @@ -369,8 +369,8 @@ M.hallucination = max(0, M.hallucination - 5) M.stuttering = max(0, M.stuttering - 5) M.jitteriness = max(0, M.jitteriness - 5) - if(owner.getBrainLoss() >=50) - owner.adjustBrainLoss(-0.1) + if(owner.getBrainLoss() >=20) + owner.adjustBrainLoss(-0.2) if(withdrawal == TRUE) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 2eb0508537..351167a865 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -250,7 +250,6 @@ Creating a chem with a low purity will make you permanently fall in love with so return else E.enthrallTally += 1 - M.adjustBrainLoss(0.1)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it. ..() /datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I made it so the creator is set to gain the status for someone random. diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index b908297da9..d3a1f7b401 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -103,8 +103,9 @@ name = "Synthetic-derived growth factor" id = "SDGF" results = list("SDGF" = 0.3) - required_reagents = list("stable_plasma" = 0.5, "slimejelly" = 0.5, "uranium" = 0.5, "synthflesh" = 0.5, "blood" = 0.5) + required_reagents = list("stable_plasma" = 0.15, "slimejelly" = 0.15, "uranium" = 0.15, "synthflesh" = 0.15, "blood" = 0.15) mix_message = "the reaction gives off a blorble!" + required_temp = 1 //FermiChem vars: OptimalTempMin = 600 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 630 // Upper end for above @@ -361,7 +362,7 @@ results = list("nanite_b_gone" = 4) required_reagents = list("synthflesh" = 1, "uranium" = 1, "iron" = 1, "salglu_solution" = 1) mix_message = "the reaction gurgles, encapsulating the reagents in flesh before the emp can be set off." - required_temp = 499//To force fermireactions before EMP. + required_temp = 450//To force fermireactions before EMP. //FermiChem vars: OptimalTempMin = 500 OptimalTempMax = 600 diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index 2eef691676..bbc64eee4f 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -9,13 +9,13 @@ name:"css",extend:function(t,e,n){if(n.css){var a=Up++,r=n.noCssTransform?n.css: return t.replace(/-([a-zA-Z])/g,function(t,e){return e.toUpperCase()})};Xi?(uf={},cf=co("div").style,pf=function(t){var e,n,a;if(t=mf(t),!uf[t])if(void 0!==cf[t])uf[t]=t;else for(a=t.charAt(0).toUpperCase()+t.substring(1),e=ro.length;e--;)if(n=ro[e],void 0!==cf[n+a]){uf[t]=n+a;break}return uf[t]}):pf=null;var gf,vf,bf=pf;Xi?(vf=window.getComputedStyle||Po.getComputedStyle,gf=function(t){var e,n,a,r,o;if(e=vf(this.node),"string"==typeof t)return o=e[bf(t)],"0px"===o&&(o=0),o;if(!i(t))throw Error("Transition$getStyle must be passed a string, or an array of strings representing CSS properties");for(n={},a=t.length;a--;)r=t[a],o=e[bf(r)],"0px"===o&&(o=0),n[r]=o;return n}):gf=null;var yf=gf,_f=function(t,e){var n;if("string"==typeof t)this.node.style[bf(t)]=e;else for(n in t)t.hasOwnProperty(n)&&(this.node.style[bf(n)]=t[n]);return this},xf=function(t){var e;this.duration=t.duration,this.step=t.step,this.complete=t.complete,"string"==typeof t.easing?(e=t.root.easing[t.easing],e||(g(Io(t.easing,"easing")),e=qa)):e="function"==typeof t.easing?t.easing:qa,this.easing=e,this.start=ns(),this.end=this.start+this.duration,this.running=!0,xs.add(this)};xf.prototype={tick:function(t){var e,n;return this.running?t>this.end?(this.step&&this.step(1),this.complete&&this.complete(1),!1):(e=t-this.start,n=this.easing(e/this.duration),this.step&&this.step(n),!0):!1},stop:function(){this.abort&&this.abort(),this.running=!1}};var wf,kf,Sf,Ef,Cf,Pf,Af,Of,Tf=xf,Rf=RegExp("^-(?:"+ro.join("|")+")-"),Mf=function(t){return t.replace(Rf,"")},Lf=RegExp("^(?:"+ro.join("|")+")([A-Z])"),jf=function(t){var e;return t?(Lf.test(t)&&(t="-"+t),e=t.replace(/[A-Z]/g,function(t){return"-"+t.toLowerCase()})):""},Df={},Nf={};Xi?(kf=co("div").style,function(){void 0!==kf.transition?(Sf="transition",Ef="transitionend",Cf=!0):void 0!==kf.webkitTransition?(Sf="webkitTransition",Ef="webkitTransitionEnd",Cf=!0):Cf=!1}(),Sf&&(Pf=Sf+"Duration",Af=Sf+"Property",Of=Sf+"TimingFunction"),wf=function(t,e,n,a,r){setTimeout(function(){var i,o,s,p,u;p=function(){o&&s&&(t.root.fire(t.name+":end",t.node,t.isIntro),r())},i=(t.node.namespaceURI||"")+t.node.tagName,t.node.style[Af]=a.map(bf).map(jf).join(","),t.node.style[Of]=jf(n.easing||"linear"),t.node.style[Pf]=n.duration/1e3+"s",u=function(e){var n;n=a.indexOf(mf(Mf(e.propertyName))),-1!==n&&a.splice(n,1),a.length||(t.node.removeEventListener(Ef,u,!1),s=!0,p())},t.node.addEventListener(Ef,u,!1),setTimeout(function(){for(var r,c,l,d,f,h=a.length,g=[];h--;)d=a[h],r=i+d,Cf&&!Nf[r]&&(t.node.style[bf(d)]=e[d],Df[r]||(c=t.getStyle(d),Df[r]=t.getStyle(d)!=e[d],Nf[r]=!Df[r],Nf[r]&&(t.node.style[bf(d)]=c))),(!Cf||Nf[r])&&(void 0===c&&(c=t.getStyle(d)),l=a.indexOf(d),-1===l?m("Something very strange happened with transitions. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!",{node:t.node}):a.splice(l,1),f=/[^\d]*$/.exec(e[d])[0],g.push({name:bf(d),interpolator:qo(parseFloat(c),parseFloat(e[d])),suffix:f}));g.length?new Tf({root:t.root,duration:n.duration,easing:mf(n.easing||""),step:function(e){var n,a;for(a=g.length;a--;)n=g[a],t.node.style[n.name]=n.interpolator(e)+n.suffix},complete:function(){o=!0,p()}}):o=!0,a.length||(t.node.removeEventListener(Ef,u,!1),s=!0,p())},0)},n.delay||0)}):wf=null;var Ff,If,Bf,qf,Uf,Vf=wf;if("undefined"!=typeof document){if(Ff="hidden",Uf={},Ff in document)Bf="";else for(qf=ro.length;qf--;)If=ro[qf],Ff=If+"Hidden",Ff in document&&(Bf=If);void 0!==Bf?(document.addEventListener(Bf+"visibilitychange",Ua),Ua()):("onfocusout"in document?(document.addEventListener("focusout",Va),document.addEventListener("focusin",Ga)):(window.addEventListener("pagehide",Va),window.addEventListener("blur",Va),window.addEventListener("pageshow",Ga),window.addEventListener("focus",Ga)),Uf.hidden=!1)}var Gf,zf,Wf,Hf=Uf;Xi?(zf=window.getComputedStyle||Po.getComputedStyle,Gf=function(t,e,n){var a,r=this;if(4===arguments.length)throw Error("t.animateStyle() returns a promise - use .then() instead of passing a callback");if(Hf.hidden)return this.setStyle(t,e),Wf||(Wf=us.resolve());"string"==typeof t?(a={},a[t]=e):(a=t,n=e),n||(g('The "%s" transition does not supply an options object to `t.animateStyle()`. This will break in a future version of Ractive. For more info see https://github.com/RactiveJS/Ractive/issues/340',this.name),n=this);var i=new us(function(t){var e,i,o,s,p,u,c;if(!n.duration)return r.setStyle(a),void t();for(e=Object.keys(a),i=[],o=zf(r.node),p={},u=e.length;u--;)c=e[u],s=o[bf(c)],"0px"===s&&(s=0),s!=a[c]&&(i.push(c),r.node.style[bf(c)]=s);return i.length?void Vf(r,a,n,i,t):void t()});return i}):Gf=null;var Kf=Gf,Qf=function(t,e){return"number"==typeof t?t={duration:t}:"string"==typeof t?t="slow"===t?{duration:600}:"fast"===t?{duration:200}:{duration:400}:t||(t={}),r({},t,e)},Yf=za,$f=function(t,e,n){this.init(t,e,n)};$f.prototype={init:hf,start:Yf,getStyle:yf,setStyle:_f,animateStyle:Kf,processParams:Qf};var Jf,Xf,Zf=$f,th=Ha;Jf=function(){var t=this.node,e=this.fragment.toString(!1);if(window&&window.appearsToBeIELessEqual8&&(t.type="text/css"),t.styleSheet)t.styleSheet.cssText=e;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}},Xf=function(){this.node.type&&"text/javascript"!==this.node.type||m("Script tag was updated. This does not cause the code to be re-evaluated!",{ractive:this.root}),this.node.text=this.fragment.toString(!1)};var eh=function(){var t,e;return this.template.y?"":(t="<"+this.template.e,t+=this.attributes.map(Xa).join("")+this.conditionalAttributes.map(Xa).join(""),"option"===this.name&&$a(this)&&(t+=" selected"),"input"===this.name&&Ja(this)&&(t+=" checked"),t+=">","textarea"===this.name&&void 0!==this.getAttribute("value")?t+=Se(this.getAttribute("value")):void 0!==this.getAttribute("contenteditable")&&(t+=this.getAttribute("value")||""),this.fragment&&(e="script"!==this.name&&"style"!==this.name,t+=this.fragment.toString(e)),ic.test(this.template.e)||(t+=""),t)},nh=Za,ah=tr,rh=function(t){this.init(t)};rh.prototype={bubble:Tl,detach:Rl,find:Ml,findAll:Ll,findAllComponents:jl,findComponent:Dl,findNextNode:Nl,firstNode:Fl,getAttribute:Il,init:df,rebind:ff,render:th,toString:eh,unbind:nh,unrender:ah};var ih=rh,oh=/^\s*$/,sh=/^\s*/,ph=function(t){var e,n,a,r;return e=t.split("\n"),n=e[0],void 0!==n&&oh.test(n)&&e.shift(),a=D(e),void 0!==a&&oh.test(a)&&e.pop(),r=e.reduce(nr,null),r&&(t=e.map(function(t){return t.replace(r,"")}).join("\n")),t},uh=ar,ch=function(t,e){var n;return e?n=t.split("\n").map(function(t,n){return n?e+t:t}).join("\n"):t},lh='Could not find template for partial "%s"',dh=function(t){var e,n;e=this.parentFragment=t.parentFragment,this.root=e.root,this.type=Au,this.index=t.index,this.name=t.template.r,this.rendered=!1,this.fragment=this.fragmentToRender=this.fragmentToUnrender=null,Gc.init(this,t),this.keypath||((n=uh(this.root,this.name,e))?(_c.call(this),this.isNamed=!0,this.setTemplate(n)):g(lh,this.name))};dh.prototype={bubble:function(){this.parentFragment.bubble()},detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},firstNode:function(){return this.fragment.firstNode()},findNextNode:function(){return this.parentFragment.findNextNode(this)},getPartialName:function(){return this.isNamed&&this.name?this.name:void 0===this.value?this.name:this.value},getValue:function(){return this.fragment.getValue()},rebind:function(t,e){this.isNamed||Vc.call(this,t,e),this.fragment&&this.fragment.rebind(t,e)},render:function(){return this.docFrag=document.createDocumentFragment(),this.update(),this.rendered=!0,this.docFrag},resolve:Gc.resolve,setValue:function(t){var e;(void 0===t||t!==this.value)&&(void 0!==t&&(e=uh(this.root,""+t,this.parentFragment)),!e&&this.name&&(e=uh(this.root,this.name,this.parentFragment))&&(_c.call(this),this.isNamed=!0),e||g(lh,this.name,{ractive:this.root}),this.value=t,this.setTemplate(e||[]),this.bubble(),this.rendered&&bs.addView(this))},setTemplate:function(t){this.fragment&&(this.fragment.unbind(),this.rendered&&(this.fragmentToUnrender=this.fragment)),this.fragment=new rg({template:t,root:this.root,owner:this,pElement:this.parentFragment.pElement}),this.fragmentToRender=this.fragment},toString:function(t){var e,n,a,r;return e=this.fragment.toString(t),n=this.parentFragment.items[this.index-1],n&&n.type===ku?(a=n.text.split("\n").pop(),(r=/^\s+$/.exec(a))?ch(e,r[0]):e):e},unbind:function(){this.isNamed||_c.call(this),this.fragment&&this.fragment.unbind()},unrender:function(t){this.rendered&&(this.fragment&&this.fragment.unrender(t),this.rendered=!1)},update:function(){var t,e;this.fragmentToUnrender&&(this.fragmentToUnrender.unrender(!0),this.fragmentToUnrender=null),this.fragmentToRender&&(this.docFrag.appendChild(this.fragmentToRender.render()),this.fragmentToRender=null),this.rendered&&(t=this.parentFragment.getNode(),e=this.parentFragment.findNextNode(this),t.insertBefore(this.docFrag,e))}};var fh,hh,mh,gh=dh,vh=pr,bh=ur,yh=new is("detach"),_h=cr,xh=lr,wh=dr,kh=fr,Sh=hr,Eh=mr,Ch=function(t,e,n,a){var r=t.root,i=t.keypath;a?r.viewmodel.smartUpdate(i,e,a):r.viewmodel.mark(i)},Ph=[],Ah=["pop","push","reverse","shift","sort","splice","unshift"];Ah.forEach(function(t){var e=function(){for(var e=arguments.length,n=Array(e),a=0;e>a;a++)n[a]=arguments[a];var r,i,o,s;for(r=bp(this,t,n),i=Array.prototype[t].apply(this,arguments),bs.start(),this._ractive.setting=!0,s=this._ractive.wrappers.length;s--;)o=this._ractive.wrappers[s],bs.addRactive(o.root),Ch(o,this,t,r);return bs.end(),this._ractive.setting=!1,i};Eo(Ph,t,{value:e})}),fh={},fh.__proto__?(hh=function(t){t.__proto__=Ph},mh=function(t){t.__proto__=Array.prototype}):(hh=function(t){var e,n;for(e=Ah.length;e--;)n=Ah[e],Eo(t,n,{value:Ph[n],configurable:!0})},mh=function(t){var e;for(e=Ah.length;e--;)delete t[Ah[e]]}),hh.unpatch=mh;var Oh,Th,Rh,Mh=hh;Oh={filter:function(t){return i(t)&&(!t._ractive||!t._ractive.setting)},wrap:function(t,e,n){return new Th(t,e,n)}},Th=function(t,e,n){this.root=t,this.value=e,this.keypath=S(n),e._ractive||(Eo(e,"_ractive",{value:{wrappers:[],instances:[],setting:!1},configurable:!0}),Mh(e)),e._ractive.instances[t._guid]||(e._ractive.instances[t._guid]=0,e._ractive.instances.push(t)),e._ractive.instances[t._guid]+=1,e._ractive.wrappers.push(this)},Th.prototype={get:function(){return this.value},teardown:function(){var t,e,n,a,r;if(t=this.value,e=t._ractive,n=e.wrappers,a=e.instances,e.setting)return!1;if(r=n.indexOf(this),-1===r)throw Error(Rh);if(n.splice(r,1),n.length){if(a[this.root._guid]-=1,!a[this.root._guid]){if(r=a.indexOf(this.root),-1===r)throw Error(Rh);a.splice(r,1)}}else delete t._ractive,Mh.unpatch(this.value)}},Rh="Something went wrong in a rather interesting way";var Lh,jh,Dh=Oh,Nh=/^\s*[0-9]+\s*$/,Fh=function(t){return Nh.test(t)?[]:{}};try{Object.defineProperty({},"test",{value:0}),Lh={filter:function(t,e,n){var a,r;return e?(e=S(e),(a=n.viewmodel.wrapped[e.parent.str])&&!a.magic?!1:(r=n.viewmodel.get(e.parent),i(r)&&/^[0-9]+$/.test(e.lastKey)?!1:r&&("object"==typeof r||"function"==typeof r))):!1},wrap:function(t,e,n){return new jh(t,e,n)}},jh=function(t,e,n){var a,r,i;return n=S(n),this.magic=!0,this.ractive=t,this.keypath=n,this.value=e,this.prop=n.lastKey,a=n.parent,this.obj=a.isRoot?t.viewmodel.data:t.viewmodel.get(a),r=this.originalDescriptor=Object.getOwnPropertyDescriptor(this.obj,this.prop),r&&r.set&&(i=r.set._ractiveWrappers)?void(-1===i.indexOf(this)&&i.push(this)):void gr(this,e,r)},jh.prototype={get:function(){return this.value},reset:function(t){return this.updating?void 0:(this.updating=!0,this.obj[this.prop]=t,bs.addRactive(this.ractive),this.ractive.viewmodel.mark(this.keypath,{keepExistingWrapper:!0}),this.updating=!1,!0)},set:function(t,e){this.updating||(this.obj[this.prop]||(this.updating=!0,this.obj[this.prop]=Fh(t),this.updating=!1),this.obj[this.prop][t]=e)},teardown:function(){var t,e,n,a,r;return this.updating?!1:(t=Object.getOwnPropertyDescriptor(this.obj,this.prop),e=t&&t.set,void(e&&(a=e._ractiveWrappers,r=a.indexOf(this),-1!==r&&a.splice(r,1),a.length||(n=this.obj[this.prop],Object.defineProperty(this.obj,this.prop,this.originalDescriptor||{writable:!0,enumerable:!0,configurable:!0}),this.obj[this.prop]=n))))}}}catch(Ao){Lh=!1}var Ih,Bh,qh=Lh;qh&&(Ih={filter:function(t,e,n){return qh.filter(t,e,n)&&Dh.filter(t)},wrap:function(t,e,n){return new Bh(t,e,n)}},Bh=function(t,e,n){this.value=e,this.magic=!0,this.magicWrapper=qh.wrap(t,e,n),this.arrayWrapper=Dh.wrap(t,e,n)},Bh.prototype={get:function(){return this.value},teardown:function(){this.arrayWrapper.teardown(),this.magicWrapper.teardown()},reset:function(t){return this.magicWrapper.reset(t)}});var Uh=Ih,Vh=vr,Gh={},zh=_r,Wh=xr,Hh=Sr,Kh=Or,Qh=Tr,Yh=function(t,e){this.computation=t,this.viewmodel=t.viewmodel,this.ref=e,this.root=this.viewmodel.ractive,this.parentFragment=this.root.component&&this.root.component.parentFragment};Yh.prototype={resolve:function(t){this.computation.softDeps.push(t),this.computation.unresolvedDeps[t.str]=null,this.viewmodel.register(t,this.computation,"computed")}};var $h=Yh,Jh=function(t,e){this.key=t,this.getter=e.getter,this.setter=e.setter,this.hardDeps=e.deps||[],this.softDeps=[],this.unresolvedDeps={},this.depValues={},this._dirty=this._firstRun=!0};Jh.prototype={constructor:Jh,init:function(t){var e,n=this;this.viewmodel=t,this.bypass=!0,e=t.get(this.key),t.clearCache(this.key.str),this.bypass=!1,this.setter&&void 0!==e&&this.set(e),this.hardDeps&&this.hardDeps.forEach(function(e){return t.register(e,n,"computed")})},invalidate:function(){this._dirty=!0},get:function(){var t,e,n=this,a=!1;if(this.getting){var r="The "+this.key.str+" computation indirectly called itself. This probably indicates a bug in the computation. It is commonly caused by `array.sort(...)` - if that's the case, clone the array first with `array.slice().sort(...)`";return h(r),this.value}if(this.getting=!0,this._dirty){if(this._firstRun||!this.hardDeps.length&&!this.softDeps.length?a=!0:[this.hardDeps,this.softDeps].forEach(function(t){var e,r,i;if(!a)for(i=t.length;i--;)if(e=t[i],r=n.viewmodel.get(e),!s(r,n.depValues[e.str]))return n.depValues[e.str]=r,void(a=!0)}),a){this.viewmodel.capture();try{this.value=this.getter()}catch(i){m('Failed to compute "%s"',this.key.str),d(i.stack||i),this.value=void 0}t=this.viewmodel.release(),e=this.updateDependencies(t),e&&[this.hardDeps,this.softDeps].forEach(function(t){t.forEach(function(t){n.depValues[t.str]=n.viewmodel.get(t)})})}this._dirty=!1}return this.getting=this._firstRun=!1,this.value},set:function(t){if(this.setting)return void(this.value=t);if(!this.setter)throw Error("Computed properties without setters are read-only. (This may change in a future version of Ractive!)");this.setter(t)},updateDependencies:function(t){var e,n,a,r,i;for(n=this.softDeps,e=n.length;e--;)a=n[e],-1===t.indexOf(a)&&(r=!0,this.viewmodel.unregister(a,this,"computed"));for(e=t.length;e--;)a=t[e],-1!==n.indexOf(a)||this.hardDeps&&-1!==this.hardDeps.indexOf(a)||(r=!0,Rr(this.viewmodel,a)&&!this.unresolvedDeps[a.str]?(i=new $h(this,a.str),t.splice(e,1),this.unresolvedDeps[a.str]=i,bs.addUnresolved(i)):this.viewmodel.register(a,this,"computed"));return r&&(this.softDeps=t.slice()),r}};var Xh=Jh,Zh=Mr,tm={FAILED_LOOKUP:!0},em=Lr,nm={},am=Dr,rm=Nr,im=function(t,e){this.localKey=t,this.keypath=e.keypath,this.origin=e.origin,this.deps=[],this.unresolved=[],this.resolved=!1};im.prototype={forceResolution:function(){this.keypath=this.localKey,this.setup()},get:function(t,e){return this.resolved?this.origin.get(this.map(t),e):void 0},getValue:function(){return this.keypath?this.origin.get(this.keypath):void 0},initViewmodel:function(t){this.local=t,this.setup()},map:function(t){return void 0===typeof this.keypath?this.localKey:t.replace(this.localKey,this.keypath)},register:function(t,e,n){this.deps.push({keypath:t,dep:e,group:n}),this.resolved&&this.origin.register(this.map(t),e,n)},resolve:function(t){void 0!==this.keypath&&this.unbind(!0),this.keypath=t,this.setup()},set:function(t,e){this.resolved||this.forceResolution(),this.origin.set(this.map(t),e)},setup:function(){var t=this;void 0!==this.keypath&&(this.resolved=!0,this.deps.length&&(this.deps.forEach(function(e){var n=t.map(e.keypath);if(t.origin.register(n,e.dep,e.group),e.dep.setValue)e.dep.setValue(t.origin.get(n));else{if(!e.dep.invalidate)throw Error("An unexpected error occurred. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");e.dep.invalidate()}}),this.origin.mark(this.keypath)))},setValue:function(t){if(!this.keypath)throw Error("Mapping does not have keypath, cannot set value. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");this.origin.set(this.keypath,t)},unbind:function(t){var e=this;t||delete this.local.mappings[this.localKey],this.resolved&&(this.deps.forEach(function(t){e.origin.unregister(e.map(t.keypath),t.dep,t.group)}),this.tracker&&this.origin.unregister(this.keypath,this.tracker))},unregister:function(t,e,n){var a,r;if(this.resolved){for(a=this.deps,r=a.length;r--;)if(a[r].dep===e){a.splice(r,1);break}this.origin.unregister(this.map(t),e,n)}}};var om=Fr,sm=function(t,e){var n,a,r,i;return n={},a=0,r=t.map(function(t,r){var o,s,p;s=a,p=e.length;do{if(o=e.indexOf(t,s),-1===o)return i=!0,-1;s=o+1}while(n[o]&&p>s);return o===a&&(a+=1),o!==r&&(i=!0),n[o]=!0,o})},pm=Ir,um={},cm=Ur,lm=Gr,dm=zr,fm=Wr,hm=Kr,mm={implicit:!0},gm={noCascade:!0},vm=Yr,bm=$r,ym=function(t){var e,n,a=t.adapt,r=t.data,i=t.ractive,o=t.computed,s=t.mappings;this.ractive=i,this.adaptors=a,this.onchange=t.onchange,this.cache={},this.cacheMap=So(null),this.deps={computed:So(null),"default":So(null)},this.depsMap={computed:So(null),"default":So(null)},this.patternObservers=[],this.specials=So(null),this.wrapped=So(null),this.computations=So(null),this.captureGroups=[],this.unresolvedImplicitDependencies=[],this.changes=[],this.implicitChanges={},this.noCascade={},this.data=r,this.mappings=So(null);for(e in s)this.map(S(e),s[e]);if(r)for(e in r)(n=this.mappings[e])&&void 0===n.getValue()&&n.setValue(r[e]);for(e in o)s&&e in s&&l("Cannot map to a computed property ('%s')",e),this.compute(S(e),o[e]);this.ready=!0};ym.prototype={adapt:Vh,applyChanges:Hh,capture:Kh,clearCache:Qh,compute:Zh,get:em,init:am,map:rm,mark:om,merge:pm,register:cm,release:lm,reset:dm,set:fm,smartUpdate:hm,teardown:vm,unregister:bm};var _m=ym;Xr.prototype={constructor:Xr,begin:function(t){this.inProcess[t._guid]=!0},end:function(t){var e=t.parent;e&&this.inProcess[e._guid]?Zr(this.queue,e).push(t):ti(this,t),delete this.inProcess[t._guid]}};var xm=Xr,wm=ei,km=/\$\{([^\}]+)\}/g,Sm=new is("construct"),Em=new is("config"),Cm=new xm("init"),Pm=0,Am=["adaptors","components","decorators","easing","events","interpolators","partials","transitions"],Om=ii,Tm=ci;ci.prototype={bubble:function(){this.dirty||(this.dirty=!0,bs.addView(this))},update:function(){this.callback(this.fragment.getValue()),this.dirty=!1},rebind:function(t,e){this.fragment.rebind(t,e)},unbind:function(){this.fragment.unbind()}};var Rm=function(t,e,n,r,o){var s,p,u,c,l,d,f={},h={},g={},v=[];for(p=t.parentFragment,u=t.root,o=o||{},a(f,o),o.content=r||[],f[""]=o.content,e.defaults.el&&m("The <%s/> component has a default `el` property; it has been disregarded",t.name),c=p;c;){if(c.owner.type===Mu){l=c.owner.container;break}c=c.parent}return n&&Object.keys(n).forEach(function(e){var a,r,o=n[e];if("string"==typeof o)a=dc(o),h[e]=a?a.value:o;else if(0===o)h[e]=!0;else{if(!i(o))throw Error("erm wut");di(o)?(g[e]={origin:t.root.viewmodel,keypath:void 0},r=li(t,o[0],function(t){t.isSpecial?d?s.set(e,t.value):(h[e]=t.value,delete g[e]):d?s.viewmodel.mappings[e].resolve(t):g[e].keypath=t})):r=new Tm(t,o,function(t){d?s.set(e,t):h[e]=t}),v.push(r)}}),s=So(e.prototype),Om(s,{el:null,append:!0,data:h,partials:o,magic:u.magic||e.defaults.magic,modifyArrays:u.modifyArrays,adapt:u.adapt},{parent:u,component:t,container:l,mappings:g,inlinePartials:f,cssIds:p.cssIds}),d=!0,t.resolvers=v,s},Mm=fi,Lm=function(t){var e,n;for(e=t.root;e;)(n=e._liveComponentQueries["_"+t.name])&&n.push(t.instance),e=e.parent},jm=mi,Dm=gi,Nm=vi,Fm=bi,Im=yi,Bm=new is("teardown"),qm=xi,Um=function(t,e){this.init(t,e)};Um.prototype={detach:bh,find:_h,findAll:xh,findAllComponents:wh,findComponent:kh,findNextNode:Sh,firstNode:Eh,init:jm,rebind:Dm,render:Nm,toString:Fm,unbind:Im,unrender:qm};var Vm=Um,Gm=function(t){this.type=Ou,this.value=t.template.c};Gm.prototype={detach:vc,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createComment(this.value)),this.node},toString:function(){return""},unrender:function(t){t&&this.node.parentNode.removeChild(this.node)}};var zm=Gm,Wm=function(t){var e,n;this.type=Mu,this.container=e=t.parentFragment.root,this.component=n=e.component,this.container=e,this.containerFragment=t.parentFragment,this.parentFragment=n.parentFragment;var a=this.name=t.template.n||"",r=e._inlinePartials[a];r||(m('Could not find template for partial "'+a+'"',{ractive:t.root}),r=[]),this.fragment=new rg({owner:this,root:e.parent,template:r,pElement:this.containerFragment.pElement}),i(n.yielders[a])?n.yielders[a].push(this):n.yielders[a]=[this],bs.scheduleTask(function(){if(n.yielders[a].length>1)throw Error("A component template can only have one {{yield"+(a?" "+a:"")+"}} declaration at a time")})};Wm.prototype={detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},findNextNode:function(){return this.containerFragment.findNextNode(this)},firstNode:function(){return this.fragment.firstNode()},getValue:function(t){return this.fragment.getValue(t)},render:function(){return this.fragment.render()},unbind:function(){this.fragment.unbind()},unrender:function(t){this.fragment.unrender(t),N(this.component.yielders[this.name],this)},rebind:function(t,e){this.fragment.rebind(t,e)},toString:function(){return""+this.fragment}};var Hm=Wm,Km=function(t){this.declaration=t.template.a};Km.prototype={init:ko,render:ko,unrender:ko,teardown:ko,toString:function(){return""}};var Qm=Km,Ym=wi,$m=Si,Jm=Ei,Xm=Ci,Zm=Oi,tg=Ri,eg=function(t){this.init(t)};eg.prototype={bubble:cu,detach:lu,find:du,findAll:fu,findAllComponents:hu,findComponent:mu,findNextNode:gu,firstNode:vu,getArgsList:hc,getNode:mc,getValue:gc,init:Ym,rebind:$m,registerIndexRef:function(t){var e=this.registeredIndexRefs;-1===e.indexOf(t)&&e.push(t)},render:Jm,toString:Xm,unbind:Zm,unregisterIndexRef:function(t){var e=this.registeredIndexRefs;e.splice(e.indexOf(t),1)},unrender:tg};var ng,ag,rg=eg,ig=Mi,og=["template","partials","components","decorators","events"],sg=new is("reset"),pg=function(t,e){function n(e,a,r){r&&r.partials[t]||e.forEach(function(e){e.type===Au&&e.getPartialName()===t&&a.push(e),e.fragment&&n(e.fragment.items,a,r),i(e.fragments)?n(e.fragments,a,r):i(e.items)?n(e.items,a,r):e.type===Ru&&e.instance&&n(e.instance.fragment.items,a,e.instance),e.type===Pu&&(i(e.attributes)&&n(e.attributes,a,r),i(e.conditionalAttributes)&&n(e.conditionalAttributes,a,r))})}var a,r=[];return n(this.fragment.items,r),this.partials[t]=e,a=bs.start(this,!0),r.forEach(function(e){e.value=void 0,e.setValue(t)}),bs.end(),a},ug=Li,cg=_p("reverse"),lg=ji,dg=_p("shift"),fg=_p("sort"),hg=_p("splice"),mg=Ni,gg=Fi,vg=new is("teardown"),bg=Bi,yg=qi,_g=Ui,xg=new is("unrender"),wg=_p("unshift"),kg=Vi,Sg=new is("update"),Eg=Gi,Cg={add:Zo,animate:Ss,detach:Cs,find:As,findAll:Fs,findAllComponents:Is,findComponent:Bs,findContainer:qs,findParent:Us,fire:Ws,get:Hs,insert:Qs,merge:$s,observe:lp,observeOnce:dp,off:mp,on:gp,once:vp,pop:xp,push:wp,render:Tp,reset:ig,resetPartial:pg,resetTemplate:ug,reverse:cg,set:lg,shift:dg,sort:fg,splice:hg,subtract:mg,teardown:gg,toggle:bg,toHTML:yg,toHtml:yg,unrender:_g,unshift:wg,update:kg,updateModel:Eg},Pg=function(t,e,n){return n||Wi(t,e)?function(){var n,a="_super"in this,r=this._super;return this._super=e,n=t.apply(this,arguments),a&&(this._super=r),n}:t},Ag=Hi,Og=$i,Tg=function(t){var e,n,a={};return t&&(e=t._ractive)?(a.ractive=e.root,a.keypath=e.keypath.str,a.index={},(n=Oc(e.proxy.parentFragment))&&(a.index=Oc.resolve(n)),a):a};ng=function(t){return this instanceof ng?void Om(this,t):new ng(t)},ag={DEBUG:{writable:!0,value:!0},DEBUG_PROMISES:{writable:!0,value:!0},extend:{value:Og},getNodeInfo:{value:Tg},parse:{value:Hp},Promise:{value:us},svg:{value:ao},magic:{value:eo},VERSION:{value:"0.7.3"},adaptors:{writable:!0,value:{}},components:{writable:!0,value:{}},decorators:{writable:!0,value:{}},easing:{writable:!0,value:po},events:{writable:!0,value:{}},interpolators:{writable:!0,value:Vo},partials:{writable:!0,value:{}},transitions:{writable:!0,value:{}}},Co(ng,ag),ng.prototype=a(Cg,so),ng.prototype.constructor=ng,ng.defaults=ng.prototype;var Rg="function";if(typeof Date.now!==Rg||typeof String.prototype.trim!==Rg||typeof Object.keys!==Rg||typeof Array.prototype.indexOf!==Rg||typeof Array.prototype.forEach!==Rg||typeof Array.prototype.map!==Rg||typeof Array.prototype.filter!==Rg||"undefined"!=typeof window&&typeof window.addEventListener!==Rg)throw Error("It looks like you're attempting to use Ractive.js in an older browser. You'll need to use one of the 'legacy builds' in order to continue - see http://docs.ractivejs.org/latest/legacy-builds for more information.");var Mg=ng;return Mg})},{}],342:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.observe("value",function(e,n,a){var r=t.get(),i=r.min,o=r.max,s=Math.clamp(i,o,e);t.animate("percentage",Math.round((s-i)/(o-i)*100))})}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,305],t:7,e:"div",a:{"class":"bar"},f:[{p:[14,3,326],t:7,e:"div",a:{"class":["barFill ",{t:2,r:"state",p:[14,23,346]}],style:["width: ",{t:2,r:"percentage",p:[14,48,371]},"%"]}}," ",{p:[15,3,398],t:7,e:"span",a:{"class":"barText"},f:[{t:16,p:[15,25,420]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],343:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(482),a=t(481);e.exports={computed:{clickable:function(){return!this.get("enabled")||this.get("state")&&"toggle"!=this.get("state")?!1:!0},enabled:function(){return this.get("config.status")===n.UI_INTERACTIVE?!0:!1},styles:function(){var t="";if(this.get("class")&&(t+=" "+this.get("class")),this.get("tooltip-side")&&(t=" tooltip-"+this.get("tooltip-side")),this.get("grid")&&(t+=" gridable"),this.get("enabled")){var e=this.get("state"),n=this.get("style");return e?"inactive "+e+" "+t:"active normal "+n+" "+t}return"inactive disabled "+t}},oninit:function(){var t=this;this.on("press",function(e){var n=t.get(),r=n.action,i=n.params;(0,a.act)(t.get("config.ref"),r,i),e.node.blur()})},data:{iconStackToHTML:function(t){var e="",n=t.split(",");if(n.length){e+='';for(var a=n,r=Array.isArray(a),i=0,a=r?a:a[Symbol.iterator]();;){var o;if(r){if(i>=a.length)break;o=a[i++]}else{if(i=a.next(),i.done)break;o=i.value}var s=o,p=/([\w\-]+)\s*(\dx)/g,u=p.exec(s),c=u[1],l=u[2];e+=''}}return e&&(e+=""),e}}}}(r),r.exports.template={v:3,t:[" ",{p:[70,1,2019],t:7,e:"span",a:{"class":["button ",{t:2,r:"styles",p:[70,21,2039]}],unselectable:"on","data-tooltip":[{t:2,r:"tooltip",p:[73,17,2124]}]},m:[{t:4,f:["tabindex='0'"],r:"clickable",p:[72,3,2075]}],v:{"mouseover-mousemove":"hover",mouseleave:"unhover","click-enter":{n:[{t:4,f:["press"],r:"clickable",p:[76,19,2217]}],d:[]}},f:[{t:4,f:[{p:[78,5,2265],t:7,e:"i",a:{"class":["fa fa-",{t:2,r:"icon",p:[78,21,2281]}]}}],n:50,r:"icon",p:[77,3,2247]}," ",{t:4,f:[{t:3,x:{r:["iconStackToHTML","icon_stack"],s:"_0(_1)"},p:[81,6,2335]}],n:50,r:"icon_stack",p:[80,3,2310]}," ",{t:16,p:[83,3,2383]}]}]},e.exports=a.extend(r.exports)},{341:341,481:481,482:482}],344:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"display"},f:[{t:4,f:[{p:[3,5,44],t:7,e:"header",f:[{p:[4,7,60],t:7,e:"h3",f:[{t:2,r:"title",p:[4,11,64]}]}," ",{t:4,f:[{p:[6,9,110],t:7,e:"div",a:{"class":"buttonRight"},f:[{t:16,n:"button",p:[6,34,135]}]}],n:50,r:"button",p:[5,7,86]}]}],n:50,r:"title",p:[2,3,25]}," ",{p:[10,3,202],t:7,e:"article",f:[{t:16,p:[11,5,217]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],345:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.on("clear",function(){t.set("value",""),t.find("input").focus()})}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,170],t:7,e:"input",a:{type:"text",value:[{t:2,r:"value",p:[12,27,196]}],placeholder:[{t:2,r:"placeholder",p:[12,51,220]}]}}," ",{p:[13,1,240],t:7,e:"ui-button",a:{icon:"refresh"},v:{press:"clear"}}]},e.exports=a.extend(r.exports)},{341:341}],346:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";e.exports={data:{graph:t(338),xaccessor:function(t){return t.x},yaccessor:function(t){return t.y}},computed:{size:function(){var t=this.get("points");return t[0].length},scale:function(){var t=this.get("points");return Math.max.apply(Math,Array.map(t,function(t){return Math.max.apply(Math,Array.map(t,function(t){return t.y}))}))},xaxis:function(){var t=this.get("xinc"),e=this.get("size");return Array.from(Array(e).keys()).filter(function(e){return e&&e%t==0})},yaxis:function(){var t=this.get("yinc"),e=this.get("scale");return Array.from(Array(t).keys()).map(function(t){return Math.round(e*(++t/100)*10)})}},oninit:function(){var t=this;this.on({enter:function(t){this.set("selected",t.index.count)},exit:function(t){this.set("selected")}}),window.addEventListener("resize",function(e){t.set("width",t.el.clientWidth)})},onrender:function(){this.set("width",this.el.clientWidth)}}}(r),r.exports.template={v:3,t:[" ",{p:[47,1,1269],t:7,e:"svg",a:{"class":"linegraph",width:"100%",height:[{t:2,x:{r:["height"],s:"_0+10"},p:[47,45,1313]}]},f:[{p:[48,3,1334],t:7,e:"g",a:{transform:"translate(0, 5)"},f:[{t:4,f:[{t:4,f:[{p:[51,9,1504],t:7,e:"line",a:{x1:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,19,1514]}],x2:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,38,1533]}],y1:"0",y2:[{t:2,r:"height",p:[51,64,1559]}],stroke:"darkgray"}}," ",{t:4,f:[{p:[53,11,1635],t:7,e:"text",a:{x:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[53,20,1644]}],y:[{t:2,x:{r:["height"],s:"_0-5"},p:[53,38,1662]}],"text-anchor":"middle",fill:"white"},f:[{t:2,x:{r:["size",".","xfactor"],s:"(_0-_1)*_2"},p:[53,88,1712]}," ",{t:2,r:"xunit",p:[53,113,1737]}]}],n:50,x:{r:["@index"],s:"_0%2==0"},p:[52,9,1600]}],n:52,r:"xaxis",p:[50,7,1479]}," ",{t:4,f:[{p:[57,9,1820],t:7,e:"line",a:{x1:"0",x2:[{t:2,r:"width",p:[57,26,1837]}],y1:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,41,1852]}],y2:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,60,1871]}],stroke:"darkgray"}}," ",{p:[58,9,1915],t:7,e:"text",a:{x:"0",y:[{t:2,x:{r:["yscale","."],s:"_0(_1)-5"},p:[58,24,1930]}],"text-anchor":"begin",fill:"white"},f:[{t:2,x:{r:[".","yfactor"],s:"_0*_1"},p:[58,76,1982]}," ",{t:2,r:"yunit",p:[58,92,1998]}]}],n:52,r:"yaxis",p:[56,7,1795]}," ",{t:4,f:[{p:[61,9,2071],t:7,e:"path",a:{d:[{t:2,x:{r:["area.path"],s:"_0.print()"},p:[61,18,2080]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[61,47,2109]}],opacity:"0.1"}}],n:52,i:"curve",r:"curves",p:[60,7,2039]}," ",{t:4,f:[{p:[64,9,2200],t:7,e:"path",a:{d:[{t:2,x:{r:["line.path"],s:"_0.print()"},p:[64,18,2209]}],stroke:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[64,49,2240]}],fill:"none"}}],n:52, i:"curve",r:"curves",p:[63,7,2168]}," ",{t:4,f:[{t:4,f:[{p:[68,11,2375],t:7,e:"circle",a:{transform:["translate(",{t:2,r:".",p:[68,40,2404]},")"],r:[{t:2,x:{r:["selected","count"],s:"_0==_1?10:4"},p:[68,51,2415]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[68,89,2453]}]},v:{mouseenter:"enter",mouseleave:"exit"}}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[67,9,2329]}],n:52,i:"curve",r:"curves",p:[66,7,2297]}," ",{t:4,f:[{t:4,f:[{t:4,f:[{p:[74,13,2678],t:7,e:"text",a:{transform:["translate(",{t:2,r:".",p:[74,40,2705]},") ",{t:2,x:{r:["count","size"],s:'_0<=_1/2?"translate(15, 4)":"translate(-15, 4)"'},p:[74,47,2712]}],"text-anchor":[{t:2,x:{r:["count","size"],s:'_0<=_1/2?"start":"end"'},p:[74,126,2791]}],fill:"white"},f:[{t:2,x:{r:["count","item","yfactor"],s:"_1[_0].y*_2"},p:[75,15,2861]}," ",{t:2,r:"yunit",p:[75,43,2889]}," @ ",{t:2,x:{r:["size","count","item","xfactor"],s:"(_0-_2[_1].x)*_3"},p:[75,55,2901]}," ",{t:2,r:"xunit",p:[75,92,2938]}]}],n:50,x:{r:["selected","count"],s:"_0==_1"},p:[73,11,2638]}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[72,9,2592]}],n:52,i:"curve",r:"curves",p:[71,7,2560]}," ",{t:4,f:[{p:[81,9,3063],t:7,e:"g",a:{transform:["translate(",{t:2,x:{r:["width","curves.length","@index"],s:"(_0/(_1+1))*(_2+1)"},p:[81,33,3087]},", 10)"]},f:[{p:[82,11,3154],t:7,e:"circle",a:{r:"4",fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[82,31,3174]}]}}," ",{p:[83,11,3206],t:7,e:"text",a:{x:"8",y:"4",fill:"white"},f:[{t:2,rx:{r:"legend",m:[{t:30,n:"curve"}]},p:[83,42,3237]}]}]}],n:52,i:"curve",r:"curves",p:[80,7,3031]}],x:{r:["graph","points","xaccessor","yaccessor","width","height"],s:"_0({data:_1,xaccessor:_2,yaccessor:_3,width:_4,height:_5})"},p:[49,5,1371]}]}]}]},e.exports=a.extend(r.exports)},{338:338,341:341}],347:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"notice"},f:[{t:16,p:[2,3,24]}]}]},e.exports=a.extend(r.exports)},{341:341}],348:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(481),a=t(483);e.exports={oninit:function(){var t=this,e=a.resize.bind(this),r=function(){return t.set({resize:!1,x:null,y:null})};this.observe("config.fancy",function(a,i,o){(0,n.winset)(t.get("config.window"),"can-resize",!a),a?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",r)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",r))}),this.on("resize",function(){return t.toggle("resize")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[28,3,766],t:7,e:"div",a:{"class":"resize"},v:{mousedown:"resize"}}],n:50,r:"config.fancy",p:[27,1,742]}]},e.exports=a.extend(r.exports)},{341:341,481:481,483:483}],349:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"section",a:{"class":[{t:4,f:["candystripe"],r:"candystripe",p:[1,17,16]}]},f:[{t:4,f:[{p:[3,5,84],t:7,e:"span",a:{"class":"label",style:[{t:4,f:["color:",{t:2,r:"labelcolor",p:[3,53,132]}],r:"labelcolor",p:[3,32,111]}]},f:[{t:2,r:"label",p:[3,84,163]},":"]}],n:50,r:"label",p:[2,3,65]}," ",{t:4,f:[{t:16,p:[6,5,215]}],n:50,r:"nowrap",p:[5,3,195]},{t:4,n:51,f:[{p:[8,5,242],t:7,e:"div",a:{"class":"content",style:[{t:4,f:["float:right;"],r:"right",p:[8,33,270]}]},f:[{t:16,p:[9,7,312]}]}],r:"nowrap"}]}]},e.exports=a.extend(r.exports)},{341:341}],350:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"subdisplay"},f:[{t:4,f:[{p:[3,5,47],t:7,e:"header",f:[{p:[4,7,63],t:7,e:"h4",f:[{t:2,r:"title",p:[4,11,67]}]}," ",{t:4,f:[{t:16,n:"button",p:[5,21,103]}],n:50,r:"button",p:[5,7,89]}]}],n:50,r:"title",p:[2,3,28]}," ",{p:[8,3,156],t:7,e:"article",f:[{t:16,p:[9,5,171]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],351:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.set("active",this.findComponent("tab").get("name")),this.on("switch",function(e){t.set("active",e.node.textContent.trim())}),this.observe("active",function(e,n,a){for(var r=t.findAllComponents("tab"),i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;p.set("shown",p.get("name")===e)}})}}}(r),r.exports.template={v:3,t:[" "," ",{p:[20,1,524],t:7,e:"header",f:[{t:4,f:[{p:[22,5,556],t:7,e:"ui-button",a:{pane:[{t:2,r:".",p:[22,22,573]}]},v:{press:"switch"},f:[{t:2,r:".",p:[22,47,598]}]}],n:52,r:"tabs",p:[21,3,536]}]}," ",{p:[25,1,641],t:7,e:"ui-display",f:[{t:8,r:"content",p:[26,3,657]}]}]},r.exports.components=r.exports.components||{};var i={tab:t(352)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,352:352}],352:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:16,p:[2,3,17]}],n:50,r:"shown",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],353:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(482),a=t(481),r=t(483);e.exports={computed:{visualStatus:function(){switch(this.get("config.status")){case n.UI_INTERACTIVE:return"good";case n.UI_UPDATE:return"average";case n.UI_DISABLED:return"bad";default:return"bad"}}},oninit:function(){var t=this,e=r.drag.bind(this),n=function(e){return t.set({drag:!1,x:null,y:null})};this.observe("config.fancy",function(r,i,o){(0,a.winset)(t.get("config.window"),"titlebar",!r&&t.get("config.titlebar")),r?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",n)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",n))}),this.on({drag:function(){this.toggle("drag")},close:function(){(0,a.winset)(this.get("config.window"),"is-visible",!1),window.location.href=(0,a.href)({command:"uiclose "+this.get("config.ref")},"winset")},minimize:function(){(0,a.winset)(this.get("config.window"),"is-minimized",!0)}})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[50,3,1440],t:7,e:"header",a:{"class":"titlebar"},v:{mousedown:"drag"},f:[{p:[51,5,1491],t:7,e:"i",a:{"class":["statusicon fa fa-eye fa-2x ",{t:2,r:"visualStatus",p:[51,42,1528]}]}}," ",{p:[52,5,1556],t:7,e:"span",a:{"class":"title"},f:[{t:16,p:[52,25,1576]}]}," ",{t:4,f:[{p:[54,7,1626],t:7,e:"i",a:{"class":"minimize fa fa-minus fa-2x"},v:{click:"minimize"}}," ",{p:[55,7,1696],t:7,e:"i",a:{"class":"close fa fa-close fa-2x"},v:{click:"close"}}],n:50,r:"config.fancy",p:[53,5,1598]}]}],n:50,r:"config.titlebar",p:[49,1,1413]}]},e.exports=a.extend(r.exports)},{341:341,481:481,482:482,483:483}],354:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";var e=[11,10,9,8];t.exports={data:{userAgent:navigator.userAgent},computed:{ie:function(){if(document.documentMode)return document.documentMode;for(var t in e){var n=document.createElement("div");if(n.innerHTML="",n.getElementsByTagName("span").length)return t}}},oninit:function(){var t=this;this.on("debug",function(){return t.toggle("debug")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[27,3,662],t:7,e:"ui-notice",f:[{p:[28,5,679],t:7,e:"span",f:["You have an old (IE",{t:2,r:"ie",p:[28,30,704]},"), end-of-life (click 'EOL Info' for more information) version of Internet Explorer installed."]},{p:[28,137,811],t:7,e:"br"}," ",{p:[29,5,822],t:7,e:"span",f:["To upgrade, click 'Upgrade IE' to download IE11 from Microsoft."]},{p:[29,81,898],t:7,e:"br"}," ",{p:[30,5,909],t:7,e:"span",f:["If you are unable to upgrade directly, click 'IE VMs' to download a VM with IE11 or Edge from Microsoft."]},{p:[30,122,1026],t:7,e:"br"}," ",{p:[31,5,1037],t:7,e:"span",f:["Otherwise, click 'No Frills' below to disable potentially incompatible features (and this message)."]}," ",{p:[32,5,1155],t:7,e:"hr"}," ",{p:[33,5,1166],t:7,e:"ui-button",a:{icon:"close",action:"tgui:nofrills"},f:["No Frills"]}," ",{p:[34,5,1240],t:7,e:"ui-button",a:{icon:"internet-explorer",action:"tgui:link",params:'{"url": "http://windows.microsoft.com/en-us/internet-explorer/download-ie"}'},f:["Upgrade IE"]}," ",{p:[36,5,1416],t:7,e:"ui-button",a:{icon:"edge",action:"tgui:link",params:'{"url": "https://dev.windows.com/en-us/microsoft-edge/tools/vms"}'},f:["IE VMs"]}," ",{p:[38,5,1565],t:7,e:"ui-button",a:{icon:"info",action:"tgui:link",params:'{"url": "https://support.microsoft.com/en-us/lifecycle#gp/Microsoft-Internet-Explorer"}'},f:["EOL Info"]}," ",{p:[40,5,1738],t:7,e:"ui-button",a:{icon:"bug"},v:{press:"debug"},f:["Debug Info"]}," ",{t:4,f:[{p:[42,7,1826],t:7,e:"hr"}," ",{p:[43,7,1839],t:7,e:"span",f:["Detected: IE",{t:2,r:"ie",p:[43,25,1857]}]},{p:[43,38,1870],t:7,e:"br"}," ",{p:[44,7,1883],t:7,e:"span",f:["User Agent: ",{t:2,r:"userAgent",p:[44,25,1901]}]}],n:50,r:"debug",p:[41,5,1805]}]}],n:50,x:{r:["config.fancy","ie"],s:"_0&&_1&&_1<11"},p:[26,1,621]}]},e.exports=a.extend(r.exports)},{341:341}],355:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},shockState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[22,1,348],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[23,2,384],t:7,e:"ui-section",a:{label:"Main"},f:[{p:[24,3,413],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.power.main"],s:"_0(_1)"},p:[24,16,426]}]},f:[{t:2,x:{r:["data.power.main"],s:'_0?"Online":"Offline"'},p:[24,49,459]}]}," ",{t:4,f:["[ ",{p:[26,6,567],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.main_1","data.wires.main_2"],s:"!_0||!_1"},p:[25,3,512]},{t:4,n:51,f:[{t:4,f:["[ ",{t:2,r:"data.power.main_timeleft",p:[29,7,674]}," seconds left ]"],n:50,x:{r:["data.power.main_timeleft"],s:"_0>0"},p:[28,4,630]}],x:{r:["data.wires.main_1","data.wires.main_2"],s:"!_0||!_1"}}," ",{p:[32,3,744],t:7,e:"div",a:{style:"float:right"},f:[{p:[33,4,774],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"disrupt-main",state:[{t:2,x:{r:["data.power.main"],s:'_0?null:"disabled"'},p:[33,63,833]}]},f:["Disrupt"]}]}]}," ",{p:[36,2,922],t:7,e:"ui-section",a:{label:"Backup"},f:[{p:[37,3,953],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.power.backup"],s:"_0(_1)"},p:[37,16,966]}]},f:[{t:2,x:{r:["data.power.backup"],s:'_0?"Online":"Offline"'},p:[37,51,1001]}]}," ",{t:4,f:["[ ",{p:[39,6,1115],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.backup_1","data.wires.backup_2"],s:"!_0||!_1"},p:[38,3,1056]},{t:4,n:51,f:[{t:4,f:["[ ",{t:2,r:"data.power.backup_timeleft",p:[42,7,1224]}," seconds left ]"],n:50,x:{r:["data.power.backup_timeleft"],s:"_0>0"},p:[41,4,1178]}],x:{r:["data.wires.backup_1","data.wires.backup_2"],s:"!_0||!_1"}}," ",{p:[45,3,1296],t:7,e:"div",a:{style:"float:right"},f:[{p:[46,4,1326],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"disrupt-backup",state:[{t:2,x:{r:["data.power.backup"],s:'_0?null:"disabled"'},p:[46,65,1387]}]},f:["Disrupt"]}]}]}," ",{p:[49,2,1478],t:7,e:"ui-section",a:{label:"Electrify"},f:[{p:[50,3,1512],t:7,e:"span",a:{"class":[{t:2,x:{r:["shockState","data.shock"],s:"_0(_1)"},p:[50,16,1525]}]},f:[{t:2,x:{r:["data.shock"],s:'_0==2?"Safe":"Electrified"'},p:[50,44,1553]}]}," ",{t:4,f:["[ ",{p:[52,6,1640],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.shock"],s:"!_0"},p:[51,3,1608]},{t:4,n:51,f:[{t:4,f:["[ ",{p:[55,7,1742],t:7,e:"span",a:{"class":"bad"},f:[{t:2,r:"data.shock_timeleft",p:[55,25,1760]}," seconds left"]}," ]"],n:50,x:{r:["data.shock_timeleft"],s:"_0>0"},p:[54,4,1703]}," ",{t:4,f:["[ ",{p:[58,7,1863],t:7,e:"span",a:{"class":"bad"},f:["Permanent"]}," ]"],n:50,x:{r:["data.shock_timeleft"],s:"_0==-1"},p:[57,4,1822]}],x:{r:["data.wires.shock"],s:"!_0"}}," ",{p:[61,3,1926],t:7,e:"div",a:{style:"float:right"},f:[{p:[62,4,1956],t:7,e:"ui-button",a:{icon:"wrench",action:"shock-restore",state:[{t:2,x:{r:["data.wires.shock","data.shock"],s:'_0&&_1==0?null:"disabled"'},p:[62,59,2011]}]},f:["Restore"]}," ",{p:[63,4,2094],t:7,e:"ui-button",a:{icon:"bolt",action:"shock-temp",state:[{t:2,x:{r:["data.wires.shock"],s:"!_0"},p:[63,54,2144]}]},f:["Set (Temporary)"]}," ",{p:[64,4,2199],t:7,e:"ui-button",a:{icon:"bolt",action:"shock-perm",state:[{t:2,x:{r:["data.wires.shock"],s:"!_0"},p:[64,53,2248]}]},f:["Set (Permanent)"]}]}]}]}," ",{p:[68,1,2341],t:7,e:"ui-display",a:{title:"Access & Door Control"},f:[{p:[69,2,2386],t:7,e:"ui-section",a:{label:"ID Scan"},f:[{t:4,f:["[ ",{p:[71,6,2455],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[70,3,2418]}," ",{p:[73,3,2516],t:7,e:"div",a:{style:"float:right"},f:[{p:[74,4,2546],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[74,22,2564]}],icon:"power-off",action:"idscan-on",style:[{t:2,x:{r:["data.id_scanner"],s:'_0?"selected":""'},p:[74,93,2635]}]},f:["Enabled"]}," ",{p:[75,4,2698],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[75,22,2716]}],icon:"close",action:"idscan-off",style:[{t:2,x:{r:["data.id_scanner"],s:'_0?"":"selected"'},p:[75,90,2784]}]},f:["Disabled"]}]}]}," ",{p:[78,2,2872],t:7,e:"ui-section",a:{label:"Emergency Access"},f:[{p:[79,3,2913],t:7,e:"div",a:{style:"float:right"},f:[{p:[80,4,2943],t:7,e:"ui-button",a:{icon:"power-off",action:"emergency-on",style:[{t:2,x:{r:["data.emergency"],s:'_0?"selected":""'},p:[80,61,3e3]}]},f:["Enabled"]}," ",{p:[81,4,3062],t:7,e:"ui-button",a:{icon:"close",action:"emergency-off",style:[{t:2,x:{r:["data.emergency"],s:'_0?"":"selected"'},p:[81,58,3116]}]},f:["Disabled"]}]}]}," ",{p:[84,2,3203],t:7,e:"br"}," ",{p:[85,2,3212],t:7,e:"ui-section",a:{label:"Door bolts"},f:[{t:4,f:["[ ",{p:[87,6,3279],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.bolts"],s:"!_0"},p:[86,3,3247]}," ",{p:[89,3,3340],t:7,e:"div",a:{style:"float:right"},f:[{p:[90,4,3370],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.bolts"],s:"!_0"},p:[90,22,3388]}],icon:"unlock",action:"bolt-raise",style:[{t:2,x:{r:["data.locked"],s:'_0?"":"selected"'},p:[90,85,3451]}]},f:["Raised"]}," ",{p:[91,4,3509],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.bolts"],s:"!_0"},p:[91,22,3527]}],icon:"lock",action:"bolt-drop",style:[{t:2,x:{r:["data.locked"],s:'_0?"selected":""'},p:[91,82,3587]}]},f:["Dropped"]}]}]}," ",{p:[94,2,3670],t:7,e:"ui-section",a:{label:"Door bolt lights"},f:[{t:4,f:["[ ",{p:[96,6,3744],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.lights"],s:"!_0"},p:[95,3,3711]}," ",{p:[98,3,3805],t:7,e:"div",a:{style:"float:right"},f:[{p:[99,4,3835],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.lights"],s:"!_0"},p:[99,22,3853]}],icon:"power-off",action:"light-on",style:[{t:2,x:{r:["data.lights"],s:'_0?"selected":""'},p:[99,88,3919]}]},f:["Enabled"]}," ",{p:[100,4,3978],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.lights"],s:"!_0"},p:[100,22,3996]}],icon:"close",action:"light-off",style:[{t:2,x:{r:["data.lights"],s:'_0?"":"selected"'},p:[100,85,4059]}]},f:["Disabled"]}]}]}," ",{p:[103,2,4143],t:7,e:"ui-section",a:{label:"Door force sensors"},f:[{t:4,f:["[ ",{p:[105,6,4217],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.safe"],s:"!_0"},p:[104,3,4186]}," ",{p:[107,3,4278],t:7,e:"div",a:{style:"float:right"},f:[{p:[108,4,4308],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.safe"],s:"!_0"},p:[108,22,4326]}],icon:"power-off",action:"safe-on",style:[{t:2,x:{r:["data.safe"],s:'_0?"selected":""'},p:[108,85,4389]}]},f:["Enabled"]}," ",{p:[109,4,4446],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.safe"],s:"!_0"},p:[109,22,4464]}],icon:"close",action:"safe-off",style:[{t:2,x:{r:["data.safe"],s:'_0?"":"selected"'},p:[109,82,4524]}]},f:["Disabled"]}]}]}," ",{p:[112,2,4606],t:7,e:"ui-section",a:{label:"Door timing safety"},f:[{t:4,f:["[ ",{p:[114,6,4682],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.timing"],s:"!_0"},p:[113,3,4649]}," ",{p:[116,3,4743],t:7,e:"div",a:{style:"float:right"},f:[{p:[117,4,4773],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.timing"],s:"!_0"},p:[117,22,4791]}],icon:"power-off",action:"speed-on",style:[{t:2,x:{r:["data.speed"],s:'_0?"selected":""'},p:[117,88,4857]}]},f:["Enabled"]}," ",{p:[118,4,4915],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.timing"],s:"!_0"},p:[118,22,4933]}],icon:"close",action:"speed-off",style:[{t:2,x:{r:["data.speed"],s:'_0?"":"selected"'},p:[118,85,4996]}]},f:["Disabled"]}]}]}," ",{p:[121,2,5079],t:7,e:"br"}," ",{p:[122,2,5088],t:7,e:"ui-section",a:{label:"Door control"},f:[{t:4,f:["[ ",{p:[124,6,5166],t:7,e:"span",a:{"class":"bad"},f:["Door is ",{t:2,x:{r:["data.locked","data.welded"],s:'(_0?"bolted":"")+(_0&&_1?" and ":"")+(_1?"welded":"")'},p:[124,32,5192]}]}," ]"],n:50,x:{r:["data.locked","data.welded"],s:"_0||_1"},p:[123,3,5125]}," ",{p:[126,3,5327],t:7,e:"div",a:{style:"float:right"},f:[{p:[127,4,5357],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.locked","data.welded","data.opened"],s:'(_0||_1)||(_2&&"disabled")'},p:[127,22,5375]}],icon:"sign-out",action:"open-close"},f:["Open door"]}," ",{p:[128,4,5502],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.locked","data.welded","data.opened"],s:'(_0||_1)||(!_2&&"disabled")'},p:[128,22,5520]}],icon:"sign-in",action:"open-close"},f:["Close door"]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],356:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," ",{p:[7,1,267],t:7,e:"ui-notice",f:[{t:4,f:[{p:[9,5,312],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[10,7,355],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[10,24,372]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[10,75,423]}]}]}],n:50,r:"data.siliconUser",p:[8,3,282]},{t:4,n:51,f:[{p:[13,5,514],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,31,540]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[16,1,625],t:7,e:"status"}," ",{t:4,f:[{t:4,f:[{p:[19,7,719],t:7,e:"ui-display",a:{title:"Air Controls"},f:[{p:[20,9,762],t:7,e:"ui-section",f:[{p:[21,11,786],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"exclamation-triangle":"exclamation"'},p:[21,28,803]}],style:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"caution":null'},p:[21,98,873]}],action:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"reset":"alarm"'},p:[22,23,937]}]},f:["Area Atmosphere Alarm"]}]}," ",{p:[24,9,1045],t:7,e:"ui-section",f:[{p:[25,11,1069],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==3?"exclamation-triangle":"exclamation"'},p:[25,28,1086]}],style:[{t:2,x:{r:["data.mode"],s:'_0==3?"danger":null'},p:[25,96,1154]}],action:"mode",params:['{"mode": ',{t:2,x:{r:["data.mode"],s:"_0==3?1:3"},p:[26,44,1236]},"}"]},f:["Panic Siphon"]}]}," ",{p:[28,9,1322],t:7,e:"br"}," ",{p:[29,9,1337],t:7,e:"ui-section",f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:"sign-out",action:"tgui:view",params:'{"screen": "vents"}'},f:["Vent Controls"]}]}," ",{p:[32,9,1494],t:7,e:"ui-section",f:[{p:[33,11,1518],t:7,e:"ui-button",a:{icon:"filter",action:"tgui:view",params:'{"screen": "scrubbers"}'},f:["Scrubber Controls"]}]}," ",{p:[35,9,1657],t:7,e:"ui-section",f:[{p:[36,11,1681],t:7,e:"ui-button",a:{icon:"cog",action:"tgui:view",params:'{"screen": "modes"}'},f:["Operating Mode"]}]}," ",{p:[38,9,1810],t:7,e:"ui-section",f:[{p:[39,11,1834],t:7,e:"ui-button",a:{icon:"bar-chart",action:"tgui:view",params:'{"screen": "thresholds"}'},f:["Alarm Thresholds"]}]}]}],n:50,x:{r:["config.screen"],s:'_0=="home"'},p:[18,3,680]},{t:4,n:51,f:[{t:4,n:50,x:{r:["config.screen"],s:'_0=="vents"'},f:[{p:[43,5,2032],t:7,e:"vents"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&(_0=="scrubbers")'},f:[" ",{p:[45,5,2089],t:7,e:"scrubbers"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&(_0=="modes"))'},f:[" ",{p:[47,5,2146],t:7,e:"modes"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&((!(_0=="modes"))&&(_0=="thresholds")))'},f:[" ",{p:[49,5,2204],t:7,e:"thresholds"}]}],x:{r:["config.screen"],s:'_0=="home"'}}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[17,1,636]}]},r.exports.components=r.exports.components||{};var i={vents:t(362),modes:t(358),thresholds:t(361),status:t(360),scrubbers:t(359)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,358:358,359:359,360:360,361:361,362:362}],357:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-button",a:{icon:"arrow-left",action:"tgui:view",params:'{"screen": "home"}'},f:["Back"]}]},e.exports=a.extend(r.exports)},{341:341}],358:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,115],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Operating Modes",button:0},f:[" ",{t:4,f:[{p:[8,5,168],t:7,e:"ui-section",f:[{p:[9,7,188],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["selected"],s:'_0?"check-square-o":"square-o"'},p:[9,24,205]}],state:[{t:2,x:{r:["selected","danger"],s:'_0?_1?"danger":"selected":null'},p:[10,16,267]}],action:"mode",params:['{"mode": ',{t:2,r:"mode",p:[11,40,361]},"}"]},f:[{t:2,r:"name",p:[11,51,372]}]}]}],n:52,r:"data.modes",p:[7,3,142]}]}]},r.exports.components=r.exports.components||{};var i={back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357}],359:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," ",{p:{button:[{p:[6,5,185],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Scrubber Controls",button:0},f:[" ",{t:4,f:[{p:[9,5,242],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[9,27,264]}]},f:[{p:[10,7,287],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,323],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[11,26,340]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[11,68,382]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[12,46,459]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[12,66,479]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[12,80,493]}]}]}," ",{p:[14,7,558],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[15,9,593],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["scrubbing"],s:'_0?"filter":"sign-in"'},p:[15,26,610]}],style:[{t:2,x:{r:["scrubbing"],s:'_0?null:"danger"'},p:[15,71,655]}],action:"scrubbing",params:['{"id_tag": "',{t:2,r:"id_tag",p:[16,50,738]},'", "val": ',{t:2,x:{r:["scrubbing"],s:"+!_0"},p:[16,70,758]},"}"]},f:[{t:2,x:{r:["scrubbing"],s:'_0?"Scrubbing":"Siphoning"'},p:[16,88,776]}]}]}," ",{p:[18,7,858],t:7,e:"ui-section",a:{label:"Range"},f:[{p:[19,9,894],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["widenet"],s:'_0?"expand":"compress"'},p:[19,26,911]}],style:[{t:2,x:{r:["widenet"],s:'_0?"selected":null'},p:[19,70,955]}],action:"widenet",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,1036]},'", "val": ',{t:2,x:{r:["widenet"],s:"+!_0"},p:[20,68,1056]},"}"]},f:[{t:2,x:{r:["widenet"],s:'_0?"Expanded":"Normal"'},p:[20,84,1072]}]}]}," ",{p:[22,7,1148],t:7,e:"ui-section",a:{label:"Filters"},f:[{p:[23,9,1186],t:7,e:"filters"}]}]}],n:52,r:"data.scrubbers",p:[8,3,212]},{t:4,n:51,f:[{p:[27,5,1257],t:7,e:"span",a:{"class":"bad"},f:["Error: No scrubbers connected."]}],r:"data.scrubbers"}]}]},r.exports.components=r.exports.components||{};var i={filters:t(457),back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357,457:457}],360:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Air Status"},f:[{t:4,f:[{t:4,f:[{p:[4,7,110],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[4,26,129]}]},f:[{p:[5,6,146],t:7,e:"span",a:{"class":[{t:2,x:{r:["danger_level"],s:'_0==2?"bad":_0==1?"average":"good"'},p:[5,19,159]}]},f:[{t:2,x:{r:["value"],s:"Math.fixed(_0,2)"},p:[6,5,237]},{t:2,r:"unit",p:[6,29,261]}]}]}],n:52,r:"adata.environment_data",p:[3,5,70]}," ",{p:[10,5,322],t:7,e:"ui-section",a:{label:"Local Status"},f:[{p:[11,7,363],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.danger_level"],s:'_0==2?"bad bold":_0==1?"average bold":"good"'},p:[11,20,376]}]},f:[{t:2,x:{r:["data.danger_level"],s:'_0==2?"Danger (Internals Required)":_0==1?"Caution":"Optimal"'},p:[12,6,475]}]}]}," ",{p:[15,5,619],t:7,e:"ui-section",a:{label:"Area Status"},f:[{p:[16,7,659],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.atmos_alarm","data.fire_alarm"],s:'_0||_1?"bad bold":"good"'},p:[16,20,672]}]},f:[{t:2,x:{r:["data.atmos_alarm","fire_alarm"],s:'_0?"Atmosphere Alarm":_1?"Fire Alarm":"Nominal"'},p:[17,8,744]}]}]}],n:50,r:"data.environment_data",p:[2,3,35]},{t:4,n:51,f:[{p:[21,5,876],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[22,7,912],t:7,e:"span",a:{"class":"bad bold"},f:["Cannot obtain air sample for analysis."]}]}],r:"data.environment_data"}," ",{t:4,f:[{p:[26,5,1040],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[27,7,1076],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[25,3,1014]}]}]},e.exports=a.extend(r.exports)},{341:341}],361:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.css=" th, td {\r\n padding-right: 16px;\r\n text-align: left;\r\n }",r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,116],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Alarm Thresholds",button:0},f:[" ",{p:[7,3,143],t:7,e:"table",f:[{p:[8,5,156],t:7,e:"thead",f:[{p:[8,12,163],t:7,e:"tr",f:[{p:[9,7,175],t:7,e:"th"}," ",{p:[10,7,192],t:7,e:"th",f:[{p:[10,11,196],t:7,e:"span",a:{"class":"bad"},f:["min2"]}]}," ",{p:[11,7,238],t:7,e:"th",f:[{p:[11,11,242],t:7,e:"span",a:{"class":"average"},f:["min1"]}]}," ",{p:[12,7,288],t:7,e:"th",f:[{p:[12,11,292],t:7,e:"span",a:{"class":"average"},f:["max1"]}]}," ",{p:[13,7,338],t:7,e:"th",f:[{p:[13,11,342],t:7,e:"span",a:{"class":"bad"},f:["max2"]}]}]}]}," ",{p:[15,5,401],t:7,e:"tbody",f:[{t:4,f:[{p:[16,32,441],t:7,e:"tr",f:[{p:[17,9,455],t:7,e:"th",f:[{t:3,r:"name",p:[17,13,459]}]}," ",{t:4,f:[{p:[18,27,502],t:7,e:"td",f:[{p:[19,11,518],t:7,e:"ui-button",a:{action:"threshold",params:['{"env": "',{t:2,r:"env",p:[19,58,565]},'", "var": "',{t:2,r:"val",p:[19,76,583]},'"}']},f:[{t:2,x:{r:["selected"],s:"Math.fixed(_0,2)"},p:[19,87,594]}]}]}],n:52,r:"settings",p:[18,9,484]}]}],n:52,r:"data.thresholds",p:[16,7,416]}]}," ",{p:[23,3,697],t:7,e:"table",f:[]}]}]}," "]},r.exports.components=r.exports.components||{};var i={back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357}],362:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,113],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Vent Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,166],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,188]}]},f:[{p:[9,7,211],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,264]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,306]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,383]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,403]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,417]}]}]}," ",{p:[13,7,482],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,517],t:7,e:"span",f:[{t:2,x:{r:["direction"],s:'_0=="release"?"Pressurizing":"Siphoning"'},p:[14,15,523]}]}]}," ",{p:[16,7,616],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[17,9,665],t:7,e:"ui-button",a:{icon:"sign-in",style:[{t:2,x:{r:["incheck"],s:'_0?"selected":null'},p:[17,42,698]}],action:"incheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[18,48,779]},'", "val": ',{t:2,r:"checks",p:[18,68,799]},"}"]},f:["Internal"]}," ",{p:[19,9,842],t:7,e:"ui-button",a:{icon:"sign-out",style:[{t:2,x:{r:["excheck"],s:'_0?"selected":null'},p:[19,43,876]}],action:"excheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,957]},'", "val": ',{t:2,r:"checks",p:[20,68,977]},"}"]},f:["External"]}]}," ",{t:4,f:[{p:[23,9,1064],t:7,e:"ui-section",a:{label:"Internal Target Pressure"},f:[{p:[24,11,1121],t:7,e:"ui-button",a:{icon:"pencil",action:"set_internal_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[25,33,1210]},'"}']},f:[{t:2,x:{r:["internal"],s:"Math.fixed(_0)"},p:[25,47,1224]}]}," ",{p:[26,11,1272],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["intdefault"],s:'_0?"disabled":null'},p:[26,44,1305]}],action:"reset_internal_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[27,33,1407]},'"}']},f:["Reset"]}]}],n:50,r:"incheck",p:[22,7,1039]}," ",{t:4,f:[{p:[31,11,1511],t:7,e:"ui-section",a:{label:"External Target Pressure"},f:[{p:[32,13,1570],t:7,e:"ui-button",a:{icon:"pencil",action:"set_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[33,35,1661]},'"}']},f:[{t:2,x:{r:["external"],s:"Math.fixed(_0)"},p:[33,49,1675]}]}," ",{p:[34,13,1725],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["extdefault"],s:'_0?"disabled":null'},p:[34,46,1758]}],action:"reset_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[35,35,1862]},'"}']},f:["Reset"]}]}],n:50,r:"excheck",p:[30,7,1484]}]}],n:52,r:"data.vents",p:[7,3,140]},{t:4,n:51,f:[{p:[40,5,1973],t:7,e:"span",a:{"class":"bad"},f:["Error: No vents connected."]}],r:"data.vents"}]}]},r.exports.components=r.exports.components||{};var i={back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357}],363:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.css=" table {\r\n width: 100%;\r\n border-spacing: 2px;\r\n }\r\n th {\r\n text-align: left;\r\n }\r\n td {\r\n vertical-align: top;\r\n }\r\n td .button {\r\n margin-top: 4px\r\n }",r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",f:[{p:[3,5,34],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oneAccess"],s:'_0?"unlock":"lock"'},p:[3,22,51]}],action:"one_access"},f:[{t:2,x:{r:["data.oneAccess"],s:'_0?"One":"All"'},p:[3,82,111]}," Required"]}," ",{p:[4,5,172],t:7,e:"ui-button",a:{icon:"refresh",action:"clear"},f:["Clear"]}]}," ",{p:[6,3,251],t:7,e:"hr"}," ",{p:[7,3,260],t:7,e:"table",f:[{p:[8,3,271],t:7,e:"thead",f:[{p:[9,4,283],t:7,e:"tr",f:[{t:4,f:[{p:[10,5,315],t:7,e:"th",f:[{p:[10,9,319],t:7,e:"span",a:{"class":"highlight bold"},f:[{t:2,r:"name",p:[10,38,348]}]}]}],n:52,r:"data.regions",p:[9,8,287]}]}]}," ",{p:[13,3,403],t:7,e:"tbody",f:[{p:[14,4,415],t:7,e:"tr",f:[{t:4,f:[{p:[15,5,447],t:7,e:"td",f:[{t:4,f:[{p:[16,11,481],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["req"],s:'_0?"check-square-o":"square-o"'},p:[16,28,498]}],style:[{t:2,x:{r:["req"],s:'_0?"selected":null'},p:[16,76,546]}],action:"set",params:['{"access": "',{t:2,r:"id",p:[17,46,621]},'"}']},f:[{t:2,r:"name",p:[17,56,631]}]}," ",{p:[18,9,661],t:7,e:"br"}],n:52,r:"accesses",p:[15,9,451]}]}],n:52,r:"data.regions",p:[14,8,419]}]}]}]}," ",{p:[23,2,731],t:7,e:"hr"}," ",{p:[24,2,739],t:7,e:"span",a:{"class":"highlight bold"},f:["Unrestricted Access:"]}," ",{p:[25,2,798],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&1?"check-square-o":"square-o"'},p:[25,19,815]}],style:[{t:2,x:{r:["data.unres_direction"],s:'_0&1?"selected":null'},p:[25,88,884]}],action:"direc_set",params:'{"unres_direction": "1"}'},f:["North"]}," ",{p:[26,2,1007],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&4?"check-square-o":"square-o"'},p:[26,19,1024]}],style:[{t:2,x:{r:["data.unres_direction"],s:'_0&4?"selected":null'},p:[26,88,1093]}],action:"direc_set",params:'{"unres_direction": "4"}'},f:["East"]}," ",{p:[27,2,1215],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&2?"check-square-o":"square-o"'},p:[27,19,1232]}],style:[{t:2,x:{r:["data.unres_direction"], s:'_0&2?"selected":null'},p:[27,88,1301]}],action:"direc_set",params:'{"unres_direction": "2"}'},f:["South"]}," ",{p:[28,2,1424],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&8?"check-square-o":"square-o"'},p:[28,19,1441]}],style:[{t:2,x:{r:["data.unres_direction"],s:'_0&8?"selected":null'},p:[28,88,1510]}],action:"direc_set",params:'{"unres_direction": "8"}'},f:["West"]}]}," "]},e.exports=a.extend(r.exports)},{341:341}],364:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}},computed:{malfAction:function(){switch(this.get("data.malfStatus")){case 1:return"hack";case 2:return"occupy";case 3:return"deoccupy"}},malfButton:function(){switch(this.get("data.malfStatus")){case 1:return"Override Programming";case 2:case 4:return"Shunt Core Process";case 3:return"Return to Main Core"}},malfIcon:function(){switch(this.get("data.malfStatus")){case 1:return"terminal";case 2:case 4:return"caret-square-o-down";case 3:return"caret-square-o-left"}},powerCellStatusState:function(){var t=this.get("data.powerCellStatus");return t>50?"good":t>25?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[46,2,1206],t:7,e:"ui-notice",f:[{p:[47,3,1221],t:7,e:"b",f:[{p:[47,6,1224],t:7,e:"h3",f:["SYSTEM FAILURE"]}]}," ",{p:[48,3,1255],t:7,e:"i",f:["I/O regulators malfunction detected! Waiting for system reboot..."]},{p:[48,75,1327],t:7,e:"br"}," Automatic reboot in ",{t:2,r:"data.failTime",p:[49,23,1355]}," seconds... ",{p:[50,3,1387],t:7,e:"ui-button",a:{icon:"refresh",action:"reboot"},f:["Reboot Now"]},{p:[50,67,1451],t:7,e:"br"},{p:[50,71,1455],t:7,e:"br"},{p:[50,75,1459],t:7,e:"br"}]}],n:50,r:"data.failTime",p:[45,1,1182]},{t:4,n:51,f:[{p:[53,2,1491],t:7,e:"ui-notice",f:[{t:4,f:[{p:[55,3,1535],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[56,5,1576],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[56,22,1593]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[56,73,1644]}]}]}],n:50,r:"data.siliconUser",p:[54,4,1507]},{t:4,n:51,f:[{p:[59,3,1732],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[59,29,1758]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[62,2,1846],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[63,4,1884],t:7,e:"ui-section",a:{label:"Main Breaker"},f:[{t:4,f:[{p:[65,5,1967],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isOperating"],s:'_0?"good":"bad"'},p:[65,18,1980]}]},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[65,57,2019]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[64,3,1921]},{t:4,n:51,f:[{p:[67,5,2079],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[67,22,2096]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[67,75,2149]}],action:"breaker"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[68,21,2212]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}," ",{p:[71,4,2293],t:7,e:"ui-section",a:{label:"External Power"},f:[{p:[72,3,2332],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.externalPower"],s:"_0(_1)"},p:[72,16,2345]}]},f:[{t:2,x:{r:["data.externalPower"],s:'_0==2?"Good":_0==1?"Low":"None"'},p:[72,52,2381]}]}]}," ",{p:[74,4,2490],t:7,e:"ui-section",a:{label:"Power Cell"},f:[{t:4,f:[{p:[76,5,2567],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerCellStatus",p:[76,38,2600]}],state:[{t:2,r:"powerCellStatusState",p:[76,71,2633]}]},f:[{t:2,x:{r:["adata.powerCellStatus"],s:"Math.fixed(_0)"},p:[76,97,2659]},"%"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[75,3,2525]},{t:4,n:51,f:[{p:[78,5,2724],t:7,e:"span",a:{"class":"bad"},f:["Removed"]}],x:{r:["data.powerCellStatus"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[82,3,2830],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{t:4,f:[{p:[84,4,2913],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.chargeMode"],s:'_0?"good":"bad"'},p:[84,17,2926]}]},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[84,55,2964]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[83,5,2868]},{t:4,n:51,f:[{p:[86,4,3026],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.chargeMode"],s:'_0?"refresh":"close"'},p:[86,21,3043]}],style:[{t:2,x:{r:["data.chargeMode"],s:'_0?"selected":null'},p:[86,71,3093]}],action:"charge"},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[87,22,3156]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}," [",{p:[90,6,3236],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.chargingStatus"],s:"_0(_1)"},p:[90,19,3249]}]},f:[{t:2,x:{r:["data.chargingStatus"],s:'_0==2?"Fully Charged":_0==1?"Charging":"Not Charging"'},p:[90,56,3286]}]},"]"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[81,4,2790]}]}," ",{p:[94,2,3445],t:7,e:"ui-display",a:{title:"Power Channels"},f:[{t:4,f:[{p:[96,3,3517],t:7,e:"ui-section",a:{label:[{t:2,r:"title",p:[96,22,3536]}],nowrap:0},f:[{p:[97,5,3560],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.powerChannels",m:[{t:30,n:"@index"},"powerLoad"]},p:[97,26,3581]}]}," ",{p:[98,5,3634],t:7,e:"div",a:{"class":"content"},f:[{p:[98,26,3655],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0>=2?"good":"bad"'},p:[98,39,3668]}]},f:[{t:2,x:{r:["status"],s:'_0>=2?"On":"Off"'},p:[98,73,3702]}]}]}," ",{p:[99,5,3751],t:7,e:"div",a:{"class":"content"},f:["[",{p:[99,27,3773],t:7,e:"span",f:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"Auto":"Manual"'},p:[99,33,3779]}]},"]"]}," ",{p:[100,5,3849],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{t:4,f:[{p:[102,6,3942],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"selected":null'},p:[102,39,3975]}],action:"channel",params:[{t:2,r:"topicParams.auto",p:[103,30,4057]}]},f:["Auto"]}," ",{p:[104,6,4102],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["status"],s:'_0==2?"selected":null'},p:[104,41,4137]}],action:"channel",params:[{t:2,r:"topicParams.on",p:[105,13,4204]}]},f:["On"]}," ",{p:[106,6,4245],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["status"],s:'_0==0?"selected":null'},p:[106,37,4276]}],action:"channel",params:[{t:2,r:"topicParams.off",p:[107,13,4343]}]},f:["Off"]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[101,4,3895]}]}]}],n:52,r:"data.powerChannels",p:[95,4,3485]}," ",{p:[112,4,4439],t:7,e:"ui-section",a:{label:"Total Load"},f:[{p:[113,3,4474],t:7,e:"span",a:{"class":"bold"},f:[{t:2,r:"adata.totalLoad",p:[113,22,4493]}]}]}]}," ",{t:4,f:[{p:[117,4,4585],t:7,e:"ui-display",a:{title:"System Overrides"},f:[{p:[118,3,4626],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"overload"},f:["Overload"]}," ",{t:4,f:[{p:[120,5,4727],t:7,e:"ui-button",a:{icon:[{t:2,r:"malfIcon",p:[120,22,4744]}],state:[{t:2,x:{r:["data.malfStatus"],s:'_0==4?"disabled":null'},p:[120,43,4765]}],action:[{t:2,r:"malfAction",p:[120,97,4819]}]},f:[{t:2,r:"malfButton",p:[120,113,4835]}]}],n:50,r:"data.malfStatus",p:[119,3,4698]}]}],n:50,r:"data.siliconUser",p:[116,2,4556]}," ",{p:[124,2,4903],t:7,e:"ui-notice",f:[{p:[125,4,4919],t:7,e:"ui-section",a:{label:"Emergency Light Fallback"},f:[{t:4,f:[{p:[127,8,5020],t:7,e:"span",f:[{t:2,x:{r:["data.emergencyLights"],s:'_0?"Enabled":"Disabled"'},p:[127,14,5026]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[126,6,4971]},{t:4,n:51,f:[{p:[129,8,5106],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"emergency_lighting"},f:[{t:2,x:{r:["data.emergencyLights"],s:'_0?"Enabled":"Disabled"'},p:[129,66,5164]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}," ",{p:[133,2,5275],t:7,e:"ui-notice",f:[{p:[134,4,5291],t:7,e:"ui-section",a:{label:"Night Shift Lighting"},f:[{t:4,f:[{p:[136,8,5388],t:7,e:"span",f:[{t:2,x:{r:["data.nightshiftLights"],s:'_0?"Enabled":"Disabled"'},p:[136,14,5394]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[135,6,5339]},{t:4,n:51,f:[{p:[138,8,5475],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"toggle_nightshift"},f:[{t:2,x:{r:["data.nightshiftLights"],s:'_0?"Enabled":"Disabled"'},p:[138,65,5532]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}," ",{p:[142,2,5644],t:7,e:"ui-notice",f:[{p:[143,4,5660],t:7,e:"ui-section",a:{label:"Cover Lock"},f:[{t:4,f:[{p:[145,5,5741],t:7,e:"span",f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[145,11,5747]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[144,3,5695]},{t:4,n:51,f:[{p:[147,5,5819],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.coverLocked"],s:'_0?"lock":"unlock"'},p:[147,22,5836]}],action:"cover"},f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[147,79,5893]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}],r:"data.failTime"}]},e.exports=a.extend(r.exports)},{341:341}],365:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Alarms"},f:[{p:[2,3,31],t:7,e:"ul",f:[{t:4,f:[{p:[4,7,72],t:7,e:"li",f:[{p:[4,11,76],t:7,e:"ui-button",a:{icon:"close",style:"danger",action:"clear",params:['{"zone": "',{t:2,r:".",p:[4,83,148]},'"}']},f:[{t:2,r:".",p:[4,92,157]}]}]}],n:52,r:"data.priority",p:[3,5,41]},{t:4,n:51,f:[{p:[6,7,201],t:7,e:"li",f:[{p:[6,11,205],t:7,e:"span",a:{"class":"good"},f:["No Priority Alerts"]}]}],r:"data.priority"}," ",{t:4,f:[{p:[9,7,303],t:7,e:"li",f:[{p:[9,11,307],t:7,e:"ui-button",a:{icon:"close",style:"caution",action:"clear",params:['{"zone": "',{t:2,r:".",p:[9,84,380]},'"}']},f:[{t:2,r:".",p:[9,93,389]}]}]}],n:52,r:"data.minor",p:[8,5,275]},{t:4,n:51,f:[{p:[11,7,433],t:7,e:"li",f:[{p:[11,11,437],t:7,e:"span",a:{"class":"good"},f:["No Minor Alerts"]}]}],r:"data.minor"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],366:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.tank","data.sensors.0.long_name"],s:"_0?_1:null"},p:[1,20,19]}]},f:[{t:4,f:[{p:[3,5,102],t:7,e:"ui-subdisplay",a:{title:[{t:2,x:{r:["data.tank","long_name"],s:"!_0?_1:null"},p:[3,27,124]}]},f:[{p:[4,7,167],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[5,3,200],t:7,e:"span",f:[{t:2,x:{r:["pressure"],s:"Math.fixed(_0,2)"},p:[5,9,206]}," kPa"]}]}," ",{t:4,f:[{p:[8,9,302],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[9,11,346],t:7,e:"span",f:[{t:2,x:{r:["temperature"],s:"Math.fixed(_0,2)"},p:[9,17,352]}," K"]}]}],n:50,r:"temperature",p:[7,7,273]}," ",{t:4,f:[{p:[13,9,462],t:7,e:"ui-section",a:{label:[{t:2,r:"id",p:[13,28,481]}]},f:[{p:[14,5,495],t:7,e:"span",f:[{t:2,x:{r:["."],s:"Math.fixed(_0,2)"},p:[14,11,501]},"%"]}]}],n:52,i:"id",r:"gases",p:[12,4,434]}]}],n:52,r:"adata.sensors",p:[2,3,73]}]}," ",{t:4,f:[{p:{button:[{p:[23,5,704],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[25,5,792],t:7,e:"ui-section",a:{label:"Input Injector"},f:[{p:[26,7,835],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputting"],s:'_0?"power-off":"close"'},p:[26,24,852]}],style:[{t:2,x:{r:["data.inputting"],s:'_0?"selected":null'},p:[26,75,903]}],action:"input"},f:[{t:2,x:{r:["data.inputting"],s:'_0?"Injecting":"Off"'},p:[27,9,968]}]}]}," ",{p:[29,5,1044],t:7,e:"ui-section",a:{label:"Input Rate"},f:[{p:[30,7,1083],t:7,e:"span",f:[{t:2,x:{r:["adata.inputRate"],s:"Math.fixed(_0)"},p:[30,13,1089]}," L/s"]}]}," ",{p:[32,5,1156],t:7,e:"ui-section",a:{label:"Output Regulator"},f:[{p:[33,7,1201],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputting"],s:'_0?"power-off":"close"'},p:[33,24,1218]}],style:[{t:2,x:{r:["data.outputting"],s:'_0?"selected":null'},p:[33,76,1270]}],action:"output"},f:[{t:2,x:{r:["data.outputting"],s:'_0?"Open":"Closed"'},p:[34,9,1337]}]}]}," ",{p:[36,5,1412],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[37,7,1456],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure"},f:[{t:2,x:{r:["adata.outputPressure"],s:"Math.round(_0)"},p:[37,50,1499]}," kPa"]}]}]}],n:50,r:"data.tank",p:[20,1,618]}]},e.exports=a.extend(r.exports)},{341:341}],367:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,518],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[9,11,524]}," kPa"]}]}," ",{p:[11,3,586],t:7,e:"ui-section",a:{label:"Filter"},f:[{t:4,f:[{p:[13,7,654],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[13,25,672]}],action:"filter",params:['{"mode": ',{t:2,r:"id",p:[14,42,748]},"}"]},f:[{t:2,r:"name",p:[14,51,757]}]}],n:52,r:"data.filter_types",p:[12,5,619]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],368:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,522],t:7,e:"span",f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,11,528]}," kPa"]}]}," ",{p:[11,3,594],t:7,e:"ui-section",a:{label:"Node 1"},f:[{p:[12,5,627],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[12,44,666]}],action:"node1",params:'{"concentration": -0.1}'}}," ",{p:[14,5,783],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[14,39,817]}],action:"node1",params:'{"concentration": -0.01}'}}," ",{p:[16,5,935],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[16,38,968]}],action:"node1",params:'{"concentration": 0.01}'}}," ",{p:[18,5,1087],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[18,43,1125]}],action:"node1",params:'{"concentration": 0.1}'}}," ",{p:[20,5,1243],t:7,e:"span",f:[{t:2,x:{r:["adata.node1_concentration"],s:"Math.round(_0)"},p:[20,11,1249]},"%"]}]}," ",{p:[22,3,1319],t:7,e:"ui-section",a:{label:"Node 2"},f:[{p:[23,5,1352],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[23,44,1391]}],action:"node2",params:'{"concentration": -0.1}'}}," ",{p:[25,5,1508],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[25,39,1542]}],action:"node2",params:'{"concentration": -0.01}'}}," ",{p:[27,5,1660],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[27,38,1693]}],action:"node2",params:'{"concentration": 0.01}'}}," ",{p:[29,5,1812],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[29,43,1850]}],action:"node2",params:'{"concentration": 0.1}'}}," ",{p:[31,5,1968],t:7,e:"span",f:[{t:2,x:{r:["adata.node2_concentration"],s:"Math.round(_0)"},p:[31,11,1974]},"%"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],369:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{t:4,f:[{p:[7,5,250],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{p:[8,7,292],t:7,e:"ui-button",a:{icon:"pencil",action:"rate",params:'{"rate": "input"}'},f:["Set"]}," ",{p:[9,7,381],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.rate","data.max_rate"],s:'_0==_1?"disabled":null'},p:[9,37,411]}],action:"rate",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,525],t:7,e:"span",f:[{t:2,x:{r:["adata.rate"],s:"Math.round(_0)"},p:[10,13,531]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,223]},{t:4,n:51,f:[{p:[13,5,605],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,649],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,746],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,776]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,906],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,912]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=a.extend(r.exports)},{341:341}],370:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,72],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"data.borg.name",p:[1,20,19]}],button:0},f:[" ",{p:[5,2,149],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[6,4,181],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.emagged"],s:'_0?"check-square-o":"square-o"'},p:[6,21,198]}],style:[{t:2,x:{r:["data.borg.emagged"],s:'_0?"selected":null'},p:[6,83,260]}],action:"toggle_emagged"},f:["Emagged"]}," ",{p:[7,4,351],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.lockdown"],s:'_0?"check-square-o":"square-o"'},p:[7,21,368]}],style:[{t:2,x:{r:["data.borg.lockdown"],s:'_0?"selected":null'},p:[7,84,431]}],action:"toggle_lockdown"},f:["Locked down"]}," ",{p:[8,4,528],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.scrambledcodes"],s:'_0?"check-square-o":"square-o"'},p:[8,21,545]}],style:[{t:2,x:{r:["data.borg.scrambledcodes"],s:'_0?"selected":null'},p:[8,90,614]}],action:"toggle_scrambledcodes"},f:["Scrambled codes"]}]}," ",{p:[10,2,741],t:7,e:"ui-section",a:{label:"Charge"},f:[{t:4,f:[{p:[12,4,803],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.cell.maxcharge",p:[12,25,824]}],value:[{t:2,r:"data.cell.charge",p:[12,57,856]}]},f:[{t:2,x:{r:["data.cell.charge"],s:"Math.round(_0)"},p:[12,79,878]}," / ",{t:2,x:{r:["data.cell.maxcharge"],s:"Math.round(_0)"},p:[12,114,913]}]}],n:50,x:{r:["data.cell.missing"],s:"!_0"},p:[11,3,772]},{t:4,n:51,f:[{p:[14,4,974],t:7,e:"span",a:{"class":"warning"},f:["Cell missing"]},{p:[14,45,1015],t:7,e:"br"}],x:{r:["data.cell.missing"],s:"!_0"}}," ",{p:[16,3,1035],t:7,e:"ui-button",a:{icon:"pencil",action:"set_charge"},f:["Set"]},{p:[16,63,1095],t:7,e:"ui-button",a:{icon:"eject",action:"change_cell"},f:["Change"]},{p:[16,126,1158],t:7,e:"ui-button",a:{icon:"trash","class":"bad",action:"remove_cell"},f:["Remove"]}]}," ",{p:[18,2,1252],t:7,e:"ui-section",a:{label:"Radio channels"},f:[{t:4,f:[{p:[20,4,1319],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["installed"],s:'_0?"check-square-o":"square-o"'},p:[20,21,1336]}],style:[{t:2,x:{r:["installed"],s:'_0?"selected":null'},p:[20,75,1390]}],action:"toggle_radio",params:['{"channel": "',{t:2,r:"name",p:[20,154,1469]},'"}']},f:[{t:2,r:"name",p:[20,166,1481]}]}],n:52,r:"data.channels",p:[19,3,1291]}]}," ",{p:[23,2,1533],t:7,e:"ui-section",a:{label:"Module"},f:[{t:4,f:[{p:[25,4,1591],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.active_module","type"],s:'_0==_1?"check-square-o":"square-o"'},p:[25,21,1608]}],style:[{t:2,x:{r:["data.borg.active_module","type"],s:'_0==_1?"selected":null'},p:[25,97,1684]}],action:"setmodule",params:['{"module": "',{t:2,r:"type",p:[25,193,1780]},'"}']},f:[{t:2,r:"name",p:[25,205,1792]}]}],n:52,r:"data.modules",p:[24,3,1564]}]}," ",{p:[28,2,1844],t:7,e:"ui-section",a:{label:"Upgrades"},f:[{t:4,f:[{p:[30,4,1905],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["installed"],s:'_0?"check-square-o":"square-o"'},p:[30,21,1922]}],style:[{t:2,x:{r:["installed"],s:'_0?"selected":null'},p:[30,75,1976]}],action:"toggle_upgrade",params:['{"upgrade": "',{t:2,r:"type",p:[30,155,2056]},'"}']},f:[{t:2,r:"name",p:[30,167,2068]}]}],n:52,r:"data.upgrades",p:[29,3,1877]}]}," ",{p:[33,2,2120],t:7,e:"ui-section",a:{label:"Master AI"},f:[{t:4,f:[{p:[35,4,2177],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["connected"],s:'_0?"check-square-o":"square-o"'},p:[35,21,2194]}],style:[{t:2,x:{r:["connected"],s:'_0?"selected":null'},p:[35,75,2248]}],action:"slavetoai",params:['{"slavetoai": "',{t:2,r:"ref",p:[35,152,2325]},'"}']},f:[{t:2,r:"name",p:[35,163,2336]}]}],n:52,r:"data.ais",p:[34,3,2154]}]}]}," ",{p:{button:[{p:[41,3,2460],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.lawupdate"],s:'_0?"check-square-o":"square-o"'},p:[41,20,2477]}],style:[{t:2,x:{r:["data.borg.lawupdate"],s:'_0?"selected":null'},p:[41,84,2541]}],action:"toggle_lawupdate"},f:["Lawsync"]}]},t:7,e:"ui-display",a:{title:"Laws",button:0},f:[" ",{t:4,f:[{p:[44,3,2672],t:7,e:"p",f:[{t:2,r:".",p:[44,6,2675]}]}],n:52,r:"data.laws",p:[43,2,2649]}]}]},e.exports=a.extend(r.exports)},{341:341}],371:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"selected":null'},p:[3,38,100]}],action:[{t:2,x:{r:["data.timing"],s:'_0?"stop":"start"'},p:[3,83,145]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"Stop":"Start"'},p:[3,119,181]}]}," ",{p:[4,5,233],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"flash",style:[{t:2,x:{r:["data.flash_charging"],s:'_0?"disabled":null'},p:[4,57,285]}]},f:[{t:2,x:{r:["data.flash_charging"],s:'_0?"Recharging":"Flash"'},p:[4,102,330]}]}]},t:7,e:"ui-display",a:{title:"Cell Timer",button:0},f:[" ",{p:[6,3,410],t:7,e:"ui-section",f:[{p:[7,5,428],t:7,e:"ui-button",a:{icon:"fast-backward",action:"time",params:'{"adjust": -600}'}}," ",{p:[8,5,518],t:7,e:"ui-button",a:{icon:"backward",action:"time",params:'{"adjust": -100}'}}," ",{p:[9,5,603],t:7,e:"span",f:[{t:2,x:{r:["text","data.minutes"],s:"_0.zeroPad(_1,2)"},p:[9,11,609]},":",{t:2,x:{r:["text","data.seconds"],s:"_0.zeroPad(_1,2)"},p:[9,45,643]}]}," ",{p:[10,5,689],t:7,e:"ui-button",a:{icon:"forward",action:"time",params:'{"adjust": 100}'}}," ",{p:[11,5,772],t:7,e:"ui-button",a:{icon:"fast-forward",action:"time",params:'{"adjust": 600}'}}]}," ",{p:[13,3,875],t:7,e:"ui-section",f:[{p:[14,7,895],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "short"}'},f:["Short"]}," ",{p:[15,7,999],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "medium"}'},f:["Medium"]}," ",{p:[16,7,1105],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "long"}'},f:["Long"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],372:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Bluespace Artillery Control",button:0},f:[{t:4,f:[{p:[8,3,167],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,5,200],t:7,e:"ui-button",a:{icon:"crosshairs",action:"recalibrate"},f:[{t:2,r:"data.target",p:[9,55,250]}]}]}," ",{p:[11,3,298],t:7,e:"ui-section",a:{label:"Controls"},f:[{t:4,f:[{p:[13,3,356],t:7,e:"ui-notice",f:[{p:[14,4,372],t:7,e:"span",f:["Bluespace Artillery firing protocols must be globally unlocked from two keycard authentication devices first!"]}]}],n:50,x:{r:["data.unlocked"],s:"!_0"},p:[12,2,330]},{t:4,n:51,f:[{p:[17,3,525],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.ready"],s:'_0?null:"disabled"'},p:[17,36,558]}],action:"fire"},f:["FIRE!"]}],x:{r:["data.unlocked"],s:"!_0"}}]}],n:50,r:"data.connected",p:[7,3,141]}," ",{t:4,f:[{p:[22,3,694],t:7,e:"ui-section",a:{label:"Maintenance"},f:[{p:[23,7,734],t:7,e:"ui-button",a:{icon:"wrench",action:"build"},f:["Complete Deployment."]}]}],n:50,x:{r:["data.connected"],s:"!_0"},p:[21,3,667]}]}]},e.exports=a.extend(r.exports)},{341:341}],373:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,185],t:7,e:"ui-button",a:{icon:"pencil",action:"relabel"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,266],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,301],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,307]}," kPa"]}]}," ",{p:[11,3,373],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,404],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,417]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,462]}]}]}," ",{t:4,f:[{p:[15,3,573],t:7,e:"ui-section",a:{label:"Access"},f:[{p:[16,7,608],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.restricted"],s:'_0?"lock":"unlock"'},p:[16,24,625]}],style:[{t:2,x:{r:[],s:'"caution"'},p:[17,14,680]}],action:"restricted"},f:[{t:2,x:{r:["data.restricted"],s:'_0?"Restricted to Engineering":"Public"'},p:[18,27,722]}]}]}],n:50,r:"data.isPrototype",p:[14,3,544]}]}," ",{p:[22,1,839],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[23,3,869],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[24,5,912],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[24,18,925]}],max:[{t:2,r:"data.maxReleasePressure",p:[24,52,959]}],value:[{t:2,r:"data.releasePressure",p:[25,14,1002]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[25,40,1028]}," kPa"]}]}," ",{p:[27,3,1099],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[28,5,1144],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[28,38,1177]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[30,5,1333],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[30,36,1364]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1511],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1606],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1636]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1798],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1830],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1847]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1901]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1995]}]}]}]}," ",{t:4,f:[{p:[42,1,2090],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2155],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2196],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2229]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2358],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2389]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2520],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2552]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2637],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2667]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2133]}," ",{p:[55,3,2833],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2866],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2899]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2969]}]}," ",{p:[59,2,3017],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3064],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3070]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2062]},{p:{button:[{t:4,f:[{p:[69,7,3277],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3308]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3242]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3442],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3473]}]}," ",{p:[76,3,3519],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3553]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3411]},{t:4,n:51,f:[{p:[80,3,3635],t:7,e:"ui-section",f:[{p:[81,4,3652],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{341:341}],374:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"CentCom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],t:7,e:"span",a:{"class":"bad"},f:["Loaned to CentCom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove", -params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"desc",p:[85,31,2720]}],"tooltip-side":"left",action:"add",params:['{"id": "',{t:2,r:"id",p:[85,90,2779]},'"}']},f:[{t:2,r:"cost",p:[85,100,2789]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{341:341}],375:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,174],t:7,e:"ui-notice",f:[{t:4,f:[{p:[14,5,220],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[15,7,263],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[15,24,280]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[15,75,331]}]}]}],n:50,r:"data.siliconUser",p:[13,3,189]},{t:4,n:51,f:[{p:[18,5,422],t:7,e:"span",f:["Swipe a QM-Level ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[18,39,456]}," this interface."]}],r:"data.siliconUser"}]}," ",{t:4,f:[{p:[23,3,568],t:7,e:"ui-display",a:{title:"Express Cargo Console"},f:[{p:[25,5,618],t:7,e:"ui-section",a:{label:"Landing Location"},f:[{p:[26,7,663],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.usingBeacon"],s:'_0?null:"selected"'},p:[26,25,681]}],action:"LZCargo"},f:["Cargo Bay"]}," ",{p:[27,7,770],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.hasBeacon","data.usingBeacon"],s:'_0?_1?"selected":null:"disabled"'},p:[27,25,788]}],action:"LZBeacon"},f:[{t:2,r:"data.beaconzone",p:[27,116,879]}," (",{t:2,r:"data.beaconName",p:[27,137,900]},")"]}," ",{p:[28,7,940],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.canBuyBeacon"],s:'_0?null:"disabled"'},p:[28,25,958]}],action:"printBeacon"},f:[{t:2,r:"data.printMsg",p:[28,90,1023]}]}]}," ",{p:[31,5,1079],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[32,7,1115],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[32,13,1121]}]}]}," ",{p:[35,5,1183],t:7,e:"ui-section",a:{label:"Notice"},f:[{p:[36,7,1218],t:7,e:"span",f:[{t:2,r:"data.message",p:[36,13,1224]}]}]}]}," ",{p:[39,3,1287],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[39,18,1302]}]},f:[{t:4,f:[{p:[41,7,1349],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[41,18,1360]}]},f:[{t:4,f:[{p:[43,11,1407],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[43,30,1426]}],candystripe:0,right:0},f:[{p:[44,13,1468],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.canBeacon"],s:'_0?null:"disabled"'},p:[44,31,1486]}],tooltip:[{t:2,r:"desc",p:[44,80,1535]}],"tooltip-side":"left",action:"add",params:['{"id": "',{t:2,r:"id",p:[44,139,1594]},'"}']},f:[{t:2,r:"cost",p:[44,149,1604]}," Credits ",{t:2,r:"data.beaconError",p:[44,166,1621]}]}]}],n:52,r:"packs",p:[42,9,1380]}]}],n:52,r:"data.supplies",p:[40,5,1318]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[22,1,543]}]},e.exports=a.extend(r.exports)},{341:341}],376:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,49],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,82]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,169],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,226]}]}]}," ",{p:[8,1,293],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,335],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,354]}],candystripe:0,right:0},f:[{p:[11,5,388],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,394]}]}," ",{p:[12,5,415],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,421]}]}," ",{p:[13,5,446],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,458]}]}," ",{p:[14,5,483],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,508]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,615]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,635]}]}]}],n:52,r:"data.abilities",p:[9,1,307]},{t:4,f:[{p:[23,3,738],t:7,e:"span",a:{"class":"warning"},f:["No abilities available."]}],n:51,r:"data.abilities",p:[22,1,715]}]}]},e.exports=a.extend(r.exports)},{341:341}],377:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["To use this, simply spawn the atoms you want in one of the four Centcom Supplypod Bays. Items in the bay will then be launched inside your supplypod, one turf-full at a time! You can optionally use the following buttons to configure how the supplypod acts."]}]}," ",{p:[5,1,304],t:7,e:"ui-display",a:{title:"Centcom Pod Customization (to be used against helen weinstein)"},f:[{p:[6,4,392],t:7,e:"ui-section",a:{label:"Which supplypod bay will you use?"},f:[{p:[7,9,458],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==1?"selected":null'},p:[7,27,476]}],action:"bay1"},f:["Bay #1"]}," ",{p:[8,9,557],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==2?"selected":null'},p:[8,27,575]}],action:"bay2"},f:["Bay #2"]}," ",{p:[9,9,656],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==3?"selected":null'},p:[9,27,674]}],action:"bay3"},f:["Bay #3"]}," ",{p:[10,9,755],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==4?"selected":null'},p:[10,27,773]}],action:"bay4"},f:["Bay #4"]}]}," ",{p:[13,5,871],t:7,e:"ui-section",a:{label:"Useful teleport tools!"},f:[{p:[14,9,926],t:7,e:"ui-button",a:{action:"teleportCentcom"},f:["Teleport to Centcom's Supplypod Loading Bay"]}," ",{p:[15,9,1027],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.oldArea"],s:'_0?null:"disabled"'},p:[15,27,1045]}],action:"teleportBack"},f:["Teleport Back to ",{t:2,x:{r:["data.oldArea"],s:'_0?_0:"where you were"'},p:[15,103,1121]}]}]}," ",{p:[18,5,1210],t:7,e:"ui-section",a:{label:"Keep stuff after launching?"},f:[{p:[19,9,1268],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.launchClone"],s:'_0?"selected":null'},p:[19,27,1286]}],action:"launchClone","tooltip-side":"left",tooltip:"Choosing this will create a duplicate of the item to be launched in Centcom, allowing you to send one type of item multiple times. Either way, the atoms are forceMoved into the supplypod after it lands (but before it opens)."},f:["Clone and Launch"]}]}," ",{p:[23,5,1668],t:7,e:"ui-section",a:{label:"Launch all at once?"},f:[{p:[24,9,1718],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.launchChoice"],s:'_0==1?"selected":null'},p:[24,27,1736]}],action:"launchOrdered","tooltip-side":"left",tooltip:'Instead of launching everything in the bay at once, this will "scan" things (one turf-full at a time) in order, left to right and top to bottom. Refreshing will reset the "scanner" to the top-leftmost position.'},f:["Ordered"]}," ",{p:[26,9,2086],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.launchChoice"],s:'_0==2?"selected":null'},p:[26,27,2104]}],action:"launchRandom","tooltip-side":"left",tooltip:"Instead of launching everything in the bay at once, this will launch one random turf of items at a time."},f:["Random"]}]}," ",{p:[30,5,2362],t:7,e:"ui-section",a:{label:"Add an explosion?"},f:[{p:[31,9,2410],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.explosionChoice"],s:'_0==1?"selected":null'},p:[31,27,2428]}],action:"explosionCustom","tooltip-side":"left",tooltip:"This will cause an explosion of whatever size you like (including flame range) to occur as soon as the supplypod lands. Dont worry, supply-pods are explosion-proof!"},f:["Custom Size"]}," ",{p:[33,9,2740],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.explosionChoice"],s:'_0==2?"selected":null'},p:[33,27,2758]}],action:"explosionBus","tooltip-side":"left",tooltip:"This will cause a maxcap explosion (dependent on server config) to occur as soon as the supplypod lands. Dont worry, supply-pods are explosion-proof!"},f:["Adminbus"]}]}," ",{p:[37,5,3066],t:7,e:"ui-section",a:{label:"Extra damage?","(default":"None)"},f:[{p:[38,9,3127],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.damageChoice"],s:'_0==1?"selected":null'},p:[38,27,3145]}],action:"damageCustom","tooltip-side":"left",tooltip:"Anyone caught under the pod when it lands will be dealt this amount of brute damage. Sucks to be them!"},f:["Custom Damage"]}," ",{p:[40,9,3392],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.damageChoice"],s:'_0==2?"selected":null'},p:[40,27,3410]}],action:"damageGib","tooltip-side":"left",tooltip:"This will attempt to gib any mob caught under the pod when it lands, as well as dealing a nice 5000 brute damage. Ya know, just to be sure!"},f:["Gib"]}]}," ",{p:[44,5,3698],t:7,e:"ui-section",a:{label:"Extra effects?"},f:[{p:[45,9,3743],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectStun"],s:'_0?"selected":null'},p:[45,27,3761]}],action:"effectStun","tooltip-side":"left",tooltip:"Anyone who is on the turf when the supplypod is launched will be stunned until the supplypod lands. They cant get away that easy!"},f:["Stun"]}," ",{p:[47,9,4017],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectLimb"],s:'_0?"selected":null'},p:[47,27,4035]}],action:"effectLimb","tooltip-side":"left",tooltip:"This will cause anyone caught under the pod to lose a limb, excluding their head."},f:["Delimb"]}," ",{p:[49,9,4245],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectBluespace"],s:'_0?"selected":null'},p:[49,27,4263]}],action:"effectBluespace","tooltip-side":"left",tooltip:"Gives the supplypod an advanced Bluespace Recyling Device. After opening, the supplypod will be warped directly to the surface of a nearby NT-designated trash planet (/r/ss13)."},f:["Bluespace"]}," ",{p:[51,9,4581],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectStealth"],s:'_0?"selected":null'},p:[51,27,4599]}],action:"effectStealth","tooltip-side":"left",tooltip:'This hides the red target icon from appearing when you launch the supplypod. Combos well with the "Invisible" style. Sneak attack, go!'},f:["Stealth"]}," ",{p:[53,9,4869],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectQuiet"],s:'_0?"selected":null'},p:[53,27,4887]}],action:"effectQuiet","tooltip-side":"left",tooltip:"This will keep the supplypod from making any sounds, except for those specifically set by admins in the Sound section."},f:["Quiet Landing"]}," ",{p:[55,9,5143],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectReverse"],s:'_0?"selected":null'},p:[55,27,5161]}],action:"effectReverse","tooltip-side":"left",tooltip:"This pod will not send any items. Instead, after landing, the supplypod will close (similar to a normal closet closing), and then launch back to the right centcom bay to drop off any new contents."},f:["Reverse Mode"]}," ",{p:[57,9,5498],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectMissile"],s:'_0?"selected":null'},p:[57,27,5516]}],action:"effectMissile","tooltip-side":"left",tooltip:"This pod will not send any items. Instead, it will immediatley delete after landing (Similar visually to setting openDelay & departDelay to 0, but this looks nicer). Useful if you just wanna fuck some shit up. Combos well with the Missile style."},f:["Missile Mode"]}," ",{p:[59,9,5902],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectCircle"],s:'_0?"selected":null'},p:[59,27,5920]}],action:"effectCircle","tooltip-side":"left",tooltip:"This will make the supplypod come in from any angle. Im not sure why this feature exists, but here it is."},f:["Any Descent Angle"]}," ",{p:[61,9,6169],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectBurst"],s:'_0?"selected":null'},p:[61,27,6187]}],action:"effectBurst","tooltip-side":"left",tooltip:"This will make each click launch 5 supplypods inaccuratly around the target turf (a 3x3 area). Combos well with the Missle Mode if you dont want shit lying everywhere after."},f:["Machine Gun Mode"]}," ",{p:[63,9,6501],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectTarget"],s:'_0?"selected":null'},p:[63,27,6519]}],action:"effectTarget","tooltip-side":"left",tooltip:"This will make the supplypod target a specific atom, instead of the mouses position. Smiting does this automatically!"},f:["Specific Target"]}," ",{p:[65,9,6778],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectName"],s:'_0?"selected":null'},p:[65,27,6796]}],action:"effectName","tooltip-side":"left",tooltip:"Allows you to add a custom name and description."},f:["Custom Name/Desc"]}]}," ",{p:[69,5,7e3],t:7,e:"ui-section",a:{label:"Sound?"},f:[{p:[70,9,7037],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.landingSound"],s:'_0?"selected":null'},p:[70,27,7055]}],action:"landingSound","tooltip-side":"left",tooltip:"Choose a sound to play when the pod lands."},f:["Custom Landing Sound"]}," ",{p:[72,10,7245],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.openingSound"],s:'_0?"selected":null'},p:[72,28,7263]}],action:"openingSound","tooltip-side":"left",tooltip:"Choose a sound to play when the pod opens."},f:["Custom Opening Sound"]}," ",{p:[74,9,7452],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.leavingSound"],s:'_0?"selected":null'},p:[74,27,7470]}],action:"leavingSound","tooltip-side":"left",tooltip:"Choose a sound to play when the pod departs (whether that be delection in the case of a bluespace pod, or leaving for centcom for a reversing pod)."},f:["Custom Leaving Sound"]}," ",{p:[76,9,7764],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.soundVolume"],s:'_0?"selected":null'},p:[76,27,7782]}],action:"soundVolume","tooltip-side":"left",tooltip:"Choose the volume for the sound to play at. Default values are between 1 and 100, but hey, do whatever. Im a tooltip, not a cop."},f:["Admin Sound Volume"]}]}," ",{p:[80,5,8070],t:7,e:"ui-section",a:{label:"Delay timers?"},f:[{p:[81,9,8114],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.landingDelay"],s:'_0!=5?"selected":null'},p:[81,27,8132]}],action:"landingDelay","tooltip-side":"left",tooltip:"Choose the amount of time it takes for the supplypod to hit the station. By default this value is 0.5 seconds."},f:["Custom Landing Time"]}," ",{p:[83,10,8394],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.openingDelay"],s:'_0!=30?"selected":null'},p:[83,28,8412]}],action:"openingDelay","tooltip-side":"left",tooltip:"Choose the amount of time it takes for the supplypod to open after landing. Useful for giving whatevers inside the pod a nice dramatic entrance! By default this value is 3 seconds."},f:["Custom Opening Time"]}," ",{p:[85,9,8744],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.departureDelay"],s:'_0!=30?"selected":null'},p:[85,27,8762]}],action:"departureDelay","tooltip-side":"left",tooltip:"Choose the amount of time it takes for the supplypod to leave after landing. By default this value is 3 seconds."},f:["Custom Leaving Time"]}]}," ",{p:[89,5,9047],t:7,e:"ui-section",a:{label:"Style?"},f:[{p:[90,9,9084],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==1?"selected":null'},p:[90,27,9102]}],action:"styleStandard","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to your standard Nanotrasen black and orange. Same color scheme as the normal station-used supplypods."},f:["Standard"]}," ",{p:[92,9,9405],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==2?"selected":null'},p:[92,27,9423]}],action:"styleBluespace","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to the same as the stations upgraded blue-and-white Bluespace Supplypods."},f:["Advanced"]}," ",{p:[94,9,9698],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==4?"selected":null'},p:[94,27,9716]}],action:"styleSyndie","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to a menacing black and blood-red. Great for sending meme-ops in style!"},f:["Syndicate"]}," ",{p:[96,9,9987],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==5?"selected":null'},p:[96,27,10005]}],action:"styleBlue","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to a menacing black and dark blue. Great for sending deathsquads in style!"},f:["Deathsquad"]}," ",{p:[98,10,10279],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==6?"selected":null'},p:[98,28,10297]}],action:"styleCult","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a blood and rune covered cult pod!"},f:["Cult Pod"]}," ",{p:[100,9,10524],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==7?"selected":null'},p:[100,27,10542]}],action:"styleMissile","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a large missile. Combos well with a missile mode, so the missile doesnt stick around after landing."},f:["Missile"]}," ",{p:[102,9,10836],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==8?"selected":null'},p:[102,27,10854]}],action:"styleSMissile","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a large blood-red missile. Combos well with missile mode, so the missile doesnt stick around after landing."},f:["Syndicate Missile"]}," ",{p:[104,9,11167],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==9?"selected":null'},p:[104,27,11185]}],action:"styleBox","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a large, dark-green military supply crate."},f:["Supply Crate"]}," ",{p:[106,9,11423],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==10?"selected":null'},p:[106,27,11441]}],action:"styleHONK","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to a colorful, clown inspired look."},f:["HONK"]}," ",{p:[108,9,11670],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==11?"selected":null'},p:[108,27,11688]}],action:"styleFruit","tooltip-side":"left",tooltip:"for when an orange is angry"},f:["Fruit~"]}," ",{p:[110,9,11851],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==12?"selected":null'},p:[110,27,11869]}],action:"styleInvisible","tooltip-side":"left",tooltip:'Makes the supplypod invisible! Useful for when you want to use this feature with a gateway or something. Combos well with the "Stealth" and "Quiet Landing" effects.'},f:["Invisible"]}," ",{p:[112,9,12175],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==13?"selected":null'},p:[112,27,12193]}],action:"styleGondola","tooltip-side":"left",tooltip:"this gondola can control when he wants to deliver his supplies if he has a smart enough mind, so offer up his body to ghosts for maximum enjoyment. (Make sure to turn off bluespace and set a arbitrarily high open-time if you do!)"},f:["Gondola (alive)"]}]}]}," ",{p:[117,1,12597],t:7,e:"ui-display",f:[{p:[118,5,12615],t:7,e:"ui-section",a:{label:[{t:2,r:"data.numObjects",p:[118,26,12636]}," turfs with launchable atoms found in Bay #",{t:2,r:"data.bay",p:[118,88,12698]}]},f:[{p:[119,9,12722],t:7,e:"ui-button",a:{action:"refresh","tooltip-side":"right",tooltip:"Manually refreshes the possible things to launch in the pod bay."},f:["Refresh Pod Bay"]}]}," ",{p:[123,5,12909],t:7,e:"ui-section",f:[{p:[124,9,12931],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.giveLauncher"],s:'_0?"selected":null'},p:[124,27,12949]}],action:"giveLauncher","tooltip-side":"right",tooltip:"THE CODEX ASTARTES CALLS THIS MANEUVER: STEEL RAIN!!"},f:["Enter Launch Mode"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],378:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:[6,1,206],t:7,e:"ui-display",a:{title:"Saved Recipes",button:0},f:[{p:[7,3,251],t:7,e:"ui-section",f:[{p:[8,5,269],t:7,e:"ui-button",a:{icon:"plus",action:"add_recipe"},f:["Add Recipe"]}," ",{p:[9,2,337],t:7,e:"ui-button",a:{icon:"minus",action:"clear_recipes"},f:["Clear Recipes"]}," ",{t:4,f:[{p:[11,7,445],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense_recipe",params:['{"recipe": "',{t:2,r:"contents",p:[11,80,518]},'"}']},f:[{t:2,r:"recipe_name",p:[11,96,534]}]}],n:52,r:"data.recipes",p:[10,5,415]}]}]}," ",{p:{button:[{t:4,f:[{p:[18,7,719],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[18,37,749]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[18,114,826]},"}"]},f:[{t:2,r:".",p:[18,122,834]}]}],n:52,r:"data.beakerTransferAmounts",p:[17,5,675]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[21,3,886],t:7,e:"ui-section",f:[{t:4,f:[{p:[23,7,936],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[23,74,1003]},'"}']},f:[{t:2,r:"title",p:[23,84,1013]}]}],n:52,r:"data.chemicals",p:[22,5,904]}]}]}," ",{p:{button:[{t:4,f:[{p:[30,7,1190],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[30,66,1249]},"}"]},f:[{t:2,r:".",p:[30,74,1257]}]}],n:52,r:"data.beakerTransferAmounts",p:[29,5,1146]}," ",{p:[32,5,1295],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[32,36,1326]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[34,3,1423],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[36,7,1493],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[36,13,1499]},"/",{t:2,r:"data.beakerMaxVolume",p:[36,55,1541]}," Units"]}," ",{p:[37,7,1586],t:7,e:"br"}," ",{t:4,f:[{p:[39,9,1639],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[39,52,1682]}," units of ",{t:2,r:"name",p:[39,87,1717]}]},{p:[39,102,1732],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[38,7,1599]},{t:4,n:51,f:[{p:[41,9,1763],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[35,5,1458]},{t:4,n:51,f:[{p:[44,7,1839],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],379:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,421]}," K"]}]}]}," ",{p:{button:[{p:[14,5,564],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,595]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,692],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,762],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,781]}," K"]}," ",{p:[19,7,831],t:7,e:"br"}," ",{t:4,f:[{p:[21,9,885],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[21,52,928]}," units of ",{t:2,r:"name",p:[21,87,963]}]},{p:[21,102,978],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[20,7,845]},{t:4,n:51,f:[{p:[23,9,1009],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,727]},{t:4,n:51,f:[{p:[26,7,1085],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],380:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,32],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,87]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,143]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,199]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"No beaker"'},p:[7,5,268]}]}," ",{p:[10,3,340],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,426],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,445]}," units of ",{t:2,r:"name",p:[13,60,480]}],nowrap:0},f:[{p:[14,7,505],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,555],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,608]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,653],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,706]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,751],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,804]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,851],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,904]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,954],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1007]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1058],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[20,52,1102]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,390]},{t:4,n:51,f:[{p:[24,5,1184],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,357]},{t:4,n:51,f:[{p:[27,5,1255],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1343],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1374],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1412]}]},f:["Destroy"]}," ",{p:[34,3,1470],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1508]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1577],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1629],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1648]}," units of ",{t:2,r:"name",p:[37,59,1683]}],nowrap:0},f:[{p:[38,6,1707],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1756],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1811]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1855],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1910]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1954],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,2009]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2055],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2110]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2159],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2214]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2264],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[44,51,2308]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1594]}]}]}," ",{t:4,f:[{p:[52,3,2444],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2534],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[54,39,2568]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[54,88,2617]}]}," ",{p:[55,5,2698],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[55,27,2720]},"/",{t:2,r:"data.pillBotMaxContent",p:[55,51,2744]}]}],n:50,r:"data.isPillBottleLoaded",p:[53,4,2497]},{t:4,n:51,f:[{p:[57,5,2796],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[60,4,2860],t:7,e:"br"}," ",{p:[61,4,2870],t:7,e:"br"}," ",{p:[62,4,2880],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[62,63,2939]}]},f:["Create Pill (max 50µ)"]}," ",{p:[63,4,3023],t:7,e:"br"}," ",{p:[64,4,3033],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[64,63,3092]}]},f:["Create Multiple Pills"]}," ",{p:[65,4,3176],t:7,e:"br"}," ",{p:[66,4,3186],t:7,e:"br"}," ",{p:[67,4,3196],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[67,64,3256]}]},f:["Create Patch (max 40µ)"]}," ",{p:[68,4,3341],t:7,e:"br"}," ",{p:[69,4,3351],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[69,64,3411]}]},f:["Create Multiple Patches"]}," ",{p:[70,4,3497],t:7,e:"br"}," ",{p:[71,4,3507],t:7,e:"br"}," ",{p:[72,4,3517],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,65,3578]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[73,4,3664],t:7,e:"br"}," ",{p:[74,4,3674],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[74,65,3735]}]},f:["Dispense Buffer to Bottles"]}," ",{p:[75,4,3824],t:7,e:"br"}," ",{p:[76,4,3834],t:7,e:"br"}," ",{p:[77,4,3844],t:7,e:"ui-button",a:{action:"createVial",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[77,63,3903]}]},f:["Create Hypo Vial (max 30µ)"]}," ",{p:[78,4,3992],t:7,e:"br"}," ",{p:[79,4,4002],t:7,e:"ui-button",a:{action:"createVial",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[79,63,4061]}]},f:["Dispense Buffer to Hypo vials"]}," ",{p:[80,4,4154],t:7,e:"br"}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2421]},{t:4,n:51,f:[{p:[85,3,4197],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[86,4,4252], -t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[86,63,4311]}]},f:["Create Pack (max 10µ)"]}," ",{p:[87,4,4395],t:7,e:"br"}," ",{p:[88,4,4405],t:7,e:"br"}," ",{p:[89,4,4415],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[89,65,4476]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,1,0]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[93,2,4624],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[93,20,4642]}]},f:[{p:[94,3,4673],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[95,3,4721],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[95,46,4764]}]}," ",{p:[96,3,4807],t:7,e:"br"}," ",{p:[97,3,4816],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[98,3,4858],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[98,23,4878]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[98,69,4924]}]},f:[{t:2,r:"data.analyzeVars.color",p:[98,97,4952]}]}," ",{p:[99,3,4989],t:7,e:"br"}," ",{p:[100,3,4998],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[101,3,5040],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[101,25,5062]}]}," ",{p:[102,3,5099],t:7,e:"br"}," ",{p:[103,3,5108],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[104,3,5164],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[104,25,5186]},"µ/minute"]}," ",{p:[105,3,5234],t:7,e:"br"}," ",{p:[106,3,5243],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[107,3,5298],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[107,25,5320]}]}," ",{p:[108,3,5357],t:7,e:"br"}," ",{p:[109,3,5366],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[110,3,5422],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[110,25,5444]}]}," ",{p:[111,3,5482],t:7,e:"br"}," ",{p:[112,3,5491],t:7,e:"br"}," ",{p:[113,3,5500],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{341:341}],381:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Recipient Contents"},f:[{p:[2,2,42],t:7,e:"ui-section",f:[{p:[3,3,58],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[3,34,89]}],action:"ejectBeaker"},f:["Eject"]}," ",{p:[4,3,176],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[4,35,208]}],action:"input"},f:["Input"]}," ",{p:[5,3,289],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,35,321]}],action:"amount"},f:[{t:2,r:"data.amount",p:[5,96,382]},"U"]}," ",{p:[6,3,414],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"disabled":null'},p:[6,33,444]}],action:"makecup"},f:["Create Beaker"]}]}]}," ",{p:[9,1,564],t:7,e:"ui-display",a:{title:"Recipient"},f:[{p:[10,2,597],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[12,4,662],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[12,10,668]},"/",{t:2,r:"data.beakerMaxVolume",p:[12,52,710]}," Units"]}," ",{t:4,f:[{p:[14,5,788],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[14,48,831]}," units of ",{t:2,r:"name",p:[14,83,866]}]},{p:[14,98,881],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[13,4,752]},{t:4,n:51,f:[{p:[16,5,905],t:7,e:"span",a:{"class":"bad"},f:["Recipient Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,3,630]},{t:4,n:51,f:[{p:[19,4,976],t:7,e:"span",a:{"class":"average"},f:["No Recipient"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],382:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,43]}]}]}," ",{t:4,f:[{p:[5,3,149],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[6,3,165]}," ",{t:4,f:[{p:[8,4,231],t:7,e:"br"},{p:[8,8,235],t:7,e:"ui-button",a:{action:"rec_category",params:['{"category": "',{t:2,r:"name",p:[8,63,290]},'"}']},f:[{t:3,r:"name",p:[8,75,302]}," - ",{t:3,r:"desc",p:[8,88,315]}]}],n:52,r:"data.recollection_categories",p:[7,3,188]}," ",{t:3,r:"data.rec_section",p:[10,3,354]}," ",{t:3,r:"data.rec_binds",p:[11,3,380]}]}],n:50,r:"data.recollection",p:[4,1,120]},{t:4,n:51,f:[{p:[14,2,431],t:7,e:"ui-display",a:{title:"Power",button:0},f:[{p:[15,4,469],t:7,e:"ui-section",f:[{t:3,r:"data.power",p:[16,6,488]}]}]}," ",{p:[19,2,541],t:7,e:"ui-display",f:[{p:[20,3,557],t:7,e:"ui-section",f:[{p:[21,4,574],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[21,22,592]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[22,4,715],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[22,22,733]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[23,4,857],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[23,22,875]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[24,4,1014],t:7,e:"br"},{t:3,r:"data.tier_info",p:[24,8,1018]}]}," ",{p:[26,3,1059],t:7,e:"ui-section",f:[{t:3,r:"data.scripturecolors",p:[27,4,1076]}]},{p:[28,16,1119],t:7,e:"hr"}," ",{p:[29,3,1127],t:7,e:"ui-section",f:[{t:4,f:[{p:[31,4,1172],t:7,e:"div",f:[{p:[31,9,1177],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[31,29,1197]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[31,99,1267]},'"}']},f:["Recite ",{t:3,r:"required",p:[31,118,1286]}]}," ",{t:4,f:[{t:4,f:[{p:[34,6,1362],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[34,53,1409]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[34,72,1428]}]}],n:50,r:"bound",p:[33,5,1342]},{t:4,n:51,f:[{p:[36,6,1472],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[36,53,1519]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[32,6,1319]}," ",{t:3,r:"name",p:[39,6,1586]}," ",{t:3,r:"descname",p:[39,17,1597]}," ",{t:3,r:"invokers",p:[39,32,1612]}]}],n:52,r:"data.scripture",p:[30,3,1143]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{341:341}],383:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Codex Gigas"},f:[{p:[2,2,35],t:7,e:"ui-section",f:[{t:2,r:"data.name",p:[3,3,51]}]}," ",{p:[5,5,86],t:7,e:"ui-section",a:{label:"Prefix"},f:[{p:[6,3,117],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[6,22,136]}],action:"Dark "},f:["Dark"]}," ",{p:[7,3,221],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[7,22,240]}],action:"Hellish "},f:["Hellish"]}," ",{p:[8,3,331],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[8,22,350]}],action:"Fallen "},f:["Fallen"]}," ",{p:[9,3,439],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[9,22,458]}],action:"Fiery "},f:["Fiery"]}," ",{p:[10,3,545],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[10,22,564]}],action:"Sinful "},f:["Sinful"]}," ",{p:[11,3,653],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[11,22,672]}],action:"Blood "},f:["Blood"]}," ",{p:[12,3,759],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[12,22,778]}],action:"Fluffy "},f:["Fluffy"]}]}," ",{p:[14,5,888],t:7,e:"ui-section",a:{label:"Title"},f:[{p:[15,3,918],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[15,22,937]}],action:"Lord "},f:["Lord"]}," ",{p:[16,3,1022],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[16,22,1041]}],action:"Prelate "},f:["Prelate"]}," ",{p:[17,3,1132],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[17,22,1151]}],action:"Count "},f:["Count"]}," ",{p:[18,3,1238],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[18,22,1257]}],action:"Viscount "},f:["Viscount"]}," ",{p:[19,3,1350],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[19,22,1369]}],action:"Vizier "},f:["Vizier"]}," ",{p:[20,3,1458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[20,22,1477]}],action:"Elder "},f:["Elder"]}," ",{p:[21,3,1564],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[21,22,1583]}],action:"Adept "},f:["Adept"]}]}," ",{p:[23,5,1691],t:7,e:"ui-section",a:{label:"Name"},f:[{p:[24,3,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[24,22,1739]}],action:"hal"},f:["hal"]}," ",{p:[25,3,1821],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[25,22,1840]}],action:"ve"},f:["ve"]}," ",{p:[26,3,1920],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[26,22,1939]}],action:"odr"},f:["odr"]}," ",{p:[27,3,2021],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[27,22,2040]}],action:"neit"},f:["neit"]}," ",{p:[28,3,2124],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[28,22,2143]}],action:"ci"},f:["ci"]}," ",{p:[29,3,2223],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[29,22,2242]}],action:"quon"},f:["quon"]}," ",{p:[30,3,2326],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[30,22,2345]}],action:"mya"},f:["mya"]}," ",{p:[31,3,2427],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[31,22,2446]}],action:"folth"},f:["folth"]}," ",{p:[32,3,2532],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[32,22,2551]}],action:"wren"},f:["wren"]}," ",{p:[33,3,2635],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[33,22,2654]}],action:"geyr"},f:["geyr"]}," ",{p:[34,3,2738],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[34,22,2757]}],action:"hil"},f:["hil"]}," ",{p:[35,3,2839],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[35,22,2858]}],action:"niet"},f:["niet"]}," ",{p:[36,3,2942],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[36,22,2961]}],action:"twou"},f:["twou"]}," ",{p:[37,3,3045],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[37,22,3064]}],action:"phi"},f:["phi"]}," ",{p:[38,3,3146],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[38,22,3165]}],action:"coa"},f:["coa"]}]}," ",{p:[40,5,3268],t:7,e:"ui-section",a:{label:"suffix"},f:[{p:[41,3,3299],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[41,22,3318]}],action:" the Red"},f:["the Red"]}," ",{p:[42,3,3409],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[42,22,3428]}],action:" the Soulless"},f:["the Soulless"]}," ",{p:[43,3,3529],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[43,22,3548]}],action:" the Master"},f:["the Master"]}," ",{p:[44,3,3645],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[44,22,3664]}],action:", the Lord of all things"},f:["the Lord of all things"]}," ",{p:[45,3,3786],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[45,22,3805]}],action:", Jr."},f:["jr"]}]}," ",{p:[47,5,3909],t:7,e:"ui-section",a:{label:"submit"},f:[{p:[48,3,3941],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0>=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],384:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["Network Card"]}," allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["Processor Unit"]}," is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["Tesla Relay"]}," is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["Nano Printer"]}," is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["Card Reader"]}," adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{341:341}],385:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],386:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{isHead:function(t){return t%10==0},dept_class:function(t){return 0==t?"dept-cap":t>=10&&20>t?"dept-sec":t>=20&&30>t?"dept-med":t>=30&&40>t?"dept-sci":t>=40&&50>t?"dept-eng":t>=50&&60>t?"dept-cargo":t>=200&&230>t?"dept-cent":"dept-other"},health_state:function(t,e,n,a){var r=t+e+n+a;return 0>=r?"health-5":25>=r?"health-4":50>=r?"health-3":75>=r?"health-2":"health-0"}}}}(r),r.exports.css=" .health {\r\n width: 16px;\r\n height: 16px;\r\n background-color: #FFF;\r\n border: 1px solid #434343;\r\n position: relative;\r\n top: 2px;\r\n display: inline-block;\r\n }\r\n .health-5 { background-color: #17d568; }\r\n .health-4 { background-color: #2ecc71; }\r\n .health-3 { background-color: #e67e22; }\r\n .health-2 { background-color: #ed5100; }\r\n .health-1 { background-color: #e74c3c; }\r\n .health-0 { background-color: #ed2814; }\r\n\r\n .dept-cap {color : #C06616;}\r\n .dept-sec {color : #E74C3C;}\r\n .dept-med {color : #3498DB;}\r\n .dept-sci {color : #9B59B6;}\r\n .dept-eng {color : #F1C40F;}\r\n .dept-cargo {color : #F39C12;}\r\n .dept-cent {color : #00C100;}\r\n .dept-other {color: #C38312;}\r\n\r\n .oxy { color : #3498db; }\r\n .toxin { color : #2ecc71; }\r\n .burn { color : #e67e22; }\r\n .brute { color : #e74c3c; }\r\n\r\n table.crew{\r\n border-collapse: collapse;\r\n }\r\n\r\n table.crew td {\r\n padding : 0px 10px;\r\n }",r.exports.template={v:3,t:[" ",{p:[27,1,1030],t:7,e:"ui-display",f:[{p:[28,2,1045],t:7,e:"ui-section",f:[{p:[29,3,1061],t:7,e:"table",a:{"class":"crew"},f:[{p:[30,3,1085],t:7,e:"thead",f:[{p:[31,3,1096],t:7,e:"tr",f:[{p:[32,4,1105],t:7,e:"th",f:["Name"]}," ",{p:[33,4,1123],t:7,e:"th",f:["Status"]}," ",{p:[34,4,1143],t:7,e:"th",f:["Vitals"]}," ",{p:[35,4,1163],t:7,e:"th",f:["Position"]}," ",{t:4,f:[{p:[37,5,1216],t:7,e:"th",f:["Tracking"]}],n:50,r:"data.link_allowed",p:[36,4,1185]}]}]}," ",{p:[41,3,1270],t:7,e:"tbody",f:[{t:4,f:[{p:[43,4,1308],t:7,e:"tr",f:[{p:[44,5,1318],t:7,e:"td",f:[{p:[45,6,1329],t:7,e:"span",a:{"class":[{t:2,x:{r:["isHead","ijob"],s:'_0(_1)?"bold ":""'},p:[45,19,1342]},{t:2,x:{r:["dept_class","ijob"],s:"_0(_1)"},p:[45,49,1372]}]},f:[{t:2,r:"name",p:[46,7,1402]}," (",{t:2,r:"assignment",p:[46,17,1412]},") ",{p:[47,6,1434],t:7,e:"span",f:[]}]}]}," ",{p:[49,5,1457],t:7,e:"td",f:[{t:4,f:[{p:[51,7,1498],t:7,e:"span",a:{"class":["health ",{t:2,x:{r:["health_state","oxydam","toxdam","burndam","brutedam"],s:"_0(_1,_2,_3,_4)"},p:[51,27,1518]}]}}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[50,6,1468]},{t:4,n:51,f:[{t:4,f:[{p:[54,8,1626],t:7,e:"span",a:{"class":"health health-5"}}],n:50,r:"life_status",p:[53,7,1598]},{t:4,n:51,f:[{p:[56,8,1688],t:7,e:"span",a:{"class":"health health-0"}}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[60,5,1771],t:7,e:"td",f:[{t:4,f:[{p:[62,7,1812],t:7,e:"span",f:["( ",{p:[64,8,1836],t:7,e:"span",a:{"class":"oxy"},f:[{t:2,r:"oxydam",p:[64,26,1854]}]}," / ",{p:[66,8,1890],t:7,e:"span",a:{"class":"toxin"},f:[{t:2,r:"toxdam",p:[66,28,1910]}]}," / ",{p:[68,8,1946],t:7,e:"span",a:{"class":"burn"},f:[{t:2,r:"burndam",p:[68,27,1965]}]}," / ",{p:[70,8,2002],t:7,e:"span",a:{"class":"brute"},f:[{t:2,r:"brutedam",p:[70,28,2022]}]}," )"]}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[61,6,1782]},{t:4,n:51,f:[{t:4,f:[{p:[75,8,2116],t:7,e:"span",f:["Alive"]}],n:50,r:"life_status",p:[74,7,2088]},{t:4,n:51,f:[{p:[77,8,2159],t:7,e:"span",f:["Dead"]}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[81,5,2222],t:7,e:"td",f:[{t:4,f:[{p:[83,6,2260],t:7,e:"span",f:[{t:2,r:"area",p:[83,12,2266]}]}],n:50,x:{r:["pos_x"],s:"_0!=null"},p:[82,5,2232]},{t:4,n:51,f:[{p:[85,6,2302],t:7,e:"span",f:["N/A"]}],x:{r:["pos_x"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[89,6,2381],t:7,e:"td",f:[{p:[90,7,2393],t:7,e:"ui-button",a:{action:"select_person",state:[{t:2,x:{r:["can_track"],s:'_0?null:"disabled"'},p:[90,48,2434]}],params:['{"name":"',{t:2,r:"name",p:[90,100,2486]},'"}']},f:["Track"]}]}],n:50,r:"data.link_allowed",p:[88,5,2348]}]}],n:52,r:"data.sensors",p:[42,3,1281]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{341:341}],387:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,189],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,223],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,236]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,265]}]}]}," ",{p:[9,4,317],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[10,6,356],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.temperaturestatus",p:[10,19,369]}]},f:[{t:2,r:"data.occupant.bodyTemperature",p:[10,56,406]}," K"]}]}," ",{p:[12,5,472],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[13,7,507],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[13,20,520]}],max:[{t:2,r:"data.occupant.maxHealth",p:[13,54,554]}],value:[{t:2,r:"data.occupant.health",p:[13,90,590]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[14,16,632]}]},f:[{t:2,r:"data.occupant.health",p:[14,68,684]}]}]}," ",{t:4,f:[{p:[17,7,908],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[17,26,927]}]},f:[{p:[18,9,948],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[18,30,969]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,66,1005]}],state:"bad"},f:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,103,1042]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[16,5,742]}],n:50,r:"data.hasOccupant",p:[5,3,159]}]}," ",{p:[23,1,1138],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[24,3,1167],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[25,5,1199],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[25,22,1216]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[26,14,1276]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[27,14,1332]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[28,22,1391]}]}]}," ",{p:[30,3,1459],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,3,1495],t:7,e:"span",a:{"class":[{t:2,r:"data.temperaturestatus",p:[31,16,1508]}]},f:[{t:2,r:"data.cellTemperature",p:[31,44,1536]}," K"]}]}," ",{p:[33,2,1588],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[34,5,1619],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[34,22,1636]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[34,73,1687]}]}," ",{p:[35,5,1740],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[35,22,1757]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[35,86,1821]}]}]}]}," ",{p:{button:[{p:[40,5,1967],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[40,36,1998]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[42,3,2101],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[45,9,2211],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,r:"volume",p:[45,52,2254]}," units of ",{t:2,r:"name",p:[45,72,2274]}]},{p:[45,87,2289],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[44,7,2171]},{t:4,n:51,f:[{p:[47,9,2320],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[43,5,2136]},{t:4,n:51,f:[{p:[50,7,2396],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],388:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle"},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"' -},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],389:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{341:341}],390:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,183],t:7,e:"ui-section",a:{label:"Items in storage"},f:[{p:[7,4,225],t:7,e:"span",f:[{t:2,r:"data.items",p:[7,10,231]}]}]}],n:50,r:"data.items",p:[5,3,159]}," ",{t:4,f:[{p:[11,5,310],t:7,e:"ui-section",a:{label:"State"},f:[{p:[12,7,344],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[12,20,357]}]},f:[{t:2,r:"data.occupant.stat",p:[12,49,386]}]}]}," ",{p:[14,5,439],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[15,7,474],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[15,20,487]}],max:[{t:2,r:"data.occupant.maxHealth",p:[15,54,521]}],value:[{t:2,r:"data.occupant.health",p:[15,90,557]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[16,16,599]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[16,68,651]}]}]}," ",{t:4,f:[{p:[19,7,888],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[19,26,907]}]},f:[{p:[20,9,928],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[20,30,949]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[20,66,985]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[20,103,1022]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[18,5,722]}," ",{p:[23,5,1109],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[24,9,1145],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[24,22,1158]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[24,68,1204]}]}]}," ",{p:[26,5,1287],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[27,9,1323],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[27,22,1336]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[27,68,1382]}]}]}," ",{p:[29,5,1466],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[31,11,1553],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[31,54,1596]}," units of ",{t:2,r:"name",p:[31,89,1631]}]},{p:[31,104,1646],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[30,9,1508]},{t:4,n:51,f:[{p:[33,11,1681],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[10,3,283]}]}," ",{p:[38,1,1777],t:7,e:"ui-display",a:{title:"Operations"},f:[{p:[39,3,1812],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[41,7,1872],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied"],s:'_0?null:"disabled"'},p:[41,38,1903]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[41,111,1976]},'"}']},f:[{t:2,r:"name",p:[41,121,1986]}]},{p:[41,141,2006],t:7,e:"br"}],n:52,r:"data.chem",p:[40,5,1845]}]}," ",{p:[44,2,2046],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[45,6,2079],t:7,e:"ui-button",a:{icon:"sign-out",action:"eject"},f:["Eject Contents"]}]}," ",{p:[47,2,2166],t:7,e:"ui-section",a:{label:"Self Cleaning"},f:[{p:[48,3,2204],t:7,e:"ui-button",a:{icon:"recycle",action:"cleaning"},f:["Self-Clean Cycle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],391:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{341:341}],392:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{341:341}],393:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{341:341}],394:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{341:341}],395:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,20],t:7,e:"ui-notice",f:["Currently syncing with the database"]}],n:50,r:"data.sync",p:[1,1,0]},{t:4,n:51,f:[{p:{button:[{p:[8,4,163],t:7,e:"ui-button",a:{icon:"eject",action:"eject_all"},f:["Eject all"]}," ",{p:[9,4,232],t:7,e:"ui-button",a:{icon:["toggle-",{t:2,x:{r:["data.show_materials"],s:'_0?"off":"on"'},p:[9,28,256]}],action:"toggle_materials_visibility"},f:[{t:2,x:{r:["data.show_materials"],s:'_0?"Hide":"Show"'},p:[10,5,339]}]}]},t:7,e:"ui-display",a:{title:"Materials",button:0},f:[" ",{t:4,f:[{p:[14,4,449],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[15,5,484],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[16,6,520],t:7,e:"section",a:{"class":"cell"}}," ",{p:[17,6,559],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[20,6,620],t:7,e:"section",a:{"class":"cell"},f:["Amount"]}," ",{p:[23,6,680],t:7,e:"section",a:{"class":"cell"}}," ",{p:[24,6,719],t:7,e:"section",a:{"class":"cell"}}]}," ",{t:4,f:[{p:[27,6,808],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[28,7,845],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[29,8,876]}]}," ",{p:[31,7,910],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"amount",p:[32,8,941]}]}," ",{p:[34,7,977],t:7,e:"section",a:{"class":"cell"},f:[{p:[35,8,1008],t:7,e:"ui-button",a:{icon:"eject"},f:["Release amount"]}]}," ",{p:[37,7,1084],t:7,e:"section",a:{"class":"cell",style:"width: 40px;"},f:[{p:[38,8,1136],t:7,e:"ui-button",a:{icon:"eject"},f:["Release all"]}]}]}],n:52,r:"data.all_materials",p:[26,5,773]}]}],n:50,r:"data.show_materials",p:[13,3,417]}]}," ",{p:[45,2,1274],t:7,e:"ui-display",a:{title:"Categories"},f:[{t:4,f:[{p:[47,4,1334],t:7,e:"ui-button",f:[{t:2,r:".",p:[47,15,1345]}]}],r:"data.categories",p:[46,3,1309]}]}],r:"data.sync"}]},e.exports=a.extend(r.exports)},{341:341}],396:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,5,49],t:7,e:"ui-button",a:{action:"toggle_power",style:[{t:2,x:{r:["data.toggle"],s:'_0?"selected":null'},p:[5,18,111]}]},f:["Turn ",{t:2,x:{r:["data.toggle"],s:'_0?"off":"on"'},p:[6,16,166]}]}]}," ",{p:[9,3,235],t:7,e:"ui-display",a:{title:"Logging"},f:[{t:4,f:[{p:[11,3,292],t:7,e:"ui-section",a:{label:">"},f:[{t:2,r:".",p:[11,25,314]},{p:[11,30,319],t:7,e:"ui-section",f:[]}]}],n:52,r:"data.logs",p:[10,5,269]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],397:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{341:341}],398:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{341:341}],399:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],400:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=a.extend(r.exports)},{341:341}],401:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{341:341}],402:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],403:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{341:341}],404:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{341:341}],405:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],406:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{341:341}],407:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224],t:7,e:"b",f:[{t:2,r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["â†"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button",a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2,r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down"},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section", -a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{341:341}],408:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{341:341}],409:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{341:341}],410:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Chamber Console"},f:[{p:[2,1,45],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,2,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,63,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,3,200],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[6,36,233]}]}," ",{p:[7,3,268],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[7,35,300]}]}," ",{p:[8,3,335],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[8,41,373]}]}," ",{t:4,f:[{p:[10,4,477],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[10,41,514]}]}],n:50,r:"data.disk.activation_delay",p:[9,3,438]}," ",{t:4,f:[{p:[13,4,600],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[13,30,626]}]}," ",{p:[14,4,663],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[14,36,695]}]}],n:50,r:"data.disk.timer",p:[12,3,572]}," ",{t:4,f:[{p:[17,4,785],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[17,40,821]}]}],n:50,r:"data.disk.activation_code",p:[16,3,747]}," ",{t:4,f:[{p:[20,4,918],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[20,42,956]}]}],n:50,r:"data.disk.deactivation_code",p:[19,3,878]}," ",{t:4,f:[{p:[23,4,1047],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[23,34,1077]}]}],n:50,r:"data.disk.kill_code",p:[22,3,1015]}," ",{t:4,f:[{p:[26,4,1163],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[26,37,1196]}]}],n:50,r:"data.disk.trigger_code",p:[25,3,1128]}," ",{t:4,f:[{t:4,f:[{p:[30,6,1332],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[30,25,1351]}]},f:[{t:2,r:"value",p:[30,35,1361]}]}],n:52,r:"data.disk.extra_settings",p:[29,4,1291]}],n:50,r:"data.disk.has_extra_settings",p:[28,3,1250]}],n:50,r:"data.has_program",p:[5,2,172]},{t:4,n:51,f:[{p:[34,3,1423],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,1,80]},{t:4,n:51,f:[{p:[37,2,1489],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[40,1,1550],t:7,e:"br"}," ",{t:4,f:[{p:[42,2,1582],t:7,e:"ui-notice",f:[{t:2,r:"data.status_msg",p:[42,13,1593]}]}],n:50,r:"data.status_msg",p:[41,1,1556]},{t:4,n:51,f:[{p:[44,2,1637],t:7,e:"ui-display",a:{title:"Chamber"},f:[{p:[45,2,1668],t:7,e:"ui-section",f:[{p:[45,14,1680],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock-open":"lock"'},p:[45,30,1696]}],action:"toggle_lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[45,90,1756]}," Chamber"]},{p:[45,146,1812],t:7,e:"br"}]}," ",{p:[46,2,1832],t:7,e:"ui-section",f:[{p:[46,14,1844],t:7,e:"b",f:["Occupant:"]}," ",{t:2,r:"data.occupant_name",p:[46,31,1861]}]}," ",{t:4,f:[{p:[48,4,1929],t:7,e:"ui-section",f:[{p:[48,16,1941],t:7,e:"ui-notice",f:["No nanites detected."]}]}," ",{p:[49,4,2002],t:7,e:"ui-section",f:[{p:[49,16,2014],t:7,e:"ui-button",a:{icon:"syringe",action:"nanite_injection"},f:["Implant Nanites"]}]}],n:50,x:{r:["data.has_nanites"],s:"!_0"},p:[47,2,1899]},{t:4,n:51,f:[{p:[51,3,2121],t:7,e:"ui-display",a:{title:"Nanites"},f:[{t:4,f:[{p:[53,5,2181],t:7,e:"ui-button",a:{icon:"download",action:"add_program"},f:["Install Program From Disk"]},{p:[53,90,2266],t:7,e:"br"}," ",{p:[54,5,2276],t:7,e:"br"}],n:50,r:"data.has_disk",p:[52,4,2154]}," ",{p:[56,4,2297],t:7,e:"ui-section",f:[{p:[57,5,2315],t:7,e:"ui-section",a:{label:"Nanite Volume"},f:[{t:2,r:"data.nanite_volume",p:[57,39,2349]}]}," ",{p:[58,5,2390],t:7,e:"ui-section",a:{label:"Growth Rate"},f:[{t:2,r:"data.regen_rate",p:[58,37,2422]}]}," ",{p:[59,5,2460],t:7,e:"ui-section",a:{label:"Safety Threshold"},f:[{t:2,r:"data.safety_threshold",p:[59,42,2497]}," ",{p:[59,68,2523],t:7,e:"ui-button",a:{icon:"pencil",action:"set_safety"},f:["Set"]}]}," ",{p:[60,5,2603],t:7,e:"ui-section",a:{label:"Cloud ID"},f:[{t:2,x:{r:["data.cloud_id"],s:'_0?_0:"No Cloud"'},p:[60,34,2632]}," ",{p:[60,82,2680],t:7,e:"ui-button",a:{icon:"pencil",action:"set_cloud"},f:["Set"]}]}]}," ",{p:[62,4,2776],t:7,e:"ui-display",a:{title:"Programs"},f:[{t:4,f:[{p:[64,6,2845],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[64,25,2864]}],button:0},f:[{p:[65,6,2888],t:7,e:"ui-button",a:{icon:"minus",action:"remove_program",params:['{"program_id": "',{t:2,r:"id",p:[65,78,2960]},'"}']},f:["Uninstall"]}," ",{p:[66,6,2998],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[66,38,3030]}]}," ",{t:4,f:[{p:[68,7,3094],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[68,45,3132]}]}," ",{p:[69,7,3191],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[69,44,3228]},"/s"]}," ",{t:4,f:[{p:[71,8,3291],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[71,41,3324]}]}," ",{p:[72,8,3362],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[72,45,3399]}," seconds"]}],n:50,r:"can_trigger",p:[70,7,3263]}," ",{t:4,f:[{t:4,f:[{p:[76,9,3534],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,46,3571]}]}],n:50,r:"activation_delay",p:[75,8,3500]}," ",{t:4,f:[{p:[79,9,3652],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,35,3678]}]}," ",{p:[80,9,3710],t:7,e:"ui-section",a:{label:"Timer Type"},f:[{t:2,r:"timer_type",p:[80,40,3741]}]}],n:50,r:"timer",p:[78,8,3629]}," ",{t:4,f:[{t:4,f:[{p:[84,11,3865],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,30,3884]}]},f:[{t:2,r:"value",p:[84,40,3894]}]}],n:52,r:"extra_settings",p:[83,9,3829]}],n:50,r:"has_extra_settings",p:[82,8,3793]}," ",{t:4,f:[{t:4,f:[{p:[89,10,4032],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[89,46,4068]}]}],n:50,r:"activation_code",p:[88,9,3998]}," ",{t:4,f:[{p:[92,10,4163],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[92,48,4201]}]}],n:50,r:"deactivation_code",p:[91,9,4127]}," ",{t:4,f:[{p:[95,10,4290],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[95,40,4320]}]}],n:50,r:"kill_code",p:[94,9,4262]}," ",{t:4,f:[{p:[98,10,4404],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[98,43,4437]}]}],n:50,r:"trigger_code",p:[97,9,4373]}],n:50,x:{r:["data.scan_level"],s:"_0>=4"},p:[87,8,3960]}],n:50,x:{r:["data.scan_level"],s:"_0>=3"},p:[74,7,3463]}],n:50,x:{r:["data.scan_level"],s:"_0>=2"},p:[67,6,3058]}]}],n:52,r:"data.mob_programs",p:[63,5,2811]}]}]}],x:{r:["data.has_nanites"],s:"!_0"}}]}],r:"data.status_msg"}]}]},e.exports=a.extend(r.exports)},{341:341}],411:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Cloud Console"},f:[{p:[2,1,43],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,3,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,64,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,4,202],t:7,e:"ui-section",f:[{p:[7,5,220],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[7,38,253]}]}," ",{p:[8,5,290],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[8,37,322]}]}," ",{p:[9,5,359],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[9,43,397]}]}," ",{t:4,f:[{p:[11,6,505],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[11,43,542]}]}],n:50,r:"data.disk.activation_delay",p:[10,5,464]}," ",{t:4,f:[{p:[14,6,634],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[14,32,660]}]}," ",{p:[15,6,699],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[15,38,731]}]}],n:50,r:"data.disk.timer",p:[13,5,604]}," ",{t:4,f:[{p:[18,6,827],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[18,42,863]}]}],n:50,r:"data.disk.activation_code",p:[17,5,787]}," ",{t:4,f:[{p:[21,6,966],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[21,44,1004]}]}],n:50,r:"data.disk.deactivation_code",p:[20,5,924]}," ",{t:4,f:[{p:[24,6,1101],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[24,36,1131]}]}],n:50,r:"data.disk.kill_code",p:[23,5,1067]}," ",{t:4,f:[{p:[27,6,1223],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[27,39,1256]}]}],n:50,r:"data.disk.trigger_code",p:[26,5,1186]}," ",{t:4,f:[{t:4,f:[{p:[31,8,1400],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[31,27,1419]}]},f:[{t:2,r:"value",p:[31,37,1429]}]}],n:52,r:"data.disk.extra_settings",p:[30,6,1357]}],n:50,r:"data.disk.has_extra_settings",p:[29,5,1314]}]}],n:50,r:"data.has_program",p:[5,3,173]},{t:4,n:51,f:[{p:[36,4,1515],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,2,79]},{t:4,n:51,f:[{p:[39,3,1584],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[42,1,1646],t:7,e:"ui-display",a:{title:"Cloud Storage"},f:[{t:4,f:[{p:[44,3,1713],t:7,e:"ui-button",a:{icon:"plus-circle",action:"create_backup"},f:["Create New Backup"]}," ",{p:[45,3,1799],t:7,e:"ui-display",a:{title:"Active Backups"},f:[{t:4,f:[{p:[47,5,1873],t:7,e:"ui-button",a:{action:"set_view",params:['{"view": "',{t:2,r:"cloud_id",p:[47,52,1920]},'"}']},f:["Backup #",{t:2,r:"cloud_id",p:[47,76,1944]}]}],n:52,r:"data.cloud_backups",p:[46,4,1839]}]}],n:50,x:{r:["data.current_view"],s:"!_0"},p:[43,2,1683]},{t:4,n:51,f:[{p:[51,3,2014],t:7,e:"ui-button",a:{icon:"undo",action:"set_view",params:'{"view": "0"}'},f:["Return"]}," ",{t:4,f:[{p:[53,4,2131],t:7,e:"ui-notice",f:["ERROR: Backup not found."]}],n:50,x:{r:["data.cloud_backup"],s:"!_0"},p:[52,3,2100]},{t:4,n:51,f:[{p:[55,4,2195],t:7,e:"ui-display",a:{title:["Backup #",{t:2,r:"data.current_view",p:[55,31,2222]}]},f:[{t:4,f:[{p:[57,6,2282],t:7,e:"ui-button",a:{icon:"upload",action:"upload_program",style:"selected"},f:["Upload Program From Disk"]},{p:[57,108,2384],t:7,e:"br"}],n:50,r:"data.has_program",p:[56,5,2251]}," ",{t:4,f:[{p:[60,6,2443],t:7,e:"hr"}," ",{p:[61,6,2454],t:7,e:"ui-section",f:[{p:[62,7,2474],t:7,e:"h3",f:[{t:2,r:"name",p:[62,11,2478]}]}," ",{p:[63,7,2499],t:7,e:"div",a:{style:"float:right"},f:[{p:[64,8,2533],t:7,e:"ui-button",a:{icon:"minus-circle",action:"remove_program",style:"danger",params:['{"program_id": "',{t:2,r:"id",p:[64,102,2627]},'"}']},f:["Uninstall"]}]}]}," ",{p:[67,6,2699],t:7,e:"ui-section",f:[{p:[68,7,2719],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[68,39,2751]}]}," ",{p:[69,7,2780],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[69,45,2818]}]}," ",{p:[70,7,2877],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[70,44,2914]},"/s"]}," ",{t:4,f:[{p:[72,8,2977],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[72,41,3010]},"/s"]}," ",{p:[73,8,3050],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[73,45,3087]},"/s"]}],n:50,r:"can_trigger",p:[71,7,2949]}," ",{t:4,f:[{p:[76,8,3178],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,45,3215]}]}],n:50,r:"activation_delay",p:[75,7,3145]}," ",{t:4,f:[{p:[79,8,3293],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,34,3319]}]}," ",{p:[80,8,3350],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"timer_type",p:[80,40,3382]}]}],n:50,r:"timer",p:[78,7,3271]}," ",{t:4,f:[{p:[83,8,3464],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[83,44,3500]}]}],n:50,r:"activation_code",p:[82,7,3432]}," ",{t:4,f:[{p:[86,8,3589],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[86,46,3627]}]}],n:50,r:"deactivation_code",p:[85,7,3555]}," ",{t:4,f:[{p:[89,8,3710],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[89,38,3740]}]}],n:50,r:"kill_code",p:[88,7,3684]}," ",{t:4,f:[{p:[92,8,3818],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[92,41,3851]}]}],n:50,r:"trigger_code",p:[91,7,3789]}," ",{t:4,f:[{t:4,f:[{p:[96,10,3973],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[96,29,3992]}]},f:[{t:2,r:"value",p:[96,39,4002]}]}],n:52,r:"extra_settings",p:[95,8,3938]}],n:50,r:"has_extra_settings",p:[94,7,3903]}]}],n:52,r:"data.cloud_programs",p:[59,5,2407]}]}],x:{r:["data.cloud_backup"],s:"!_0"}}],x:{r:["data.current_view"],s:"!_0"}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],412:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Program Hub"},f:[{t:4,f:[{p:[3,2,65],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{p:[4,3,102],t:7,e:"ui-section",f:[{p:[5,4,119],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{p:[6,4,185],t:7,e:"ui-button",a:{icon:"minus-circle",action:"clear"},f:["Delete Program"]}]}," ",{t:4,f:[{p:[9,4,307],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[9,37,340]}]}," ",{p:[10,4,376],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[10,36,408]}]}],n:50,r:"data.has_program",p:[8,3,278]},{t:4,n:51,f:[{p:[12,4,456],t:7,e:"ui-notice",f:["No program installed."]}],r:"data.has_program"}]}],n:50,r:"data.has_disk",p:[2,1,41]},{t:4,n:51,f:[{p:[16,2,540],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"},{p:[18,1,586],t:7,e:"br"}," ",{p:[19,1,592],t:7,e:"ui-display",a:{title:"Programs"},f:[{p:[20,2,624],t:7,e:"ui-section",f:[{p:[21,3,640],t:7,e:"ui-button",a:{icon:"undo",action:"set_category",params:'{"category": "Main"}'},f:["Return"]}," ",{p:[22,3,737],t:7,e:"ui-button",a:{icon:"align-justify ",action:"toggle_details"},f:[{t:2,x:{r:["data.detail_view"],s:'_0?"Compact View":"Detailed View"'},p:[22,60,794]}]}]}," ",{t:4,f:[{p:[25,3,916],t:7,e:"ui-display",f:[{t:4,f:[{p:[27,5,964],t:7,e:"ui-section",f:[{p:[27,17,976],t:7,e:"ui-button",a:{action:"set_category",params:['{"category": "',{t:2,r:"name",p:[27,72,1031]},'"}']},f:[{t:2,r:"name",p:[27,84,1043]}]}]}],n:52,r:"data.categories",p:[26,4,933]}]}],n:50,x:{r:["data.category"],s:'_0=="Main"'},p:[24,2,881]},{t:4,n:51,f:[{p:[31,3,1122],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[31,22,1141]}]},f:[{t:4,f:[{t:4,f:[{p:[34,6,1229],t:7,e:"ui-display",f:[{p:[35,7,1249],t:7,e:"ui-section",f:[{p:[35,19,1261],t:7,e:"b",f:[{t:2,r:"name",p:[35,22,1264]}]}]}," ",{p:[36,7,1297],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[36,19,1309]}]}," ",{p:[37,7,1338],t:7,e:"ui-section",f:[{p:[38,8,1359],t:7,e:"ui-button",a:{icon:"download",action:"download",params:['{"program_id": "',{t:2,r:"id",p:[38,77,1428]},'"}'],state:[{t:2,x:{r:["data.has_disk"],s:'_0?null:"disabled"'},p:[38,94,1445]}]},f:["Download"]}]}]}],n:50,r:"data.detail_view",p:[33,5,1198]},{t:4,n:51,f:[{p:[44,6,1585],t:7,e:"ui-section",f:[{p:[44,18,1597],t:7,e:"ui-button",a:{action:"download",params:['{"program_id": "',{t:2,r:"id",p:[44,71,1650]},'"}']},f:[{t:2,r:"name",p:[44,81,1660]}]}]}],r:"data.detail_view"}],n:52,r:"data.program_list",p:[32,4,1165]}]}],x:{r:["data.category"],s:'_0=="Main"'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],413:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Programming"},f:[{t:4,f:[{p:[3,3,67],t:7,e:"ui-notice",f:["Insert a nanite program disk."]}],n:50,x:{r:["data.has_disk"],s:"!_0"},p:[2,1,41]},{t:4,n:51,f:[{p:[5,3,133],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{t:4,f:[{p:[7,5,229],t:7,e:"ui-notice",f:["No program detected."]}],n:50,x:{r:["data.has_program"],s:"!_0"},p:[6,3,198]},{t:4,n:51,f:[{p:[9,5,290],t:7,e:"ui-section",f:[{p:[10,7,310],t:7,e:"ui-display",a:{title:[{t:2,r:"data.name",p:[10,26,329]}]},f:[{t:2,r:"data.desc",p:[11,9,354]}]}]}," ",{p:[14,5,413],t:7,e:"ui-section",f:[{p:[15,7,433],t:7,e:"ui-section",a:{label:"Program Info"},f:["Nanites Consumed: ",{t:2,r:"data.use_rate",p:[16,26,493]},{p:[16,43,510],t:7,e:"br"}," ",{t:4,f:["Trigger Cost: ",{t:2,r:"data.trigger_cost",p:[18,25,574]},"u",{p:[18,47,596],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[17,9,524]}]}," ",{p:[22,7,648],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[23,9,685],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.activated"],s:'_0?"toggle-on":"toggle-off"'},p:[24,17,713]}],action:"toggle_active"},f:[{t:2,x:{r:["data.activated"],s:'_0?"Active":"Inactive"'},p:[26,11,809]}]}]}," ",{p:[30,7,905],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[31,9,944],t:7,e:"ui-button",a:{icon:"pencil",action:"set_activation_delay"}}," Activation Delay: ",{t:2,r:"data.activation_delay",p:[31,95,1030]}," ",{p:[31,121,1056],t:7,e:"br"}," ",{p:[32,9,1070],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer"}}," Timer: ",{t:2,r:"data.timer",p:[32,73,1134]}," ",{p:[32,88,1149],t:7,e:"br"}," ",{p:[33,9,1163],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer_type"}}," Timer Type: ",{t:2,r:"data.timer_type",p:[33,83,1237]}," ",{p:[33,103,1257],t:7,e:"br"}]}," ",{p:[36,7,1292],t:7,e:"ui-section",a:{label:"Codes"},f:[{p:[37,9,1328],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "activation"}'}}," Activation Code: ",{t:2,r:"data.activation_code",p:[37,121,1440]}," ",{p:[37,146,1465],t:7,e:"br"}," ",{p:[38,9,1479],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "deactivation"}'}}," Deactivation Code: ",{t:2,r:"data.deactivation_code",p:[38,125,1595]}," ",{p:[38,152,1622],t:7,e:"br"}," ",{p:[39,9,1636],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "kill"}'}}," Kill Code: ",{t:2,r:"data.kill_code",p:[39,109,1736]}," ",{p:[39,128,1755],t:7,e:"br"}," ",{t:4,f:[{p:[41,11,1805],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "trigger"}'}}," Trigger Code: ",{t:2,r:"data.trigger_code",p:[41,117,1911]}," ",{p:[41,139,1933],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[40,9,1769]}]}," ",{t:4,f:[{p:[46,9,2026],t:7,e:"ui-section",a:{label:"Special"},f:[{t:4,f:[{p:[48,13,2109],t:7,e:"ui-button",a:{icon:"pencil",action:"set_extra_setting",params:['{"target_setting": "',{t:2,r:"name",p:[48,93,2189]},'"}']}}," ",{t:2,r:"name",p:[48,118,2214]},": ",{t:2,r:"value",p:[48,128,2224]}," ",{p:[48,138,2234],t:7,e:"br"}],n:52,r:"data.extra_settings",p:[47,11,2066]}]}],n:50,r:"data.has_extra_settings",p:[45,7,1985]}]}],x:{r:["data.has_program"],s:"!_0"}}],x:{r:["data.has_disk"],s:"!_0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],414:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Control"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-notice",f:["The interface is locked."]}],n:50,r:"data.locked",p:[2,1,37]},{t:4,n:51,f:[{p:[5,3,121],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock Interface"]}," ",{p:[6,3,188],t:7,e:"ui-button",a:{icon:"save",action:"save"},f:["Save Current Setting"]}," ",{p:[7,3,261],t:7,e:"ui-section",a:{label:"Signal Code"},f:[{p:[8,5,299],t:7,e:"span",f:[{t:2,r:"data.code",p:[8,11,305]}]}," ",{p:[9,4,330],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code"},f:["Set"]}]}," ",{t:4,f:[{p:[12,5,443],t:7,e:"ui-section",a:{label:"Relay Code"},f:[{p:[13,7,482],t:7,e:"span",f:[{t:2,r:"data.relay_code",p:[13,13,488]}]}," ",{p:[14,5,520],t:7,e:"ui-button",a:{icon:"pencil",action:"set_relay_code"},f:["Set"]}]}],n:50,x:{r:["data.mode"],s:'_0=="Relay"'},p:[11,3,409]}," ",{p:[17,3,618],t:7,e:"ui-section",a:{label:"Signal Mode"},f:[{p:[18,5,656],t:7,e:"span",f:[{t:2,r:"data.mode",p:[18,11,662]}]}," ",{p:[19,5,688],t:7,e:"br"}," ",{p:[20,4,697],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Off"}'},f:["Off"]}," ",{p:[21,5,775],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Local"}'},f:["Local"]}," ",{p:[22,5,857],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Targeted"}'},f:["Targeted"]}," ",{p:[23,5,945],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Area"}'},f:["Area"]}," ",{p:[24,5,1025],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Relay"}'},f:["Relay"]}]}],r:"data.locked"}]}," ",{p:[28,1,1144],t:7,e:"ui-display",a:{title:"Saved Settings"},f:[{t:4,f:[{p:[30,3,1215],t:7,e:"ui-button",a:{icon:"load",action:"load",params:['{"save_id": "',{t:2,r:"id",p:[30,61,1273]},'"}']},f:[{t:2,r:"name",p:[30,71,1283]}]}," ",{t:4,f:[{p:[32,4,1332],t:7,e:"ui-button",a:{icon:"remove",action:"remove_save",params:['{"save_id": "',{t:2,r:"id",p:[32,71,1399]},'"}']},f:["Remove"]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[31,3,1307]}," ",{p:[34,3,1442],t:7,e:"br"}],n:52,r:"data.saved_settings",p:[29,2,1182]}]}]},e.exports=a.extend(r.exports)},{341:341}],415:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ghost roles"},f:[{p:[2,2,35],t:7,e:"ui-section",a:{label:"Ignored roles"},f:[{t:4,f:[{p:[4,4,99],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[4,21,116]}],style:[{t:2,x:{r:["enabled"],s:'_0?"danger":null'},p:[4,73,168]}],action:"toggle_ignore",params:['{"key": "',{t:2,r:"key",p:[4,144,239]},'"}']},f:[{t:2,r:"desc",p:[4,155,250]}]}],n:52,r:"data.ignore",p:[3,3,73]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],416:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{341:341}],417:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236]}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table",f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582],t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431) -};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],418:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';"},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],419:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],420:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],421:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:["   "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],422:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],423:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],424:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],425:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153], -t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],426:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],427:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}]}]}," ",{p:[55,5,1528],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1563],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1569]}]}]}],r:"config.fancy"}]}," ",{p:[60,1,1638],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1668],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1693],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1730],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1769],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1806],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1845],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1887],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1928],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2013],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2032]}],nowrap:0},f:[{p:[72,7,2057],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2078]}," %"]}," ",{p:[73,7,2136],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[73,28,2157]}]}," ",{p:[74,7,2199],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2220],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2233]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2262]}]}]}," ",{p:[75,7,2309],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2330],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2343]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2366]}," [",{p:[75,87,2389],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2395]}]},"]"]}]}," ",{p:[76,7,2444],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2465],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2478]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2501]}," [",{p:[76,87,2524],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2530]}]},"]"]}]}," ",{p:[77,7,2579],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2600],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2613]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2636]}," [",{p:[77,87,2659],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2665]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1987]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],428:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],429:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],430:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],431:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{341:341}],432:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],433:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,25],t:7,e:"ui-button",a:{icon:"undo",action:"change_menu",params:'{"menu": "1"}'},f:["Return"]}," ",{p:[3,2,113],t:7,e:"ui-display",a:{title:"Advanced Surgery Procedures"},f:[{p:[4,3,165],t:7,e:"ui-button",a:{icon:"download",action:"sync"},f:["Sync with research database"]}," ",{t:4,f:[{p:[6,4,278],t:7,e:"ui-display",f:[{p:[7,6,297],t:7,e:"ui-section",f:[{p:[7,18,309],t:7,e:"b",f:[{t:2,r:"name",p:[7,21,312]}]}]}," ",{p:[8,6,344],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[8,18,356]}]}]}],n:52,r:"data.surgeries",p:[5,3,249]}]}],n:50,x:{r:["data.menu"],s:"_0==2"},p:[1,1,0]},{t:4,n:51,f:[{p:[13,2,437],t:7,e:"ui-button",a:{action:"change_menu",params:'{"menu": "2"}'},f:["View Surgery Procedures"]}," ",{t:4,f:[{p:[15,3,556],t:7,e:"ui-notice",f:["No table detected!"]}],n:51,r:"data.table",p:[14,2,530]}," ",{p:[19,2,623],t:7,e:"ui-display",f:[{p:[20,3,639],t:7,e:"ui-display",a:{title:"Patient State"},f:[{t:4,f:[{p:[22,5,704],t:7,e:"ui-section",a:{label:"State"},f:[{p:[23,6,737],t:7,e:"span",a:{"class":[{t:2,r:"data.patient.statstate",p:[23,19,750]}]},f:[{t:2,r:"data.patient.stat",p:[23,47,778]}]}]}," ",{p:[25,5,831],t:7,e:"ui-section",a:{label:"Blood Type"},f:[{p:[26,6,869],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.patient.blood_type",p:[26,28,891]}]}]}," ",{p:[28,5,950],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,6,984],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.patient.minHealth",p:[29,19,997]}],max:[{t:2,r:"data.patient.maxHealth",p:[29,52,1030]}],value:[{t:2,r:"data.patient.health",p:[29,87,1065]}],state:[{t:2,x:{r:["data.patient.health"],s:'_0>=0?"good":"average"'},p:[30,13,1103]}]},f:[{t:2,x:{r:["adata.patient.health"],s:"Math.round(_0)"},p:[30,64,1154]}]}]}," ",{t:4,f:[{p:[33,6,1389],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[33,25,1408]}]},f:[{p:[34,7,1427],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.patient.maxHealth",p:[34,28,1448]}],value:[{t:2,rx:{r:"data.patient",m:[{t:30,n:"type"}]},p:[34,63,1483]}],state:"bad"},f:[{t:2,x:{r:["type","adata.patient"],s:"Math.round(_1[_0])"},p:[34,99,1519]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}]'},p:[32,5,1224]}],n:50,r:"data.patient",p:[21,4,678]},{t:4,n:51,f:["No patient detected."],r:"data.patient"}]}," ",{p:[41,3,1670],t:7,e:"ui-display",a:{title:"Initiated Procedures"},f:[{t:4,f:[{t:4,f:[{p:[44,6,1777],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[44,28,1799]}]},f:[{p:[45,7,1817],t:7,e:"ui-section",a:{label:"Next Step"},f:[{p:[46,8,1856],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"next_step",p:[46,30,1878]}]}," ",{t:4,f:[{p:[48,9,1937],t:7,e:"span",a:{"class":"content"},f:[{p:[48,31,1959],t:7,e:"b",f:["Required chemicals:"]},{p:[48,57,1985],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[48,62,1990]}]}],n:50,r:"chems_needed",p:[47,8,1907]}]}," ",{t:4,f:[{p:[52,8,2091],t:7,e:"ui-section",a:{label:"Alternative Step"},f:[{p:[53,9,2138],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"alternative_step",p:[53,31,2160]}]}," ",{t:4,f:[{p:[55,10,2232],t:7,e:"span",a:{"class":"content"},f:[{p:[55,32,2254],t:7,e:"b",f:["Required chemicals:"]},{p:[55,58,2280],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[55,63,2285]}]}],n:50,r:"alt_chems_needed",p:[54,9,2197]}]}],n:50,r:"alternative_step",p:[51,7,2058]}]}],n:52,r:"data.procedures",p:[43,5,1745]}],n:50,r:"data.procedures",p:[42,4,1716]},{t:4,n:51,f:["No active procedures."],r:"data.procedures"}]}]}],x:{r:["data.menu"],s:"_0==2"}}]},e.exports=a.extend(r.exports)},{341:341}],434:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed points: ",{t:2,r:"data.unclaimedPoints",p:[6,29,159]}," ",{t:4,f:[{p:[8,4,220],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim Points"]}],n:50,r:"data.unclaimedPoints",p:[7,3,187]}]}," ",{p:[13,2,311],t:7,e:"ui-section",f:[{t:4,f:[{p:[15,4,350],t:7,e:"ui-button",a:{action:"Eject"},f:["Eject ID"]}," You have ",{t:2,r:"data.claimedPoints",p:[18,13,421]}," mining points collected."],n:50,r:"data.hasID",p:[14,3,327]},{t:4,n:51,f:[{p:[20,4,485],t:7,e:"ui-button",a:{action:"Insert"},f:["Insert ID"]}],r:"data.hasID"}]}]}," ",{p:[26,1,588],t:7,e:"ui-display",f:[{t:4,f:[{p:[28,3,627],t:7,e:"ui-section",f:[{p:[29,4,644],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[34,4,772],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[35,5,808],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[35,42,845]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[35,129,932]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[38,10,988]},": ",{t:2,r:"name",p:[38,21,999]}]}],n:52,r:"data.diskDesigns",p:[33,3,741]}],n:50,r:"data.hasDisk",p:[27,2,603]},{t:4,n:51,f:[{p:[42,3,1053],t:7,e:"ui-section",f:[{p:[43,4,1070],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{t:4,f:[{p:[50,2,1223],t:7,e:"ui-display",f:[{p:[51,3,1239],t:7,e:"ui-section",f:[{p:[52,4,1256],t:7,e:"b",f:["Warning"]},": ",{t:2,r:"data.disconnected",p:[52,20,1272]},". Please contact the quartermaster."]}]}],n:50,r:"data.disconnected",p:[49,1,1195]},{t:4,f:[{p:[57,2,1412],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[58,3,1445],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[59,5,1480],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[62,5,1538],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[65,5,1595],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[67,5,1639],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[69,5,1683],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[74,4,1785],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[75,5,1820],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[76,6,1849]}]}," ",{p:[78,5,1879],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[79,6,1922]}]}," ",{p:[81,5,1954],t:7,e:"section",a:{"class":"cell"},f:[{p:[82,6,1983],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[82,19,1996]}],placeholder:"###","class":"number"}}]}," ",{p:[84,5,2063],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[85,6,2106],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[85,60,2160]}],params:['{ "id" : ',{t:2,r:"id",p:[85,115,2215]},', "sheets" : ',{t:2,r:"sheets",p:[85,134,2234]}," }"]},f:["Release"]}]}," ",{p:[89,5,2305],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[90,6,2348]}]}]}],n:52,r:"data.materials",p:[73,3,1756]}," ",{t:4,f:[{p:[95,4,2431],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[96,5,2466],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[97,6,2495]}]}," ",{p:[99,5,2525],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[100,6,2568]}]}," ",{p:[102,5,2600],t:7,e:"section",a:{"class":"cell"},f:[{p:[103,6,2629],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[103,19,2642]}],placeholder:"###","class":"number"}}]}," ",{p:[105,5,2709],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[106,6,2752],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[106,58,2804]}],params:['{ "id" : ',{t:2,r:"id",p:[106,114,2860]},', "sheets" : ',{t:2,r:"sheets",p:[106,133,2879]}," }"]},f:["Smelt"]}]}," ",{p:[110,5,2947],t:7,e:"section",a:{"class":"cell",align:"right"},f:[]}]}],n:52,r:"data.alloys",p:[94,3,2405]}]}],n:50,x:{r:["data.materials","data.alloys"],s:"_0||_1"},p:[56,1,1372]}]},e.exports=a.extend(r.exports)},{341:341}],435:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,4,87],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[4,36,119]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[7,4,231],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[7,35,262]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[10,4,358],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[10,35,389]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[15,4,528],t:7,e:"ui-section",f:[{t:4,f:[{p:[17,6,578], -t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[16,5,546]},{t:4,n:51,f:[{p:[19,6,644],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[21,8,712],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[21,38,742]}]}," ",{p:[22,8,782],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[22,39,813]}]}],n:50,r:"data.has_blood",p:[20,7,681]},{t:4,n:51,f:[{p:[24,8,870],t:7,e:"ui-section",f:[{p:[25,9,892],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[14,3,500]},{t:4,n:51,f:[{p:[32,4,1054],t:7,e:"ui-section",f:[{p:[33,5,1072],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[38,3,1188],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[43,8,1343],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[43,64,1399]}],params:['{"index": ',{t:2,r:"index",p:[43,116,1451]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[42,7,1320]}," ",{p:[47,7,1538],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[47,69,1600]}],params:['{"index": ',{t:2,r:"index",p:[47,124,1655]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,24,1269]}],button:0},f:[" ",{p:[51,6,1749],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[51,40,1783]}]}," ",{p:[52,6,1812],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[52,38,1844]}]}," ",{p:[53,6,1879],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[53,33,1906]}]}," ",{p:[54,6,1936],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[54,40,1970]}]}," ",{t:4,f:[{p:[56,7,2021],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[58,9,2087],t:7,e:"ui-button",a:{action:"symptom_details",state:"",params:['{"picked_symptom": ',{t:2,r:"sym_index",p:[58,81,2159]},', "index": ',{t:2,r:"index",p:[58,105,2183]},"}"]},f:[{t:2,r:"name",p:[59,10,2206]}," "]},{p:[60,21,2236],t:7,e:"br"}],n:52,r:"symptoms",p:[57,8,2059]}]}," ",{p:[63,7,2289],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[63,38,2320]}]}," ",{p:[64,7,2355],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[64,35,2383]}]}," ",{p:[65,7,2415],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[65,39,2447]}]}," ",{p:[66,7,2483],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[66,44,2520]}]}],n:50,r:"is_adv",p:[55,6,1999]}]}],n:52,r:"data.viruses",p:[39,4,1222]},{t:4,n:51,f:[{p:[70,5,2601],t:7,e:"ui-section",f:[{p:[71,6,2620],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[75,3,2743],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[77,5,2811],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[77,24,2830]}]},f:[{p:[78,7,2848],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[78,43,2884]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[78,129,2970]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[76,4,2779]},{t:4,n:51,f:[{p:[83,5,3067],t:7,e:"ui-section",f:[{p:[84,6,3086],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[37,2,1162]}],n:50,x:{r:["data.mode"],s:"_0==1"},p:[1,1,0]},{t:4,n:51,f:[{p:[90,2,3231],t:7,e:"ui-button",a:{icon:"undo",state:"",action:"back"},f:["Back"]}," ",{t:4,f:[{p:[94,4,3330],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[94,23,3349]}]},f:[{p:[95,4,3364],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[96,5,3382]}," ",{t:4,f:[{p:[98,5,3417],t:7,e:"br"}," ",{p:[99,5,3428],t:7,e:"b",f:["This symptom has been neutered, and has no effect. It will still affect the virus' statistics."]}],n:50,r:"neutered",p:[97,4,3395]}]}," ",{p:[102,4,3564],t:7,e:"ui-section",f:[{p:[103,5,3582],t:7,e:"ui-section",a:{label:"Level"},f:[{t:2,r:"level",p:[103,31,3608]}]}," ",{p:[104,5,3636],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[104,36,3667]}]}," ",{p:[105,5,3700],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[105,33,3728]}]}," ",{p:[106,5,3758],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[106,37,3790]}]}," ",{p:[107,5,3824],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[107,42,3861]}]}]}," ",{p:[109,4,3913],t:7,e:"ui-subdisplay",a:{title:"Effect Thresholds"},f:[{p:[110,5,3960],t:7,e:"ui-section",f:[{t:3,r:"threshold_desc",p:[110,17,3972]}]}]}]}],n:53,r:"data.symptom",p:[93,2,3303]}],x:{r:["data.mode"],s:"_0==1"}}]},e.exports=a.extend(r.exports)},{341:341}],436:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(484);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{341:341,484:484}],437:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{341:341}],438:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[3,1,69],t:7,e:"ui-notice",f:[{p:[4,3,84],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[4,23,104]}," connected to a tank."]}]}," ",{p:[6,1,182],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[7,3,220],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[8,5,255],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[8,11,261]}," kPa"]}]}," ",{p:[10,3,323],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[11,5,354],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[11,18,367]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[11,59,408]}]}]}]}," ",{p:[14,1,499],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[15,3,530],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,579]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[17,14,630]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,687]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[24,7,856],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[24,38,887]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[23,5,828]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[28,3,1007],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[29,4,1038]}]}," ",{p:[31,3,1080],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[32,4,1114]}," kPa"]}],n:50,r:"data.holding",p:[27,3,983]},{t:4,n:51,f:[{p:[35,3,1188],t:7,e:"ui-section",f:[{p:[36,4,1205],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}," ",{p:[40,1,1293],t:7,e:"ui-display",a:{title:"Filters"},f:[{t:4,f:[{p:[42,5,1345],t:7,e:"filters"}],n:53,r:"data",p:[41,3,1325]}]}]},r.exports.components=r.exports.components||{};var i={filters:t(457)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,457:457}],439:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}]}]}," ",{p:[52,5,1464],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1499],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1505]}]}]}],r:"config.fancy"}]}," ",{p:[57,1,1574],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1604],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1629],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1666],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1705],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1742],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1781],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1823],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1864],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1949],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1968]}],nowrap:0},f:[{p:[69,7,1993],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2014]}," %"]}," ",{p:[70,7,2072],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[70,28,2093]}]}," ",{p:[71,7,2135],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2156],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2169]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2198]}]}]}," ",{p:[72,7,2245],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2266],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2279]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2302]}," [",{p:[72,87,2325],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2331]}]},"]"]}]}," ",{p:[73,7,2380],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2401],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2414]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2437]}," [",{p:[73,87,2460],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2466]}]},"]"]}]}," ",{p:[74,7,2515],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2536],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2549]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2572]}," [",{p:[74,87,2595],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2601]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1923]}]}]},e.exports=a.extend(r.exports)},{341:341}],440:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=a.extend(r.exports)},{341:341}],441:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," "," "," "," "," "," ",{p:[11,1,560],t:7,e:"rdheader"}," ",{t:4,f:[{p:[13,2,595],t:7,e:"ui-display",a:{title:"CONSOLE LOCKED"},f:[{p:[14,3,634],t:7,e:"ui-button",a:{action:"Unlock"},f:["Unlock"]}]}],n:50,r:"data.locked",p:[12,1,573]},{t:4,f:[{p:[18,2,729],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[18,17,744]}]},f:[{p:[19,3,763],t:7,e:"tab",a:{name:"Technology"},f:[{p:[20,4,791],t:7,e:"techweb"}]}," ",{p:[22,3,815],t:7,e:"tab",a:{name:"View Node"},f:[{p:[23,4,842],t:7,e:"nodeview"}]}," ",{p:[25,3,867],t:7,e:"tab",a:{name:"View Design"},f:[{p:[26,4,896],t:7,e:"designview"}]}," ",{p:[28,3,923],t:7,e:"tab",a:{name:"Disk Operations - Design"},f:[{p:[29,4,965],t:7,e:"diskopsdesign"}]}," ",{p:[31,3,995],t:7,e:"tab",a:{name:"Disk Operations - Technology"},f:[{p:[32,4,1041],t:7,e:"diskopstech"}]}," ",{p:[34,3,1069],t:7,e:"tab",a:{name:"Deconstructive Analyzer"},f:[{p:[35,4,1110],t:7,e:"destruct"}]}," ",{p:[37,3,1135],t:7,e:"tab",a:{name:"Protolathe"},f:[{p:[38,4,1163],t:7,e:"protolathe"}]}," ",{p:[40,3,1190],t:7,e:"tab",a:{name:"Circuit Imprinter"},f:[{p:[41,4,1225],t:7,e:"circuit"}]}," ",{p:[43,3,1249],t:7,e:"tab",a:{name:"Settings"},f:[{p:[44,4,1275],t:7,e:"settings"}]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[17,1,706]}]},r.exports.components=r.exports.components||{};var i={settings:t(450),circuit:t(442),protolathe:t(448),destruct:t(444),diskopsdesign:t(445),diskopstech:t(446),designview:t(443),nodeview:t(447),techweb:t(451),rdheader:t(449)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451}],442:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,58],t:7,e:"ui-display",a:{title:"Circuit Imprinter Busy!"}}],n:50,r:"data.circuitbusy",p:[2,2,30]},{t:4,n:51,f:[{p:[5,3,130],t:7,e:"ui-display",f:[{p:[6,4,147],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,189],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,202]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,261],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "circuit", "inputText" : ',{t:2,r:"textsearch",p:[8,84,340]},"}"]},f:["Search"]}]}," ",{p:[10,4,398],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.circuitmats",p:[10,27,421]}," / ",{t:2,r:"data.circuitmaxmats",p:[10,50,444]}]}," ",{p:[11,4,485],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.circuitchems",p:[11,26,507]}," / ",{t:2,r:"data.circuitmaxchems",p:[11,50,531]}]}," ",{p:[12,3,572],t:7,e:"ui-display",f:[{p:[14,3,590],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,605]}]},f:[{p:[15,4,631],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,696],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.circuitcat"],s:'_0=="{{name}}"?"selected":null'},p:[17,43,733]}],params:['{"type" : "circuit", "cat" : "',{t:2,r:"name",p:[17,135,825]},'"}']},f:[{t:2,r:"name",p:[17,147,837]}]}],n:52,r:"data.circuitcats",p:[16,5,663]}]}," ",{p:[20,4,888],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,956],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,968]},{t:2,r:"matstring",p:[22,26,976]}," ",{p:[23,7,997],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[23,40,1030]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[23,119,1109]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitdes",p:[21,5,924]}]}," ",{p:[27,4,1187],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[29,6,1254],t:7,e:"ui-section",f:[{t:2,r:"name",p:[29,18,1266]},{t:2,r:"matstring",p:[29,26,1274]}," ",{p:[30,7,1295],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[30,40,1328]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[30,119,1407]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitmatch",p:[28,5,1220]}]}," ",{p:[34,4,1485],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[36,6,1550],t:7,e:"ui-section",f:[{t:2,r:"name",p:[36,18,1562]}," : ",{t:2,r:"amount",p:[36,29,1573]}," cm3 - ",{t:4,f:[{p:[38,7,1623],t:7,e:"input",a:{value:[{t:2,r:"number",p:[38,20,1636]}],placeholder:["1-",{t:2,r:"sheets",p:[38,46,1662]}],"class":"number"}}," ",{p:[39,7,1698],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "circuit", "mat_id" : ',{t:2,r:"mat_id",p:[39,84,1775]},', "sheets" : ',{t:2,r:"number",p:[39,107,1798]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[37,6,1597]}]}],n:52,r:"data.circuitmat_list",p:[35,5,1513]}]}," ",{p:[44,4,1895],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[46,6,1961],t:7,e:"ui-section",f:[{t:2,r:"name",p:[46,18,1973]}," : ",{t:2,r:"amount",p:[46,29,1984]}," - ",{p:[47,7,2005],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "circuit", "name" : ',{t:2,r:"name",p:[47,80,2078]},', "id" : ',{t:2,r:"reagentid",p:[47,97,2095]},"}"]},f:["Purge"]}]}],n:52,r:"data.circuitchem_list",p:[45,5,1923]}]}]}]}]}],r:"data.circuitbusy"}],n:50,r:"data.circuit_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[55,2,2216],t:7,e:"ui-display",a:{title:"No Linked Circuit Imprinter"}}],r:"data.circuit_linked"}]},e.exports=a.extend(r.exports)},{341:341}],443:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:[{t:2,r:"data.sdesign_name",p:[2,21,50]}]},f:[{p:[3,3,77],t:7,e:"ui-section",a:{title:"Description"},f:[{t:2,r:"data.sdesign_desc",p:[3,35,109]}]}]}," ",{p:[5,2,162],t:7,e:"ui-display",a:{title:"Lathe Types"},f:[{t:4,f:[{p:[7,4,239],t:7,e:"ui-section",a:{title:"Circuit Imprinter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&1"},p:[6,3,198]}," ",{t:4,f:[{p:[10,4,346],t:7,e:"ui-section",a:{title:"Protolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&2"},p:[9,3,305]}," ",{t:4,f:[{p:[13,4,446],t:7,e:"ui-section",a:{title:"Autolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&4"},p:[12,3,405]}," ",{t:4,f:[{p:[16,4,545],t:7,e:"ui-section",a:{title:"Crafting Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&8"},p:[15,3,504]}," ",{t:4,f:[{p:[19,4,655],t:7,e:"ui-section",a:{title:"Exosuit Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&16"},p:[18,3,613]}," ",{t:4,f:[{p:[22,4,764],t:7,e:"ui-section",a:{title:"Biogenerator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&32"},p:[21,3,722]}," ",{t:4,f:[{p:[25,4,867],t:7,e:"ui-section",a:{title:"Limb Grower"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&64"},p:[24,3,825]}," ",{t:4,f:[{p:[28,4,970],t:7,e:"ui-section",a:{title:"Ore Smelter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&128"},p:[27,3,927]}]}," ",{p:[31,2,1045],t:7,e:"ui-display",a:{title:"Materials"},f:[{t:4,f:[{p:[33,4,1116],t:7,e:"ui-section",a:{title:[{t:2,r:"matname",p:[33,23,1135]}]},f:[{t:2,r:"matamt",p:[33,36,1148]}," cm^3"]}],n:52,r:"data.sdesign_materials",p:[32,3,1079]}]}],n:50,r:"data.design_selected",p:[1,1,0]},{t:4,f:[{p:[38,2,1248],t:7,e:"ui-display",a:{title:"No Design Selected."}}],n:50,x:{r:["data.design_selected"],s:"!_0"},p:[37,1,1216]}]},e.exports=a.extend(r.exports)},{341:341}],444:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[4,3,60],t:7,e:"ui-display",a:{title:"Destructive Analyzer Busy!"}}],n:50,r:"data.destroybusy",p:[3,2,32]},{t:4,n:51,f:[{t:4,f:[{p:[7,4,168],t:7,e:"ui-display",a:{title:"Destructive Analyzer Unloaded"}}],n:50,x:{r:["data.destroy_loaded"],s:"!_0"},p:[6,3,135]},{t:4,n:51,f:[{p:[9,4,248],t:7,e:"ui-display",a:{title:"Loaded Item"},f:[{p:[10,4,285],t:7,e:"ui-section",a:{title:"Name"},f:[{t:2,r:"data.destroy_name",p:[10,29,310]}]}]}," ",{p:[12,4,367],t:7,e:"ui-display",a:{title:"Boost Nodes"},f:[{t:4,f:[{p:[14,6,438],t:7,e:"ui-section",a:{title:[{t:2,r:"name",p:[14,25,457]}," | ",{t:2,r:"value",p:[14,36,468]}]},f:[{p:[15,7,487],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["allow"],s:'_0?null:"disabled"'},p:[15,25,505]}],action:"deconstruct",params:['{"id":',{t:2,r:"id",p:[15,90,570]},"}"]},f:["Deconstruct and Boost"]}]}],n:52,r:"data.boost_paths",p:[13,5,405]}]}," ",{p:[19,4,670],t:7,e:"ui-button",a:{action:"eject_da"},f:["Eject Item"]}],x:{r:["data.destroy_loaded"],s:"!_0"}}],r:"data.destroybusy"}],n:50,r:"data.destroy_linked",p:[2,1,2]},{t:4,n:51,f:[{p:[23,2,755],t:7,e:"ui-display",a:{title:"No Linked Destructive Analyzer"}}],r:"data.destroy_linked"}]},e.exports=a.extend(r.exports)},{341:341}],445:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Design Disk Loaded"}}],n:50,x:{r:["data.ddisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,121],t:7,e:"ui-display",a:{title:"Design Disk Updating"}}],n:50,r:"data.ddisk_update",p:[5,2,92]},{t:4,n:51,f:[{ -t:4,f:[{p:[9,4,221],t:7,e:"ui-display",a:{title:"Design Disk"},f:[{p:[10,5,259],t:7,e:"ui-section",a:{title:"Disk Space"},f:["Disk Capacity: ",{t:2,r:"data.ddisk_size",p:[10,51,305]}," blueprints."]}," ",{p:[11,5,355],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[11,33,383],t:7,e:"ui-button",a:{action:"ddisk_upall"},f:["Upload all designs"]}]}," ",{p:[12,5,464],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[12,36,495],t:7,e:"ui-button",a:{action:"clear_designdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[13,5,591],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[13,36,622],t:7,e:"ui-button",a:{action:"eject_designdisk"},f:["Eject Disk"]}]}]}," ",{p:[15,4,717],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[17,6,792],t:7,e:"ui-section",a:{title:"Number"},f:["#",{t:2,r:"pos",p:[17,34,820]},": ",{t:4,f:[{p:[19,8,866],t:7,e:"ui-button",a:{action:"upload_empty_ddisk_slot",params:['{"slot": "',{t:2,r:"pos",p:[19,70,928]},'"}']},f:["Upload to Empty Slot"]}],n:50,x:{r:["id"],s:'_0=="null"'},p:[18,7,837]},{t:4,n:51,f:[{p:[21,8,996],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[21,58,1046]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[21,75,1063]}]},f:[{t:2,r:"name",p:[21,122,1110]}]}," ",{p:[22,8,1139],t:7,e:"ui-button",a:{action:"ddisk_erasepos",style:"danger",params:['{"id": "',{t:2,r:"id",p:[22,74,1205]},'"}'],state:[{t:2,x:{r:["id"],s:'_0=="null"?"disabled":null'},p:[22,91,1222]}]},f:["Delete Slot"]}],x:{r:["id"],s:'_0=="null"'}}]}],n:52,r:"data.ddisk_designs",p:[16,5,757]}]}],n:50,x:{r:["data.ddisk_upload"],s:"!_0"},p:[8,3,190]},{t:4,n:51,f:[{p:[28,4,1367],t:7,e:"ui-display",a:{title:"Upload Design to Disk"},f:[{p:[28,46,1409],t:7,e:"ui-section",f:["Available Designs:"]}]}," ",{t:4,f:[{p:[30,5,1513],t:7,e:"ui-section",f:[{p:[30,17,1525],t:7,e:"ui-button",a:{action:"ddisk_uploaddesign",params:['{"id": "',{t:2,r:"id",p:[30,72,1580]},'"}']},f:[{t:2,r:"name",p:[30,82,1590]}]}]}],n:52,r:"data.ddisk_possible_designs",p:[29,4,1470]}],x:{r:["data.ddisk_upload"],s:"!_0"}}],r:"data.ddisk_update"}],x:{r:["data.ddisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],446:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Technology Disk Loaded"}}],n:50,x:{r:["data.tdisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,125],t:7,e:"ui-display",a:{title:"Technology Disk Updating"}}],n:50,r:"data.tdisk_update",p:[5,2,96]},{t:4,n:51,f:[{p:[8,3,198],t:7,e:"ui-display",a:{title:"Technology Disk"},f:[{p:[9,4,239],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[9,32,267],t:7,e:"ui-button",a:{action:"tdisk_down"},f:["Download Research to Disk"]},{p:[9,100,335],t:7,e:"ui-button",a:{action:"tdisk_up"},f:["Upload Research from Disk"]}," ",{p:[10,4,406],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[10,35,437],t:7,e:"ui-button",a:{action:"clear_techdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[11,4,530],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[11,35,561],t:7,e:"ui-button",a:{action:"eject_techdisk"},f:["Eject Disk"]}]}]}]}," ",{p:[13,3,652],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[15,5,723],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,53,771]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,70,788]}]},f:[{t:2,r:"display_name",p:[15,115,833]}]}],n:52,r:"data.tdisk_nodes",p:[14,4,691]}]}],r:"data.tdisk_update"}],x:{r:["data.tdisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],447:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,29],t:7,e:"ui-display",a:{title:[{t:2,r:"data.snode_name",p:[2,21,48]}]},f:[{p:[3,3,73],t:7,e:"ui-section",a:{title:"Description"},f:["Description: ",{t:2,r:"data.snode_desc",p:[3,48,118]}]}," ",{p:[4,3,154],t:7,e:"ui-section",a:{title:"Point Cost"},f:["Point Cost: ",{t:2,r:"data.snode_cost",p:[4,46,197]}]}," ",{p:[5,3,233],t:7,e:"ui-section",a:{title:"Export Price"},f:["Export Price: ",{t:2,r:"data.snode_export",p:[5,50,280]}]}," ",{p:[6,3,318],t:7,e:"ui-button",a:{action:"research_node",params:['{"id"="',{t:2,r:"id",p:[6,52,367]},'"}'],state:[{t:2,x:{r:["data.snode_researched"],s:'_0?"disabled":null'},p:[6,69,384]}]},f:[{t:2,x:{r:["data.snode_researched"],s:'_0?"Researched":"Research Node"'},p:[6,115,430]}]}]}," ",{p:[8,2,518],t:7,e:"ui-display",a:{title:"Prerequisites"},f:[{t:4,f:[{p:[10,4,588],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[10,52,636]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[10,69,653]}]},f:[{t:2,r:"display_name",p:[10,114,698]}]}],n:52,r:"data.node_prereqs",p:[9,3,556]}]}," ",{p:[13,2,759],t:7,e:"ui-display",a:{title:"Unlocks"},f:[{t:4,f:[{p:[15,4,823],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,52,871]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,69,888]}]},f:[{t:2,r:"display_name",p:[15,114,933]}]}],n:52,r:"data.node_unlocks",p:[14,3,791]}]}," ",{p:[18,2,994],t:7,e:"ui-display",a:{title:"Designs"},f:[{t:4,f:[{p:[20,4,1058],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[20,54,1108]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[20,71,1125]}]},f:[{t:2,r:"name",p:[20,118,1172]}]}],n:52,r:"data.node_designs",p:[19,3,1026]}]}],n:50,r:"data.node_selected",p:[1,1,0]},{t:4,f:[{p:[25,2,1263],t:7,e:"ui-display",a:{title:"No Node Selected."}}],n:50,x:{r:["data.node_selected"],s:"!_0"},p:[24,1,1233]}]},e.exports=a.extend(r.exports)},{341:341}],448:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,59],t:7,e:"ui-display",a:{title:"Protolathe Busy!"}}],n:50,r:"data.protobusy",p:[2,2,33]},{t:4,n:51,f:[{p:[5,3,124],t:7,e:"ui-display",f:[{p:[6,4,141],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,183],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,196]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,255],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "proto", "inputText" : ',{t:2,r:"textsearch",p:[8,82,332]},"}"]},f:["Search"]}]}," ",{p:[10,4,390],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.protomats",p:[10,27,413]}," / ",{t:2,r:"data.protomaxmats",p:[10,48,434]}]}," ",{p:[11,4,473],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.protochems",p:[11,26,495]}," / ",{t:2,r:"data.protomaxchems",p:[11,48,517]}]}," ",{p:[12,3,556],t:7,e:"ui-display",f:[{p:[14,3,574],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,589]}]},f:[{p:[15,4,615],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,678],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.protocat","name"],s:'_0==_1?"selected":null'},p:[17,43,715]}],params:['{"type" : "proto", "cat" : "',{t:2,r:"name",p:[17,125,797]},'"}']},f:[{t:2,r:"name",p:[17,137,809]}]}],n:52,r:"data.protocats",p:[16,5,647]}]}," ",{p:[20,4,860],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,926],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,938]},{t:2,r:"matstring",p:[22,26,946]}," ",{t:4,f:[{p:[24,8,996],t:7,e:"input",a:{value:[{t:2,r:"number",p:[24,21,1009]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[24,47,1035]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[23,7,967]}," ",{p:[26,7,1108],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[26,40,1141]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[26,117,1218]},'", "amount" : "',{t:2,r:"number",p:[26,138,1239]},'"}']},f:["Print"]}]}],n:52,r:"data.protodes",p:[21,5,896]}]}," ",{p:[30,4,1321],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[32,6,1386],t:7,e:"ui-section",f:[{t:2,r:"name",p:[32,18,1398]},{t:2,r:"matstring",p:[32,26,1406]}," ",{t:4,f:[{p:[34,8,1456],t:7,e:"input",a:{value:[{t:2,r:"number",p:[34,21,1469]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[34,47,1495]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[33,7,1427]}," ",{p:[36,7,1568],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[36,40,1601]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[36,117,1678]},'", "amount" : "',{t:2,r:"number",p:[36,138,1699]},'"}']},f:["Print"]}]}],n:52,r:"data.protomatch",p:[31,5,1354]}]}," ",{p:[40,4,1781],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[42,6,1844],t:7,e:"ui-section",f:[{t:2,r:"name",p:[42,18,1856]}," : ",{t:2,r:"amount",p:[42,29,1867]}," cm3 - ",{t:4,f:[{p:[44,7,1917],t:7,e:"input",a:{value:[{t:2,r:"number",p:[44,20,1930]}],placeholder:["1-",{t:2,r:"sheets",p:[44,46,1956]}],"class":"number"}}," ",{p:[45,7,1992],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "proto", "mat_id" : ',{t:2,r:"mat_id",p:[45,82,2067]},', "sheets" : ',{t:2,r:"number",p:[45,105,2090]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[43,6,1891]}]}],n:52,r:"data.protomat_list",p:[41,5,1809]}]}," ",{p:[50,4,2187],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[52,6,2251],t:7,e:"ui-section",f:[{t:2,r:"name",p:[52,18,2263]}," : ",{t:2,r:"amount",p:[52,29,2274]}," - ",{p:[53,7,2295],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "proto", "name" : ',{t:2,r:"name",p:[53,78,2366]},', "id" : ',{t:2,r:"reagentid",p:[53,95,2383]},"}"]},f:["Purge"]}]}],n:52,r:"data.protochem_list",p:[51,5,2215]}]}]}]}]}],r:"data.protobusy"}],n:50,r:"data.protolathe_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[61,2,2504],t:7,e:"ui-display",a:{title:"No Linked Protolathe"}}],r:"data.protolathe_linked"}]},e.exports=a.extend(r.exports)},{341:341}],449:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,1,14],t:7,e:"span",a:{"class":"memoedit"},f:["Nanotrasen R&D Console"]},{p:[2,53,66],t:7,e:"br"}," Available Points: ",{p:[3,19,91],t:7,e:"ui-section",a:{title:"Research Points"},f:[{t:2,r:"data.research_points_stored",p:[3,55,127]}]}," ",{p:[4,1,173],t:7,e:"ui-section",a:{title:["Page Selection - ",{t:2,r:"page",p:[4,37,209]}]},f:[{p:[4,47,219],t:7,e:"input",a:{value:[{t:2,r:"pageselect",p:[4,60,232]}],placeholder:"1","class":"number"}}," Select Page: ",{p:[5,14,294],t:7,e:"ui-button",a:{action:"page",params:['{"num" : "',{t:2,r:"pageselect",p:[5,57,337]},'"}']},f:["[Go]"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],450:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"span",a:{"class":"bad"},f:["Settings"]},{p:[1,34,33],t:7,e:"br"},{p:[1,39,38],t:7,e:"br"}," ",{p:[2,1,45],t:7,e:"ui-button",a:{action:"Resync"},f:["RESYNC MACHINERY"]},{p:[2,56,100],t:7,e:"br"}," ",{p:[3,1,107],t:7,e:"ui-button",a:{action:"Lock"},f:["LOCK"]}," ",{p:[4,1,150],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "destroy"}',state:[{t:2,x:{r:["data.destroy_linked"],s:'_0?null:"disabled"'},p:[4,71,220]}]},f:["Disconnect Destructive Analyzer"]}," ",{p:[5,1,309],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "lathe"}',state:[{t:2,x:{r:["data.protolathe_linked"],s:'_0?null:"disabled"'},p:[5,69,377]}]},f:["Disconnect Protolathe"]}," ",{p:[6,1,459],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "imprinter"}',state:[{t:2,x:{r:["data.circuit_linked"],s:'_0?null:"disabled"'},p:[6,73,531]}]},f:["Disconnect Circuit Imprinter"]}]},e.exports=a.extend(r.exports)},{341:341}],451:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Available for Research"},f:[{t:4,f:[{p:[3,3,78],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[3,51,126]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[3,68,143]}]},f:[{t:2,r:"display_name",p:[3,113,188]}]}],n:52,r:"data.techweb_avail",p:[2,2,46]}]}," ",{p:[6,1,245],t:7,e:"ui-display",a:{title:"Locked Nodes"},f:[{t:4,f:[{p:[8,3,314],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[8,51,362]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[8,68,379]}]},f:[{t:2,r:"display_name",p:[8,113,424]}]}],n:52,r:"data.techweb_locked",p:[7,2,281]}]}," ",{p:[11,1,482],t:7,e:"ui-display",a:{title:"Researched Nodes"},f:[{t:4,f:[{p:[13,3,559],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[13,51,607]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[13,68,624]}]},f:[{t:2,r:"display_name",p:[13,113,669]}]}],n:52,r:"data.techweb_researched",p:[12,2,522]}]}]},e.exports=a.extend(r.exports)},{341:341}],452:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,25],t:7,e:"ui-notice",f:[{p:[3,3,40],t:7,e:"span",f:["The grinder is currently processing and cannot be used."]}]}],n:50,r:"data.processing",p:[1,1,0]},{p:{button:[{p:[8,5,208],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[8,36,239]}],action:"eject"},f:["Eject Contents"]}]},t:7,e:"ui-display",a:{title:"Processing Chamber",button:0},f:[" ",{p:[10,3,364],t:7,e:"ui-section",a:{label:"Grinding"},f:[{p:[11,5,399],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.operating"],s:'_0?"average":"good"'},p:[11,18,412]}]},f:[{t:2,x:{r:["data.operating"],s:'_0?"Busy":"Ready"'},p:[11,59,453]}]}," ",{p:[12,2,500],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[12,35,533]}],action:"grind"},f:["Activate"]}]}," ",{p:[14,3,653],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[17,9,755],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["The ",{t:2,r:"name",p:[17,56,802]}]},{p:[17,71,817],t:7,e:"br"}],n:52,r:"adata.contentslist",p:[16,7,717]},{t:4,n:51,f:[{p:[19,9,848],t:7,e:"span",f:["No Contents"]}],r:"adata.contentslist"}],n:50,r:"data.contents",p:[15,5,688]},{t:4,n:51,f:[{p:[22,7,911],t:7,e:"span",f:["No Contents"]}],r:"data.contents"}]}]}," ",{p:{button:[{p:[28,5,1047],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.isBeakerLoaded"],s:'(_0==0)&&_1?null:"disabled"'},p:[28,36,1078]}],action:"detach"},f:["Detach"]}]},t:7,e:"ui-display",a:{title:"Container",button:0},f:[" ",{p:[30,3,1202],t:7,e:"ui-section",a:{label:"Reagents"},f:[{t:4,f:[{p:[32,7,1272],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[32,13,1278]},"/",{t:2,r:"data.beakerMaxVolume",p:[32,55,1320]}," Units"]}," ",{p:[33,7,1365],t:7,e:"br"}," ",{t:4,f:[{p:[35,9,1418],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[35,52,1461]}," units of ",{t:2,r:"name",p:[35,87,1496]}]},{p:[35,102,1511],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[34,7,1378]},{t:4,n:51,f:[{p:[37,9,1542],t:7,e:"span",a:{"class":"bad"},f:["Container Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[31,5,1237]},{t:4,n:51,f:[{p:[40,7,1621],t:7,e:"span",a:{"class":"average"},f:["No Container"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],453:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"span",a:{"class":["pipes32x32 ",{t:2,r:"dir",p:[6,80,253]},"-",{t:2,r:"icon_state",p:[6,88,261]}],title:[{t:2,r:"dir_name",p:[6,111,284]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}," ",{t:4,f:[{p:[12,2,406],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[14,4,468],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["@key","data.selected_color"],s:'_0==_1?"selected":null'},p:[14,22,486]}],action:"color",params:['{"paint_color": ',{t:2,r:"@key",p:[15,44,583]},"}"]},f:[{t:2,r:"@key",p:[15,55,594]}]}],n:52,r:"data.paint_colors",p:[13,3,436]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[11,1,377]},{p:[19,1,654],t:7,e:"ui-display",a:{title:"Utilities"},f:[{p:[20,2,687],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&1?"check-square-o":"square-o"'},p:[20,19,704]}],action:"mode",params:'{"mode": 1}'},f:["Build"]}," ",{p:[22,2,813],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&2?"check-square-o":"square-o"'},p:[22,19,830]}],action:"mode",params:'{"mode": 2}'},f:["Wrench"]}," ",{p:[24,2,940],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&4?"check-square-o":"square-o"'},p:[24,19,957]}],action:"mode",params:'{"mode": 4}'},f:["Destroy"]}," ",{t:4,f:[{p:[27,3,1098],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&8?"check-square-o":"square-o"'},p:[27,20,1115]}],action:"mode",params:'{"mode": 8}'},f:["Paint"]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[26,2,1068]}]}," ",{p:[31,1,1249],t:7,e:"ui-display",a:{title:"Category"},f:[{p:[32,2,1281],t:7,e:"ui-section",f:[{p:[33,3,1297],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==0?"check-square-o":"square-o"'},p:[33,20,1314]}],state:[{t:2,x:{r:["data.category"],s:'_0<=0?"selected":null'},p:[33,83,1377]}],action:"category",params:'{"category": 0}'},f:["Atmospherics"]}," ",{p:[35,3,1496],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==1?"check-square-o":"square-o"'},p:[35,20,1513]}],state:[{t:2,x:{r:["data.category"],s:'_0==1?"selected":null'},p:[35,83,1576]}],action:"category",params:'{"category": 1}'},f:["Disposals"]}," ",{p:[37,3,1692],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==2?"check-square-o":"square-o"'},p:[37,20,1709]}],state:[{t:2,x:{r:["data.category"],s:'_0==2?"selected":null'},p:[37,83,1772]}],action:"category",params:'{"category": 2}'},f:["Transit Tubes"]}]}," ",{t:4,f:[{p:[41,3,1937],t:7,e:"ui-section",a:{label:"Piping Layer"},f:[{p:[42,4,1975],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==1?"selected":null'},p:[42,22,1993]}],action:"piping_layer",params:'{"piping_layer": 1}'},f:["1"]}," ",{p:[44,4,2115],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==2?"selected":null'},p:[44,22,2133]}],action:"piping_layer",params:'{"piping_layer": 2}'},f:["2"]}," ",{p:[46,4,2255],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==3?"selected":null'},p:[46,22,2273]}],action:"piping_layer",params:'{"piping_layer": 3}'},f:["3"]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[40,2,1907]}]}," ",{t:4,f:[{p:[52,2,2462],t:7,e:"ui-display",a:{title:[{t:2,r:"cat_name",p:[52,21,2481]}]},f:[{t:4,f:[{p:[54,4,2521],t:7,e:"ui-section",f:[{p:[55,5,2539],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[55,23,2557]}],action:"pipe_type",params:['{"pipe_type": ',{t:2,r:"pipe_index",p:[56,28,2638]},', "category": ',{t:2,r:"cat_name",p:[56,56,2666]},"}"]},f:[{t:2,r:"pipe_name",p:[56,71,2681]}]}]}],n:52,r:"recipes",p:[53,3,2499]}]}],n:52,r:"data.categories",p:[51,1,2434]}]},e.exports=a.extend(r.exports)},{341:341}],454:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[3,21,78]}],action:"color",params:['{"paint_color": ',{t:2,r:"color_name",p:[4,28,155]},"}"]},f:[{t:2,r:"color_name",p:[4,45,172]}]}],n:52,r:"data.paint_colors",p:[2,2,29]}]}]},e.exports=a.extend(r.exports)},{341:341}],455:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"img",a:{src:["pipe.",{t:2,r:"dir",p:[6,71,244]},".",{t:2,r:"icon_state",p:[6,79,252]},".png"],title:[{t:2,r:"dir_name",p:[6,106,279]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}]},e.exports=a.extend(r.exports)},{341:341}],456:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{341:341}],457:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,26],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[2,20,43]}],style:[{t:2,x:{r:["enabled"],s:'_0?"selected":null'},p:[2,72,95]}],action:"toggle_filter",params:['{"id_tag": "',{t:2,r:"id_tag",p:[3,48,176]},'", "val": ',{t:2,r:"gas_id",p:[3,68,196]},"}"]},f:[{t:2,r:"gas_name",p:[3,81,209]}]}],n:52,r:"filter_types",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],458:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(459),templates:t(461),status:t(460)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,459:459,460:460,461:461}],459:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=a.extend(r.exports)},{341:341}],460:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"table",a:{width:"100%"},f:[{t:4,f:[{p:[3,3,49],t:7,e:"tr",f:[{p:[4,5,59],t:7,e:"td",f:[{p:[5,7,71],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[5,69,133]},'"}']},f:["JMP"]}]}," ",{p:[9,5,193],t:7,e:"td",f:[{p:[10,7,205],t:7,e:"ui-button",a:{action:"fly",params:['{"id": "',{t:2,r:"id",p:[10,47,245]},'"}'],state:[{t:2,x:{r:["can_fly"],s:'_0?null:"disabled"'},p:[10,64,262]}]},f:["Fly"]}]}," ",{p:[14,5,345],t:7,e:"td",f:[{t:2,r:"name",p:[15,7,357]}," (",{p:[15,17,367],t:7,e:"code",f:[{t:2,r:"id",p:[15,23,373]}]},")"]}," ",{p:[17,5,404],t:7,e:"td",f:[{t:2,r:"status",p:[18,7,416]}]}," ",{p:[20,5,443],t:7,e:"td",f:[{t:4,f:[{t:2,r:"mode",p:[22,9,477]}],n:50,r:"mode",p:[21,7,455]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[25,10,532]},") ",{p:[26,9,555],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[26,57,603]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[26,74,620]}]},f:["Fast Travel"]}],n:50,r:"timer",p:[24,7,508]}]}]}],n:52,r:"data.shuttles",p:[2,1,22]}]}]},e.exports=a.extend(r.exports)},{341:341}],461:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=a.extend(r.exports)},{341:341}],462:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,186],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,220],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,233]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,262]}]}]}," ",{p:[9,5,315],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[10,7,350],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[10,20,363]}],max:[{t:2,r:"data.occupant.maxHealth",p:[10,54,397]}],value:[{t:2,r:"data.occupant.health",p:[10,90,433]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[11,16,475]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[11,68,527]}]}]}," ",{t:4,f:[{p:[14,7,764],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[14,26,783]}]},f:[{p:[15,9,804],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[15,30,825]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[15,66,861]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[15,103,898]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[13,5,598]}," ",{t:4,f:[{p:[19,7,1020],t:7,e:"ui-section",a:{label:"Blood"},f:[{p:[20,9,1056],t:7,e:"ui-section",a:{label:"Volume"},f:[{p:[21,11,1095],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.blood.maxBloodVolume",p:[21,32,1116]}],value:[{t:2,r:"data.occupant.blood.currentBloodVolume",p:[21,79,1163]}],state:[{t:2,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"bad":"good"'},p:[21,130,1214]}]},f:[{t:3,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"LOW":"OK"'},p:[21,232,1316]}," - ",{t:2,x:{r:["data.occupant.blood.currentBloodVolume"],s:"Math.round(_0)"},p:[21,342,1426]}," cl"]}]}," ",{p:[23,9,1525],t:7,e:"ui-section",a:{label:"Type"},f:[{p:[24,11,1562],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:"data.occupant.blood.bloodType",p:[24,35,1586]}]}]}]}],n:50,r:"data.occupant.blood",p:[18,5,985]}," ",{p:[28,5,1689],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[29,9,1725],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[29,22,1738]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[29,68,1784]}]}]}," ",{p:[31,5,1867],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[32,9,1903],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[32,22,1916]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[32,68,1962]}]}]}," ",{p:[34,5,2046],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[36,11,2133],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[36,54,2176]}," units of ",{t:2,r:"name",p:[36,89,2211]}]},{p:[36,104,2226],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[35,9,2088]},{t:4,n:51,f:[{p:[38,11,2261],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[5,3,159]}]}," ",{p:[43,1,2357],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[44,2,2389],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[45,5,2420],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[45,22,2437]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[45,71,2486]}]}]}," ",{p:[47,3,2551],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[49,7,2612],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[49,38,2643]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[49,122,2727]},'"}']},f:[{t:2,r:"name",p:[49,132,2737]}]},{p:[49,152,2757],t:7,e:"br"}],n:52,r:"data.chems",p:[48,5,2584]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],463:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:4,f:["You Are Here"],n:50,x:{r:["occupied"],s:'_0=="owner"'},p:[10,7,491]},{t:4,n:51,f:[{t:4,f:["Occupied"],n:50,x:{r:["occupied"],s:'_0=="stranger"'},p:[13,9,566]},{t:4,n:51,f:["Swap"],x:{r:["occupied"],s:'_0=="stranger"'}}],x:{r:["occupied"],s:'_0=="owner"'}}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],464:[function(t,e,n){var a=t(341),r={exports:{} -};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,23,82],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.drying"],s:'_0?"stop":"tint"'},p:[4,40,99]}],action:"Dry"},f:[{t:2,x:{r:["data.drying"],s:'_0?"Stop drying":"Dry"'},p:[4,88,147]}]}],n:50,r:"data.isdryer",p:[4,3,62]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[7,3,258],t:7,e:"ui-notice",f:[{p:[8,5,275],t:7,e:"span",f:["Unfortunately, this ",{t:2,r:"data.name",p:[8,31,301]}," is empty."]}]}],n:50,x:{r:["data.contents.length"],s:"_0==0"},p:[6,1,221]},{t:4,n:51,f:[{p:[11,1,359],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[12,2,391],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[13,4,425],t:7,e:"section",a:{"class":"cell bold"},f:["Item"]}," ",{p:[16,4,482],t:7,e:"section",a:{"class":"cell bold"},f:["Quantity"]}," ",{p:[19,4,543],t:7,e:"section",a:{"class":"cell bold",align:"center"},f:[{t:4,f:[{t:2,r:"data.verb",p:[20,22,608]}],n:50,r:"data.verb",p:[20,5,591]},{t:4,n:51,f:["Dispense"],r:"data.verb"}]}]}," ",{t:4,f:[{p:[24,3,703],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[25,4,737],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[26,5,765]}]}," ",{p:[28,4,793],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[29,5,835]}]}," ",{p:[31,4,865],t:7,e:"section",a:{"class":"table",alight:"right"},f:[{p:[32,5,909],t:7,e:"section",a:{"class":"cell"}}," ",{p:[33,5,947],t:7,e:"section",a:{"class":"cell"},f:[{p:[34,6,976],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[34,45,1015]}],params:['{ "name" : ',{t:2,r:"name",p:[34,102,1072]},', "amount" : 1 }']},f:["One"]}]}," ",{p:[38,5,1151],t:7,e:"section",a:{"class":"cell"},f:[{p:[39,6,1180],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>1)?null:"disabled"'},p:[39,45,1219]}],params:['{ "name" : ',{t:2,r:"name",p:[39,101,1275]}," }"]},f:["Many"]}]}]}]}],n:52,r:"data.contents",p:[23,2,676]}]}],x:{r:["data.contents.length"],s:"_0==0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],465:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]},"   [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,r:"adata.inputLevel_text",p:[37,78,1447]}]}]}," ",{p:[39,3,1501],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1540],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1579]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1674],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1708]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1804],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1894],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1927]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2039],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2077]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2204],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2238],t:7,e:"span",f:[{t:2,r:"adata.inputAvailable",p:[47,9,2244]}]}]}]}," ",{p:[50,1,2308],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2339],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2377],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2394]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2449]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2519]}]},"   [",{p:[55,6,2587],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2600]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2617]}]},"]"]}," ",{p:[57,3,2724],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2764],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2785]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2817]}]},f:[{t:2,r:"adata.outputLevel_text",p:[58,80,2839]}]}]}," ",{p:[60,3,2894],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2934],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2973]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3070],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3104]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3202],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3293],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3326]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3441],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3479]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3609],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3644],t:7,e:"span",f:[{t:2,r:"adata.outputUsed",p:[68,9,3650]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],466:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:["\ufeff",{t:4,f:[" ",{p:[2,2,33],t:7,e:"ui-display",a:{title:"Dispersal Tank"},f:[{p:[3,3,73],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[4,4,104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.active"],s:'_0?"power-off":"close"'},p:[4,21,121]}],style:[{t:2,x:{r:["data.active"],s:'_0?"selected":null'},p:[5,12,174]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[6,12,223]}],action:"power"},f:[{t:2,x:{r:["data.active"],s:'_0?"On":"Off"'},p:[7,20,286]}]}]}," ",{p:[10,3,354],t:7,e:"ui-section",a:{label:"Smoke Radius Setting"},f:[{p:[11,5,401],t:7,e:"div",a:{"class":"content",style:"float:left"},f:[{p:[12,6,448],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=1?null:"disabled"'},p:[12,36,478]}],style:[{t:2,x:{r:["data.setting"],s:'_0==1?"selected":null'},p:[12,89,531]}],action:"setting",params:'{"amount": 1}'},f:["3"]}," ",{p:[13,6,634],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=2?null:"disabled"'},p:[13,36,664]}],style:[{t:2,x:{r:["data.setting"],s:'_0==2?"selected":null'},p:[13,89,717]}],action:"setting",params:'{"amount": 2}'},f:["6"]}," ",{p:[14,6,820],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=3?null:"disabled"'},p:[14,36,850]}],style:[{t:2,x:{r:["data.setting"],s:'_0==3?"selected":null'},p:[14,89,903]}],action:"setting",params:'{"amount": 3}'},f:["9"]}," ",{p:[15,6,1006],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=4?null:"disabled"'},p:[15,36,1036]}],style:[{t:2,x:{r:["data.setting"],s:'_0==4?"selected":null'},p:[15,89,1089]}],action:"setting",params:'{"amount": 4}'},f:["12"]}," ",{p:[16,6,1193],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=5?null:"disabled"'},p:[16,36,1223]}],style:[{t:2,x:{r:["data.setting"],s:'_0==5?"selected":null'},p:[16,89,1276]}],action:"setting",params:'{"amount": 5}'},f:["15"]}]}]}," ",{p:[19,3,1410],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[21,6,1476],t:7,e:"span",f:[{t:2,x:{r:["adata.TankCurrentVolume"],s:"Math.round(_0)"},p:[21,12,1482]},"/",{t:2,r:"data.TankMaxVolume",p:[21,52,1522]}," Units"]}," ",{p:[22,6,1564],t:7,e:"br"}," ",{p:[23,5,1575],t:7,e:"br"}," ",{t:4,f:[{p:[25,7,1623],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[25,50,1666]}," units of ",{t:2,r:"name",p:[25,85,1701]}]},{p:[25,100,1716],t:7,e:"br"}],n:52,r:"adata.TankContents",p:[24,6,1587]}],n:50,r:"data.isTankLoaded",p:[20,4,1444]},{t:4,n:51,f:[{p:[28,6,1757],t:7,e:"span",a:{"class":"bad"},f:["Tank Empty"]}],r:"data.isTankLoaded"}," ",{p:[30,4,1809],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Eject":"Close"'},p:[30,21,1826]}],style:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"selected":null'},p:[31,12,1881]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[32,12,1936]}],action:"purge"},f:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Purge Contents":"No chemicals detected"'},p:[33,20,1999]}]}]}]}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,2,1]}]},e.exports=a.extend(r.exports)},{341:341}],467:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],468:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],469:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,8,97],t:7,e:"ui-button",a:{action:"jump",params:['{"name" : ',{t:2,r:"name",p:[4,51,140]},"}"]},f:["Jump"]}," ",{p:[7,9,195],t:7,e:"ui-button",a:{action:"spawn",params:['{"name" : ',{t:2,r:"name",p:[7,53,239]},"}"]},f:["Spawn"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[2,22,46]}],button:0},f:[" ",{p:[11,3,308],t:7,e:"ui-section",a:{label:"Description"},f:[{p:[12,5,346],t:7,e:"span",f:[{t:3,r:"desc",p:[12,11,352]}]}]}," ",{p:[14,3,390],t:7,e:"ui-section",a:{label:"Spawners left"},f:[{p:[15,5,430],t:7,e:"span",f:[{t:2,r:"amount_left",p:[15,11,436]}]}]}]}],n:52,r:"data.spawners",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],470:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],471:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=a.extend(r.exports)},{341:341}],472:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],473:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],474:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],475:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 1:return"good";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,173],t:7,e:"ui-notice",f:[{p:[14,2,187],t:7,e:"ui-section",a:{label:"Reconnect"},f:[{p:[15,3,221],t:7,e:"div",a:{style:"float:right"},f:[{p:[16,4,251],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]}]}]}," ",{p:[20,1,359],t:7,e:"ui-display",a:{title:"Turbine Controller"},f:[{p:[21,2,401],t:7,e:"ui-section",a:{label:"Status"},f:[{t:4,f:[{p:[23,4,456],t:7,e:"span",a:{"class":"bad"},f:["Broken"]}],n:50,r:"data.broken",p:[22,3,432]},{t:4,n:51,f:[{p:[25,4,504],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.online"],s:"_0(_1)"},p:[25,17,517]}]},f:[{t:2,x:{r:["data.online","data.compressor_broke","data.turbine_broke"],s:'_0&&!(_1||_2)?"Online":"Offline"'},p:[25,46,546]}]}],r:"data.broken"}," ",{p:[27,3,656],t:7,e:"div",a:{style:"float:right"},f:[{p:[28,4,686],t:7,e:"ui-button",a:{icon:"power-off",action:"power-on",state:[{t:2,r:"data.broken",p:[28,57,739]}],style:[{t:2,x:{r:["data.online"],s:'_0?"selected":""'},p:[28,81,763]}]},f:["On"]}," ",{p:[29,4,817],t:7,e:"ui-button",a:{icon:"close",action:"power-off",state:[{t:2,r:"data.broken",p:[29,54,867]}],style:[{t:2,x:{r:["data.online"],s:'_0?"":"selected"'},p:[29,78,891]}]},f:["Off"]}]}," ",{t:4,f:[{p:[32,4,989],t:7,e:"br"}," [ ",{p:[33,6,1e3],t:7,e:"span",a:{"class":"bad"},f:["Compressor is inoperable"]}," ]"],n:50,r:"data.compressor_broke",p:[31,3,955]}," ",{t:4,f:[{p:[36,4,1097],t:7,e:"br"}," [ ",{p:[37,6,1108],t:7,e:"span",a:{"class":"bad"},f:["Turbine is inoperable"]}," ]"],n:50,r:"data.turbine_broke",p:[35,3,1066]}]}]}," ",{p:[41,1,1200],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[42,2,1230],t:7,e:"ui-section",a:{label:"Turbine Speed"},f:[{p:[43,3,1268],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.rpm"],s:'_0?"--":_1'},p:[43,9,1274]}," RPM"]}]}," ",{p:[45,2,1337],t:7,e:"ui-section",a:{label:"Internal Temp"},f:[{p:[46,3,1375],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.temp"],s:'_0?"--":_1'},p:[46,9,1381]}," K"]}]}," ",{p:[48,2,1443],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{p:[49,3,1483],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.power"],s:'_0?"--":_1'},p:[49,9,1489]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],476:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{341:341}],477:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,331],t:7,e:"ui-notice",f:[{p:[17,4,347],t:7,e:"span",f:["Safety restraints disabled."]}]}],n:50,r:"data.emagged",p:[15,2,307]}," ",{t:4,f:[{p:[21,3,442],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[22,4,482],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[23,5,513]}]}," ",{p:[25,4,559],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[26,5,592]}]}," ",{p:[28,4,640],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,5,673],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[29,26,694]}],value:[{t:2,r:"adata.vr_avatar.health",p:[29,64,732]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[29,99,767]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[29,140,808]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[29,179,847]}]}]}]}],n:50,r:"data.vr_avatar",p:[20,2,416]},{t:4,n:51,f:[{p:[33,3,935],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[37,2,1031],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[38,3,1067],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[38,20,1084]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[39,4,1151]}," the VR Sleeper"]}," ",{t:4,f:[{p:[42,4,1253],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[41,3,1225]}," ",{t:4,f:[{p:[47,4,1376],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar"},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[46,3,1349]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],478:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}'] -},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=a.extend(r.exports)},{341:341}],479:[function(t,e,n){(function(e){"use strict";var n=t(341),a=e.interopRequireDefault(n);t(331),t(1),t(327),t(330);var r=t(480),i=e.interopRequireDefault(r),o=t(481),s=t(328),p=t(329),u=e.interopRequireDefault(p);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(485)),window.initialize=function(e){window.tgui=window.tgui||new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(482),text:t(486),config:n.config,data:n.data,adata:n.data}}})};var c=document.getElementById("data"),l=c.textContent,d=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(d,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var f=new u["default"]("FontAwesome");f.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,327:327,328:328,329:329,330:330,331:331,341:341,480:480,481:481,482:482,485:485,486:486,"babel/external-helpers":"babel/external-helpers"}],480:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(481),a=t(483);e.exports={components:{"ui-bar":t(342),"ui-button":t(343),"ui-display":t(344),"ui-input":t(345),"ui-linegraph":t(346),"ui-notice":t(347),"ui-section":t(349),"ui-subdisplay":t(350),"ui-tabs":t(351)},events:{enter:t(339).enter,space:t(339).space},transitions:{fade:t(340)},onconfig:function(){var e=this.get("config.interface"),n={ai_airlock:t(355),airalarm:t(356),"airalarm/back":t(357),"airalarm/modes":t(358),"airalarm/scrubbers":t(359),"airalarm/status":t(360),"airalarm/thresholds":t(361),"airalarm/vents":t(362),airlock_electronics:t(363),apc:t(364),atmos_alert:t(365),atmos_control:t(366),atmos_filter:t(367),atmos_mixer:t(368),atmos_pump:t(369),borgopanel:t(370),brig_timer:t(371),bsa:t(372),canister:t(373),cargo:t(374),cargo_express:t(375),cellular_emporium:t(376),centcom_podlauncher:t(377),chem_dispenser:t(378),chem_heater:t(379),chem_master:t(380),chem_synthesizer:t(381),clockwork_slab:t(382),codex_gigas:t(383),computer_fabricator:t(384),crayon:t(385),crew:t(386),cryo:t(387),disposal_unit:t(388),dna_vault:t(389),dogborg_sleeper:t(390),eightball:t(391),emergency_shuttle_console:t(392),engraved_message:t(393),error:t(394),"exofab - Copia":t(395),exonet_node:t(396),firealarm:t(397),gps:t(398),gulag_console:t(399),gulag_item_reclaimer:t(400),holodeck:t(401),implantchair:t(402),intellicard:t(403),keycard_auth:t(404),labor_claim_console:t(405),language_menu:t(406),launchpad_remote:t(407),mech_bay_power_console:t(408),mulebot:t(409),nanite_chamber_control:t(410),nanite_cloud_control:t(411),nanite_program_hub:t(412),nanite_programmer:t(413),nanite_remote:t(414),notificationpanel:t(415),ntnet_relay:t(416),ntos_ai_restorer:t(417),ntos_card:t(418),ntos_configuration:t(419),ntos_file_manager:t(420),ntos_main:t(421),ntos_net_chat:t(422),ntos_net_dos:t(423),ntos_net_downloader:t(424),ntos_net_monitor:t(425),ntos_net_transfer:t(426),ntos_power_monitor:t(427),ntos_revelation:t(428),ntos_station_alert:t(429),ntos_supermatter_monitor:t(430),ntosheader:t(431),nuclear_bomb:t(432),operating_computer:t(433),ore_redemption_machine:t(434),pandemic:t(435),personal_crafting:t(436),portable_pump:t(437),portable_scrubber:t(438),power_monitor:t(439),radio:t(440),rdconsole:t(441),"rdconsole/circuit":t(442),"rdconsole/designview":t(443),"rdconsole/destruct":t(444),"rdconsole/diskopsdesign":t(445),"rdconsole/diskopstech":t(446),"rdconsole/nodeview":t(447),"rdconsole/protolathe":t(448),"rdconsole/rdheader":t(449),"rdconsole/settings":t(450),"rdconsole/techweb":t(451),reagentgrinder:t(452),rpd:t(453),"rpd/colorsel":t(454),"rpd/dirsel":t(455),sat_control:t(456),scrubbing_types:t(457),shuttle_manipulator:t(458),"shuttle_manipulator/modification":t(459),"shuttle_manipulator/status":t(460),"shuttle_manipulator/templates":t(461),sleeper:t(462),slime_swap_body:t(463),smartvend:t(464),smes:t(465),smoke_machine:t(466),solar_control:t(467),space_heater:t(468),spawners_menu:t(469),station_alert:t(470),suit_storage_unit:t(471),tank_dispenser:t(472),tanks:t(473),thermomachine:t(474),turbine_computer:t(475),uplink:t(476),vr_sleeper:t(477),wires:t(478)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(354),titlebar:t(353),resize:t(348)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{339:339,340:340,341:341,342:342,343:343,344:344,345:345,346:346,347:347,348:348,349:349,350:350,351:351,353:353,354:354,355:355,356:356,357:357,358:358,359:359,360:360,361:361,362:362,363:363,364:364,365:365,366:366,367:367,368:368,369:369,370:370,371:371,372:372,373:373,374:374,375:375,376:376,377:377,378:378,379:379,380:380,381:381,382:382,383:383,384:384,385:385,386:386,387:387,388:388,389:389,390:390,391:391,392:392,393:393,394:394,395:395,396:396,397:397,398:398,399:399,400:400,401:401,402:402,403:403,404:404,405:405,406:406,407:407,408:408,409:409,410:410,411:411,412:412,413:413,414:414,415:415,416:416,417:417,418:418,419:419,420:420,421:421,422:422,423:423,424:424,425:425,426:426,427:427,428:428,429:429,430:430,431:431,432:432,433:433,434:434,435:435,436:436,437:437,438:438,439:439,440:440,441:441,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451,452:452,453:453,454:454,455:455,456:456,457:457,458:458,459:459,460:460,461:461,462:462,463:463,464:464,465:465,466:466,467:467,468:468,469:469,470:470,471:471,472:472,473:473,474:474,475:475,476:476,477:477,478:478,481:481,483:483}],481:[function(t,e,n){"use strict";function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],482:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],483:[function(t,e,n){"use strict";function a(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function r(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(481)},{481:481}],484:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;a||p.textContent.toLowerCase().includes(e)?p.style.display="":p.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],485:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],486:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var p=Array(o),u=0;o>u;u++)p[u]=arguments[u+3];n.children=p}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(p){r("throw",p)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(p){return void n(p)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],384:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["Network Card"]}," allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["Processor Unit"]}," is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["Tesla Relay"]}," is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["Nano Printer"]}," is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["Card Reader"]}," adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{341:341}],385:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],386:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{isHead:function(t){return t%10==0},dept_class:function(t){return 0==t?"dept-cap":t>=10&&20>t?"dept-sec":t>=20&&30>t?"dept-med":t>=30&&40>t?"dept-sci":t>=40&&50>t?"dept-eng":t>=50&&60>t?"dept-cargo":t>=200&&230>t?"dept-cent":"dept-other"},health_state:function(t,e,n,a){var r=t+e+n+a;return 0>=r?"health-5":25>=r?"health-4":50>=r?"health-3":75>=r?"health-2":"health-0"}}}}(r),r.exports.css=" .health {\r\n width: 16px;\r\n height: 16px;\r\n background-color: #FFF;\r\n border: 1px solid #434343;\r\n position: relative;\r\n top: 2px;\r\n display: inline-block;\r\n }\r\n .health-5 { background-color: #17d568; }\r\n .health-4 { background-color: #2ecc71; }\r\n .health-3 { background-color: #e67e22; }\r\n .health-2 { background-color: #ed5100; }\r\n .health-1 { background-color: #e74c3c; }\r\n .health-0 { background-color: #ed2814; }\r\n\r\n .dept-cap {color : #C06616;}\r\n .dept-sec {color : #E74C3C;}\r\n .dept-med {color : #3498DB;}\r\n .dept-sci {color : #9B59B6;}\r\n .dept-eng {color : #F1C40F;}\r\n .dept-cargo {color : #F39C12;}\r\n .dept-cent {color : #00C100;}\r\n .dept-other {color: #C38312;}\r\n\r\n .oxy { color : #3498db; }\r\n .toxin { color : #2ecc71; }\r\n .burn { color : #e67e22; }\r\n .brute { color : #e74c3c; }\r\n\r\n table.crew{\r\n border-collapse: collapse;\r\n }\r\n\r\n table.crew td {\r\n padding : 0px 10px;\r\n }",r.exports.template={v:3,t:[" ",{p:[27,1,1030],t:7,e:"ui-display",f:[{p:[28,2,1045],t:7,e:"ui-section",f:[{p:[29,3,1061],t:7,e:"table",a:{"class":"crew"},f:[{p:[30,3,1085],t:7,e:"thead",f:[{p:[31,3,1096],t:7,e:"tr",f:[{p:[32,4,1105],t:7,e:"th",f:["Name"]}," ",{p:[33,4,1123],t:7,e:"th",f:["Status"]}," ",{p:[34,4,1143],t:7,e:"th",f:["Vitals"]}," ",{p:[35,4,1163],t:7,e:"th",f:["Position"]}," ",{t:4,f:[{p:[37,5,1216],t:7,e:"th",f:["Tracking"]}],n:50,r:"data.link_allowed",p:[36,4,1185]}]}]}," ",{p:[41,3,1270],t:7,e:"tbody",f:[{t:4,f:[{p:[43,4,1308],t:7,e:"tr",f:[{p:[44,5,1318],t:7,e:"td",f:[{p:[45,6,1329],t:7,e:"span",a:{"class":[{t:2,x:{r:["isHead","ijob"],s:'_0(_1)?"bold ":""'},p:[45,19,1342]},{t:2,x:{r:["dept_class","ijob"],s:"_0(_1)"},p:[45,49,1372]}]},f:[{t:2,r:"name",p:[46,7,1402]}," (",{t:2,r:"assignment",p:[46,17,1412]},") ",{p:[47,6,1434],t:7,e:"span",f:[]}]}]}," ",{p:[49,5,1457],t:7,e:"td",f:[{t:4,f:[{p:[51,7,1498],t:7,e:"span",a:{"class":["health ",{t:2,x:{r:["health_state","oxydam","toxdam","burndam","brutedam"],s:"_0(_1,_2,_3,_4)"},p:[51,27,1518]}]}}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[50,6,1468]},{t:4,n:51,f:[{t:4,f:[{p:[54,8,1626],t:7,e:"span",a:{"class":"health health-5"}}],n:50,r:"life_status",p:[53,7,1598]},{t:4,n:51,f:[{p:[56,8,1688],t:7,e:"span",a:{"class":"health health-0"}}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[60,5,1771],t:7,e:"td",f:[{t:4,f:[{p:[62,7,1812],t:7,e:"span",f:["( ",{p:[64,8,1836],t:7,e:"span",a:{"class":"oxy"},f:[{t:2,r:"oxydam",p:[64,26,1854]}]}," / ",{p:[66,8,1890],t:7,e:"span",a:{"class":"toxin"},f:[{t:2,r:"toxdam",p:[66,28,1910]}]}," / ",{p:[68,8,1946],t:7,e:"span",a:{"class":"burn"},f:[{t:2,r:"burndam",p:[68,27,1965]}]}," / ",{p:[70,8,2002],t:7,e:"span",a:{"class":"brute"},f:[{t:2,r:"brutedam",p:[70,28,2022]}]}," )"]}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[61,6,1782]},{t:4,n:51,f:[{t:4,f:[{p:[75,8,2116],t:7,e:"span",f:["Alive"]}],n:50,r:"life_status",p:[74,7,2088]},{t:4,n:51,f:[{p:[77,8,2159],t:7,e:"span",f:["Dead"]}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[81,5,2222],t:7,e:"td",f:[{t:4,f:[{p:[83,6,2260],t:7,e:"span",f:[{t:2,r:"area",p:[83,12,2266]}]}],n:50,x:{r:["pos_x"],s:"_0!=null"},p:[82,5,2232]},{t:4,n:51,f:[{p:[85,6,2302],t:7,e:"span",f:["N/A"]}],x:{r:["pos_x"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[89,6,2381],t:7,e:"td",f:[{p:[90,7,2393],t:7,e:"ui-button",a:{action:"select_person",state:[{t:2,x:{r:["can_track"],s:'_0?null:"disabled"'},p:[90,48,2434]}],params:['{"name":"',{t:2,r:"name",p:[90,100,2486]},'"}']},f:["Track"]}]}],n:50,r:"data.link_allowed",p:[88,5,2348]}]}],n:52,r:"data.sensors",p:[42,3,1281]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{341:341}],387:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,189],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,223],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,236]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,265]}]}]}," ",{p:[9,4,317],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[10,6,356],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.temperaturestatus",p:[10,19,369]}]},f:[{t:2,r:"data.occupant.bodyTemperature",p:[10,56,406]}," K"]}]}," ",{p:[12,5,472],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[13,7,507],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[13,20,520]}],max:[{t:2,r:"data.occupant.maxHealth",p:[13,54,554]}],value:[{t:2,r:"data.occupant.health",p:[13,90,590]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[14,16,632]}]},f:[{t:2,r:"data.occupant.health",p:[14,68,684]}]}]}," ",{t:4,f:[{p:[17,7,908],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[17,26,927]}]},f:[{p:[18,9,948],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[18,30,969]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,66,1005]}],state:"bad"},f:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,103,1042]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[16,5,742]}],n:50,r:"data.hasOccupant",p:[5,3,159]}]}," ",{p:[23,1,1138],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[24,3,1167],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[25,5,1199],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[25,22,1216]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[26,14,1276]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[27,14,1332]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[28,22,1391]}]}]}," ",{p:[30,3,1459],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,3,1495],t:7,e:"span",a:{"class":[{t:2,r:"data.temperaturestatus",p:[31,16,1508]}]},f:[{t:2,r:"data.cellTemperature",p:[31,44,1536]}," K"]}]}," ",{p:[33,2,1588],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[34,5,1619],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[34,22,1636]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[34,73,1687]}]}," ",{p:[35,5,1740],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[35,22,1757]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[35,86,1821]}]}]}]}," ",{p:{button:[{p:[40,5,1967],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[40,36,1998]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[42,3,2101],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[45,9,2211],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,r:"volume",p:[45,52,2254]}," units of ",{t:2,r:"name",p:[45,72,2274]}]},{p:[45,87,2289],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[44,7,2171]},{t:4,n:51,f:[{p:[47,9,2320],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[43,5,2136]},{t:4,n:51,f:[{p:[50,7,2396],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],388:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle" +},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],389:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{341:341}],390:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,183],t:7,e:"ui-section",a:{label:"Items in storage"},f:[{p:[7,4,225],t:7,e:"span",f:[{t:2,r:"data.items",p:[7,10,231]}]}]}],n:50,r:"data.items",p:[5,3,159]}," ",{t:4,f:[{p:[11,5,310],t:7,e:"ui-section",a:{label:"State"},f:[{p:[12,7,344],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[12,20,357]}]},f:[{t:2,r:"data.occupant.stat",p:[12,49,386]}]}]}," ",{p:[14,5,439],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[15,7,474],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[15,20,487]}],max:[{t:2,r:"data.occupant.maxHealth",p:[15,54,521]}],value:[{t:2,r:"data.occupant.health",p:[15,90,557]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[16,16,599]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[16,68,651]}]}]}," ",{t:4,f:[{p:[19,7,888],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[19,26,907]}]},f:[{p:[20,9,928],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[20,30,949]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[20,66,985]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[20,103,1022]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[18,5,722]}," ",{p:[23,5,1109],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[24,9,1145],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[24,22,1158]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[24,68,1204]}]}]}," ",{p:[26,5,1287],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[27,9,1323],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[27,22,1336]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[27,68,1382]}]}]}," ",{p:[29,5,1466],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[31,11,1553],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[31,54,1596]}," units of ",{t:2,r:"name",p:[31,89,1631]}]},{p:[31,104,1646],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[30,9,1508]},{t:4,n:51,f:[{p:[33,11,1681],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[10,3,283]}]}," ",{p:[38,1,1777],t:7,e:"ui-display",a:{title:"Operations"},f:[{p:[39,3,1812],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[41,7,1872],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied"],s:'_0?null:"disabled"'},p:[41,38,1903]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[41,111,1976]},'"}']},f:[{t:2,r:"name",p:[41,121,1986]}]},{p:[41,141,2006],t:7,e:"br"}],n:52,r:"data.chem",p:[40,5,1845]}]}," ",{p:[44,2,2046],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[45,6,2079],t:7,e:"ui-button",a:{icon:"sign-out",action:"eject"},f:["Eject Contents"]}]}," ",{p:[47,2,2166],t:7,e:"ui-section",a:{label:"Self Cleaning"},f:[{p:[48,3,2204],t:7,e:"ui-button",a:{icon:"recycle",action:"cleaning"},f:["Self-Clean Cycle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],391:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{341:341}],392:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{341:341}],393:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{341:341}],394:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{341:341}],395:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,20],t:7,e:"ui-notice",f:["Currently syncing with the database"]}],n:50,r:"data.sync",p:[1,1,0]},{t:4,n:51,f:[{p:{button:[{p:[8,4,163],t:7,e:"ui-button",a:{icon:"eject",action:"eject_all"},f:["Eject all"]}," ",{p:[9,4,232],t:7,e:"ui-button",a:{icon:["toggle-",{t:2,x:{r:["data.show_materials"],s:'_0?"off":"on"'},p:[9,28,256]}],action:"toggle_materials_visibility"},f:[{t:2,x:{r:["data.show_materials"],s:'_0?"Hide":"Show"'},p:[10,5,339]}]}]},t:7,e:"ui-display",a:{title:"Materials",button:0},f:[" ",{t:4,f:[{p:[14,4,449],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[15,5,484],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[16,6,520],t:7,e:"section",a:{"class":"cell"}}," ",{p:[17,6,559],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[20,6,620],t:7,e:"section",a:{"class":"cell"},f:["Amount"]}," ",{p:[23,6,680],t:7,e:"section",a:{"class":"cell"}}," ",{p:[24,6,719],t:7,e:"section",a:{"class":"cell"}}]}," ",{t:4,f:[{p:[27,6,808],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[28,7,845],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[29,8,876]}]}," ",{p:[31,7,910],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"amount",p:[32,8,941]}]}," ",{p:[34,7,977],t:7,e:"section",a:{"class":"cell"},f:[{p:[35,8,1008],t:7,e:"ui-button",a:{icon:"eject"},f:["Release amount"]}]}," ",{p:[37,7,1084],t:7,e:"section",a:{"class":"cell",style:"width: 40px;"},f:[{p:[38,8,1136],t:7,e:"ui-button",a:{icon:"eject"},f:["Release all"]}]}]}],n:52,r:"data.all_materials",p:[26,5,773]}]}],n:50,r:"data.show_materials",p:[13,3,417]}]}," ",{p:[45,2,1274],t:7,e:"ui-display",a:{title:"Categories"},f:[{t:4,f:[{p:[47,4,1334],t:7,e:"ui-button",f:[{t:2,r:".",p:[47,15,1345]}]}],r:"data.categories",p:[46,3,1309]}]}],r:"data.sync"}]},e.exports=a.extend(r.exports)},{341:341}],396:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,5,49],t:7,e:"ui-button",a:{action:"toggle_power",style:[{t:2,x:{r:["data.toggle"],s:'_0?"selected":null'},p:[5,18,111]}]},f:["Turn ",{t:2,x:{r:["data.toggle"],s:'_0?"off":"on"'},p:[6,16,166]}]}]}," ",{p:[9,3,235],t:7,e:"ui-display",a:{title:"Logging"},f:[{t:4,f:[{p:[11,3,292],t:7,e:"ui-section",a:{label:">"},f:[{t:2,r:".",p:[11,25,314]},{p:[11,30,319],t:7,e:"ui-section",f:[]}]}],n:52,r:"data.logs",p:[10,5,269]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],397:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{341:341}],398:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{341:341}],399:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],400:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=a.extend(r.exports)},{341:341}],401:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{341:341}],402:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],403:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{341:341}],404:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{341:341}],405:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],406:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{341:341}],407:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224],t:7,e:"b",f:[{t:2,r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["â†"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button",a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2,r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down" +},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{341:341}],408:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{341:341}],409:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{341:341}],410:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Chamber Console"},f:[{p:[2,1,45],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,2,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,63,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,3,200],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[6,36,233]}]}," ",{p:[7,3,268],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[7,35,300]}]}," ",{p:[8,3,335],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[8,41,373]}]}," ",{t:4,f:[{p:[10,4,477],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[10,41,514]}]}],n:50,r:"data.disk.activation_delay",p:[9,3,438]}," ",{t:4,f:[{p:[13,4,600],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[13,30,626]}]}," ",{p:[14,4,663],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[14,36,695]}]}],n:50,r:"data.disk.timer",p:[12,3,572]}," ",{t:4,f:[{p:[17,4,785],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[17,40,821]}]}],n:50,r:"data.disk.activation_code",p:[16,3,747]}," ",{t:4,f:[{p:[20,4,918],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[20,42,956]}]}],n:50,r:"data.disk.deactivation_code",p:[19,3,878]}," ",{t:4,f:[{p:[23,4,1047],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[23,34,1077]}]}],n:50,r:"data.disk.kill_code",p:[22,3,1015]}," ",{t:4,f:[{p:[26,4,1163],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[26,37,1196]}]}],n:50,r:"data.disk.trigger_code",p:[25,3,1128]}," ",{t:4,f:[{t:4,f:[{p:[30,6,1332],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[30,25,1351]}]},f:[{t:2,r:"value",p:[30,35,1361]}]}],n:52,r:"data.disk.extra_settings",p:[29,4,1291]}],n:50,r:"data.disk.has_extra_settings",p:[28,3,1250]}],n:50,r:"data.has_program",p:[5,2,172]},{t:4,n:51,f:[{p:[34,3,1423],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,1,80]},{t:4,n:51,f:[{p:[37,2,1489],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[40,1,1550],t:7,e:"br"}," ",{t:4,f:[{p:[42,2,1582],t:7,e:"ui-notice",f:[{t:2,r:"data.status_msg",p:[42,13,1593]}]}],n:50,r:"data.status_msg",p:[41,1,1556]},{t:4,n:51,f:[{p:[44,2,1637],t:7,e:"ui-display",a:{title:"Chamber"},f:[{p:[45,2,1668],t:7,e:"ui-section",f:[{p:[45,14,1680],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock-open":"lock"'},p:[45,30,1696]}],action:"toggle_lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[45,90,1756]}," Chamber"]},{p:[45,146,1812],t:7,e:"br"}]}," ",{p:[46,2,1832],t:7,e:"ui-section",f:[{p:[46,14,1844],t:7,e:"b",f:["Occupant:"]}," ",{t:2,r:"data.occupant_name",p:[46,31,1861]}]}," ",{t:4,f:[{p:[48,4,1929],t:7,e:"ui-section",f:[{p:[48,16,1941],t:7,e:"ui-notice",f:["No nanites detected."]}]}," ",{p:[49,4,2002],t:7,e:"ui-section",f:[{p:[49,16,2014],t:7,e:"ui-button",a:{icon:"syringe",action:"nanite_injection"},f:["Implant Nanites"]}]}],n:50,x:{r:["data.has_nanites"],s:"!_0"},p:[47,2,1899]},{t:4,n:51,f:[{p:[51,3,2121],t:7,e:"ui-display",a:{title:"Nanites"},f:[{t:4,f:[{p:[53,5,2181],t:7,e:"ui-button",a:{icon:"download",action:"add_program"},f:["Install Program From Disk"]},{p:[53,90,2266],t:7,e:"br"}," ",{p:[54,5,2276],t:7,e:"br"}],n:50,r:"data.has_disk",p:[52,4,2154]}," ",{p:[56,4,2297],t:7,e:"ui-section",f:[{p:[57,5,2315],t:7,e:"ui-section",a:{label:"Nanite Volume"},f:[{t:2,r:"data.nanite_volume",p:[57,39,2349]}]}," ",{p:[58,5,2390],t:7,e:"ui-section",a:{label:"Growth Rate"},f:[{t:2,r:"data.regen_rate",p:[58,37,2422]}]}," ",{p:[59,5,2460],t:7,e:"ui-section",a:{label:"Safety Threshold"},f:[{t:2,r:"data.safety_threshold",p:[59,42,2497]}," ",{p:[59,68,2523],t:7,e:"ui-button",a:{icon:"pencil",action:"set_safety"},f:["Set"]}]}," ",{p:[60,5,2603],t:7,e:"ui-section",a:{label:"Cloud ID"},f:[{t:2,x:{r:["data.cloud_id"],s:'_0?_0:"No Cloud"'},p:[60,34,2632]}," ",{p:[60,82,2680],t:7,e:"ui-button",a:{icon:"pencil",action:"set_cloud"},f:["Set"]}]}]}," ",{p:[62,4,2776],t:7,e:"ui-display",a:{title:"Programs"},f:[{t:4,f:[{p:[64,6,2845],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[64,25,2864]}],button:0},f:[{p:[65,6,2888],t:7,e:"ui-button",a:{icon:"minus",action:"remove_program",params:['{"program_id": "',{t:2,r:"id",p:[65,78,2960]},'"}']},f:["Uninstall"]}," ",{p:[66,6,2998],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[66,38,3030]}]}," ",{t:4,f:[{p:[68,7,3094],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[68,45,3132]}]}," ",{p:[69,7,3191],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[69,44,3228]},"/s"]}," ",{t:4,f:[{p:[71,8,3291],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[71,41,3324]}]}," ",{p:[72,8,3362],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[72,45,3399]}," seconds"]}],n:50,r:"can_trigger",p:[70,7,3263]}," ",{t:4,f:[{t:4,f:[{p:[76,9,3534],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,46,3571]}]}],n:50,r:"activation_delay",p:[75,8,3500]}," ",{t:4,f:[{p:[79,9,3652],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,35,3678]}]}," ",{p:[80,9,3710],t:7,e:"ui-section",a:{label:"Timer Type"},f:[{t:2,r:"timer_type",p:[80,40,3741]}]}],n:50,r:"timer",p:[78,8,3629]}," ",{t:4,f:[{t:4,f:[{p:[84,11,3865],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,30,3884]}]},f:[{t:2,r:"value",p:[84,40,3894]}]}],n:52,r:"extra_settings",p:[83,9,3829]}],n:50,r:"has_extra_settings",p:[82,8,3793]}," ",{t:4,f:[{t:4,f:[{p:[89,10,4032],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[89,46,4068]}]}],n:50,r:"activation_code",p:[88,9,3998]}," ",{t:4,f:[{p:[92,10,4163],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[92,48,4201]}]}],n:50,r:"deactivation_code",p:[91,9,4127]}," ",{t:4,f:[{p:[95,10,4290],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[95,40,4320]}]}],n:50,r:"kill_code",p:[94,9,4262]}," ",{t:4,f:[{p:[98,10,4404],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[98,43,4437]}]}],n:50,r:"trigger_code",p:[97,9,4373]}],n:50,x:{r:["data.scan_level"],s:"_0>=4"},p:[87,8,3960]}],n:50,x:{r:["data.scan_level"],s:"_0>=3"},p:[74,7,3463]}],n:50,x:{r:["data.scan_level"],s:"_0>=2"},p:[67,6,3058]}]}],n:52,r:"data.mob_programs",p:[63,5,2811]}]}]}],x:{r:["data.has_nanites"],s:"!_0"}}]}],r:"data.status_msg"}]}]},e.exports=a.extend(r.exports)},{341:341}],411:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Cloud Console"},f:[{p:[2,1,43],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,3,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,64,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,4,202],t:7,e:"ui-section",f:[{p:[7,5,220],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[7,38,253]}]}," ",{p:[8,5,290],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[8,37,322]}]}," ",{p:[9,5,359],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[9,43,397]}]}," ",{t:4,f:[{p:[11,6,505],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[11,43,542]}]}],n:50,r:"data.disk.activation_delay",p:[10,5,464]}," ",{t:4,f:[{p:[14,6,634],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[14,32,660]}]}," ",{p:[15,6,699],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[15,38,731]}]}],n:50,r:"data.disk.timer",p:[13,5,604]}," ",{t:4,f:[{p:[18,6,827],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[18,42,863]}]}],n:50,r:"data.disk.activation_code",p:[17,5,787]}," ",{t:4,f:[{p:[21,6,966],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[21,44,1004]}]}],n:50,r:"data.disk.deactivation_code",p:[20,5,924]}," ",{t:4,f:[{p:[24,6,1101],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[24,36,1131]}]}],n:50,r:"data.disk.kill_code",p:[23,5,1067]}," ",{t:4,f:[{p:[27,6,1223],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[27,39,1256]}]}],n:50,r:"data.disk.trigger_code",p:[26,5,1186]}," ",{t:4,f:[{t:4,f:[{p:[31,8,1400],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[31,27,1419]}]},f:[{t:2,r:"value",p:[31,37,1429]}]}],n:52,r:"data.disk.extra_settings",p:[30,6,1357]}],n:50,r:"data.disk.has_extra_settings",p:[29,5,1314]}]}],n:50,r:"data.has_program",p:[5,3,173]},{t:4,n:51,f:[{p:[36,4,1515],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,2,79]},{t:4,n:51,f:[{p:[39,3,1584],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[42,1,1646],t:7,e:"ui-display",a:{title:"Cloud Storage"},f:[{t:4,f:[{p:[44,3,1713],t:7,e:"ui-button",a:{icon:"plus-circle",action:"create_backup"},f:["Create New Backup"]}," ",{p:[45,3,1799],t:7,e:"ui-display",a:{title:"Active Backups"},f:[{t:4,f:[{p:[47,5,1873],t:7,e:"ui-button",a:{action:"set_view",params:['{"view": "',{t:2,r:"cloud_id",p:[47,52,1920]},'"}']},f:["Backup #",{t:2,r:"cloud_id",p:[47,76,1944]}]}],n:52,r:"data.cloud_backups",p:[46,4,1839]}]}],n:50,x:{r:["data.current_view"],s:"!_0"},p:[43,2,1683]},{t:4,n:51,f:[{p:[51,3,2014],t:7,e:"ui-button",a:{icon:"undo",action:"set_view",params:'{"view": "0"}'},f:["Return"]}," ",{t:4,f:[{p:[53,4,2131],t:7,e:"ui-notice",f:["ERROR: Backup not found."]}],n:50,x:{r:["data.cloud_backup"],s:"!_0"},p:[52,3,2100]},{t:4,n:51,f:[{p:[55,4,2195],t:7,e:"ui-display",a:{title:["Backup #",{t:2,r:"data.current_view",p:[55,31,2222]}]},f:[{t:4,f:[{p:[57,6,2282],t:7,e:"ui-button",a:{icon:"upload",action:"upload_program",style:"selected"},f:["Upload Program From Disk"]},{p:[57,108,2384],t:7,e:"br"}],n:50,r:"data.has_program",p:[56,5,2251]}," ",{t:4,f:[{p:[60,6,2443],t:7,e:"hr"}," ",{p:[61,6,2454],t:7,e:"ui-section",f:[{p:[62,7,2474],t:7,e:"h3",f:[{t:2,r:"name",p:[62,11,2478]}]}," ",{p:[63,7,2499],t:7,e:"div",a:{style:"float:right"},f:[{p:[64,8,2533],t:7,e:"ui-button",a:{icon:"minus-circle",action:"remove_program",style:"danger",params:['{"program_id": "',{t:2,r:"id",p:[64,102,2627]},'"}']},f:["Uninstall"]}]}]}," ",{p:[67,6,2699],t:7,e:"ui-section",f:[{p:[68,7,2719],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[68,39,2751]}]}," ",{p:[69,7,2780],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[69,45,2818]}]}," ",{p:[70,7,2877],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[70,44,2914]},"/s"]}," ",{t:4,f:[{p:[72,8,2977],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[72,41,3010]},"/s"]}," ",{p:[73,8,3050],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[73,45,3087]},"/s"]}],n:50,r:"can_trigger",p:[71,7,2949]}," ",{t:4,f:[{p:[76,8,3178],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,45,3215]}]}],n:50,r:"activation_delay",p:[75,7,3145]}," ",{t:4,f:[{p:[79,8,3293],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,34,3319]}]}," ",{p:[80,8,3350],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"timer_type",p:[80,40,3382]}]}],n:50,r:"timer",p:[78,7,3271]}," ",{t:4,f:[{p:[83,8,3464],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[83,44,3500]}]}],n:50,r:"activation_code",p:[82,7,3432]}," ",{t:4,f:[{p:[86,8,3589],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[86,46,3627]}]}],n:50,r:"deactivation_code",p:[85,7,3555]}," ",{t:4,f:[{p:[89,8,3710],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[89,38,3740]}]}],n:50,r:"kill_code",p:[88,7,3684]}," ",{t:4,f:[{p:[92,8,3818],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[92,41,3851]}]}],n:50,r:"trigger_code",p:[91,7,3789]}," ",{t:4,f:[{t:4,f:[{p:[96,10,3973],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[96,29,3992]}]},f:[{t:2,r:"value",p:[96,39,4002]}]}],n:52,r:"extra_settings",p:[95,8,3938]}],n:50,r:"has_extra_settings",p:[94,7,3903]}]}],n:52,r:"data.cloud_programs",p:[59,5,2407]}]}],x:{r:["data.cloud_backup"],s:"!_0"}}],x:{r:["data.current_view"],s:"!_0"}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],412:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Program Hub"},f:[{t:4,f:[{p:[3,2,65],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{p:[4,3,102],t:7,e:"ui-section",f:[{p:[5,4,119],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{p:[6,4,185],t:7,e:"ui-button",a:{icon:"minus-circle",action:"clear"},f:["Delete Program"]}]}," ",{t:4,f:[{p:[9,4,307],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[9,37,340]}]}," ",{p:[10,4,376],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[10,36,408]}]}],n:50,r:"data.has_program",p:[8,3,278]},{t:4,n:51,f:[{p:[12,4,456],t:7,e:"ui-notice",f:["No program installed."]}],r:"data.has_program"}]}],n:50,r:"data.has_disk",p:[2,1,41]},{t:4,n:51,f:[{p:[16,2,540],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"},{p:[18,1,586],t:7,e:"br"}," ",{p:[19,1,592],t:7,e:"ui-display",a:{title:"Programs"},f:[{p:[20,2,624],t:7,e:"ui-section",f:[{p:[21,3,640],t:7,e:"ui-button",a:{icon:"undo",action:"set_category",params:'{"category": "Main"}'},f:["Return"]}," ",{p:[22,3,737],t:7,e:"ui-button",a:{icon:"align-justify ",action:"toggle_details"},f:[{t:2,x:{r:["data.detail_view"],s:'_0?"Compact View":"Detailed View"'},p:[22,60,794]}]}]}," ",{t:4,f:[{p:[25,3,916],t:7,e:"ui-display",f:[{t:4,f:[{p:[27,5,964],t:7,e:"ui-section",f:[{p:[27,17,976],t:7,e:"ui-button",a:{action:"set_category",params:['{"category": "',{t:2,r:"name",p:[27,72,1031]},'"}']},f:[{t:2,r:"name",p:[27,84,1043]}]}]}],n:52,r:"data.categories",p:[26,4,933]}]}],n:50,x:{r:["data.category"],s:'_0=="Main"'},p:[24,2,881]},{t:4,n:51,f:[{p:[31,3,1122],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[31,22,1141]}]},f:[{t:4,f:[{t:4,f:[{p:[34,6,1229],t:7,e:"ui-display",f:[{p:[35,7,1249],t:7,e:"ui-section",f:[{p:[35,19,1261],t:7,e:"b",f:[{t:2,r:"name",p:[35,22,1264]}]}]}," ",{p:[36,7,1297],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[36,19,1309]}]}," ",{p:[37,7,1338],t:7,e:"ui-section",f:[{p:[38,8,1359],t:7,e:"ui-button",a:{icon:"download",action:"download",params:['{"program_id": "',{t:2,r:"id",p:[38,77,1428]},'"}'],state:[{t:2,x:{r:["data.has_disk"],s:'_0?null:"disabled"'},p:[38,94,1445]}]},f:["Download"]}]}]}],n:50,r:"data.detail_view",p:[33,5,1198]},{t:4,n:51,f:[{p:[44,6,1585],t:7,e:"ui-section",f:[{p:[44,18,1597],t:7,e:"ui-button",a:{action:"download",params:['{"program_id": "',{t:2,r:"id",p:[44,71,1650]},'"}']},f:[{t:2,r:"name",p:[44,81,1660]}]}]}],r:"data.detail_view"}],n:52,r:"data.program_list",p:[32,4,1165]}]}],x:{r:["data.category"],s:'_0=="Main"'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],413:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Programming"},f:[{t:4,f:[{p:[3,3,67],t:7,e:"ui-notice",f:["Insert a nanite program disk."]}],n:50,x:{r:["data.has_disk"],s:"!_0"},p:[2,1,41]},{t:4,n:51,f:[{p:[5,3,133],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{t:4,f:[{p:[7,5,229],t:7,e:"ui-notice",f:["No program detected."]}],n:50,x:{r:["data.has_program"],s:"!_0"},p:[6,3,198]},{t:4,n:51,f:[{p:[9,5,290],t:7,e:"ui-section",f:[{p:[10,7,310],t:7,e:"ui-display",a:{title:[{t:2,r:"data.name",p:[10,26,329]}]},f:[{t:2,r:"data.desc",p:[11,9,354]}]}]}," ",{p:[14,5,413],t:7,e:"ui-section",f:[{p:[15,7,433],t:7,e:"ui-section",a:{label:"Program Info"},f:["Nanites Consumed: ",{t:2,r:"data.use_rate",p:[16,26,493]},{p:[16,43,510],t:7,e:"br"}," ",{t:4,f:["Trigger Cost: ",{t:2,r:"data.trigger_cost",p:[18,25,574]},"u",{p:[18,47,596],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[17,9,524]}]}," ",{p:[22,7,648],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[23,9,685],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.activated"],s:'_0?"toggle-on":"toggle-off"'},p:[24,17,713]}],action:"toggle_active"},f:[{t:2,x:{r:["data.activated"],s:'_0?"Active":"Inactive"'},p:[26,11,809]}]}]}," ",{p:[30,7,905],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[31,9,944],t:7,e:"ui-button",a:{icon:"pencil",action:"set_activation_delay"}}," Activation Delay: ",{t:2,r:"data.activation_delay",p:[31,95,1030]}," ",{p:[31,121,1056],t:7,e:"br"}," ",{p:[32,9,1070],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer"}}," Timer: ",{t:2,r:"data.timer",p:[32,73,1134]}," ",{p:[32,88,1149],t:7,e:"br"}," ",{p:[33,9,1163],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer_type"}}," Timer Type: ",{t:2,r:"data.timer_type",p:[33,83,1237]}," ",{p:[33,103,1257],t:7,e:"br"}]}," ",{p:[36,7,1292],t:7,e:"ui-section",a:{label:"Codes"},f:[{p:[37,9,1328],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "activation"}'}}," Activation Code: ",{t:2,r:"data.activation_code",p:[37,121,1440]}," ",{p:[37,146,1465],t:7,e:"br"}," ",{p:[38,9,1479],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "deactivation"}'}}," Deactivation Code: ",{t:2,r:"data.deactivation_code",p:[38,125,1595]}," ",{p:[38,152,1622],t:7,e:"br"}," ",{p:[39,9,1636],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "kill"}'}}," Kill Code: ",{t:2,r:"data.kill_code",p:[39,109,1736]}," ",{p:[39,128,1755],t:7,e:"br"}," ",{t:4,f:[{p:[41,11,1805],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "trigger"}'}}," Trigger Code: ",{t:2,r:"data.trigger_code",p:[41,117,1911]}," ",{p:[41,139,1933],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[40,9,1769]}]}," ",{t:4,f:[{p:[46,9,2026],t:7,e:"ui-section",a:{label:"Special"},f:[{t:4,f:[{p:[48,13,2109],t:7,e:"ui-button",a:{icon:"pencil",action:"set_extra_setting",params:['{"target_setting": "',{t:2,r:"name",p:[48,93,2189]},'"}']}}," ",{t:2,r:"name",p:[48,118,2214]},": ",{t:2,r:"value",p:[48,128,2224]}," ",{p:[48,138,2234],t:7,e:"br"}],n:52,r:"data.extra_settings",p:[47,11,2066]}]}],n:50,r:"data.has_extra_settings",p:[45,7,1985]}]}],x:{r:["data.has_program"],s:"!_0"}}],x:{r:["data.has_disk"],s:"!_0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],414:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Control"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-notice",f:["The interface is locked."]}],n:50,r:"data.locked",p:[2,1,37]},{t:4,n:51,f:[{p:[5,3,121],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock Interface"]}," ",{p:[6,3,188],t:7,e:"ui-button",a:{icon:"save",action:"save"},f:["Save Current Setting"]}," ",{p:[7,3,261],t:7,e:"ui-section",a:{label:"Signal Code"},f:[{p:[8,5,299],t:7,e:"span",f:[{t:2,r:"data.code",p:[8,11,305]}]}," ",{p:[9,4,330],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code"},f:["Set"]}]}," ",{t:4,f:[{p:[12,5,443],t:7,e:"ui-section",a:{label:"Relay Code"},f:[{p:[13,7,482],t:7,e:"span",f:[{t:2,r:"data.relay_code",p:[13,13,488]}]}," ",{p:[14,5,520],t:7,e:"ui-button",a:{icon:"pencil",action:"set_relay_code"},f:["Set"]}]}],n:50,x:{r:["data.mode"],s:'_0=="Relay"'},p:[11,3,409]}," ",{p:[17,3,618],t:7,e:"ui-section",a:{label:"Signal Mode"},f:[{p:[18,5,656],t:7,e:"span",f:[{t:2,r:"data.mode",p:[18,11,662]}]}," ",{p:[19,5,688],t:7,e:"br"}," ",{p:[20,4,697],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Off"}'},f:["Off"]}," ",{p:[21,5,775],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Local"}'},f:["Local"]}," ",{p:[22,5,857],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Targeted"}'},f:["Targeted"]}," ",{p:[23,5,945],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Area"}'},f:["Area"]}," ",{p:[24,5,1025],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Relay"}'},f:["Relay"]}]}],r:"data.locked"}]}," ",{p:[28,1,1144],t:7,e:"ui-display",a:{title:"Saved Settings"},f:[{t:4,f:[{p:[30,3,1215],t:7,e:"ui-button",a:{icon:"load",action:"load",params:['{"save_id": "',{t:2,r:"id",p:[30,61,1273]},'"}']},f:[{t:2,r:"name",p:[30,71,1283]}]}," ",{t:4,f:[{p:[32,4,1332],t:7,e:"ui-button",a:{icon:"remove",action:"remove_save",params:['{"save_id": "',{t:2,r:"id",p:[32,71,1399]},'"}']},f:["Remove"]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[31,3,1307]}," ",{p:[34,3,1442],t:7,e:"br"}],n:52,r:"data.saved_settings",p:[29,2,1182]}]}]},e.exports=a.extend(r.exports)},{341:341}],415:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ghost roles"},f:[{p:[2,2,35],t:7,e:"ui-section",a:{label:"Ignored roles"},f:[{t:4,f:[{p:[4,4,99],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[4,21,116]}],style:[{t:2,x:{r:["enabled"],s:'_0?"danger":null'},p:[4,73,168]}],action:"toggle_ignore",params:['{"key": "',{t:2,r:"key",p:[4,144,239]},'"}']},f:[{t:2,r:"desc",p:[4,155,250]}]}],n:52,r:"data.ignore",p:[3,3,73]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],416:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{341:341}],417:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236]}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table",f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582], +t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],418:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';"},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],419:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],420:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],421:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:["   "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],422:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],423:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],424:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],425:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}' +},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],426:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],427:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}]}]}," ",{p:[55,5,1528],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1563],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1569]}]}]}],r:"config.fancy"}]}," ",{p:[60,1,1638],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1668],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1693],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1730],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1769],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1806],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1845],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1887],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1928],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2013],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2032]}],nowrap:0},f:[{p:[72,7,2057],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2078]}," %"]}," ",{p:[73,7,2136],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[73,28,2157]}]}," ",{p:[74,7,2199],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2220],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2233]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2262]}]}]}," ",{p:[75,7,2309],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2330],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2343]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2366]}," [",{p:[75,87,2389],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2395]}]},"]"]}]}," ",{p:[76,7,2444],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2465],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2478]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2501]}," [",{p:[76,87,2524],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2530]}]},"]"]}]}," ",{p:[77,7,2579],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2600],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2613]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2636]}," [",{p:[77,87,2659],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2665]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1987]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],428:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],429:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],430:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],431:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{341:341}],432:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],433:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,25],t:7,e:"ui-button",a:{icon:"undo",action:"change_menu",params:'{"menu": "1"}'},f:["Return"]}," ",{p:[3,2,113],t:7,e:"ui-display",a:{title:"Advanced Surgery Procedures"},f:[{p:[4,3,165],t:7,e:"ui-button",a:{icon:"download",action:"sync"},f:["Sync with research database"]}," ",{t:4,f:[{p:[6,4,278],t:7,e:"ui-display",f:[{p:[7,6,297],t:7,e:"ui-section",f:[{p:[7,18,309],t:7,e:"b",f:[{t:2,r:"name",p:[7,21,312]}]}]}," ",{p:[8,6,344],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[8,18,356]}]}]}],n:52,r:"data.surgeries",p:[5,3,249]}]}],n:50,x:{r:["data.menu"],s:"_0==2"},p:[1,1,0]},{t:4,n:51,f:[{p:[13,2,437],t:7,e:"ui-button",a:{action:"change_menu",params:'{"menu": "2"}'},f:["View Surgery Procedures"]}," ",{t:4,f:[{p:[15,3,556],t:7,e:"ui-notice",f:["No table detected!"]}],n:51,r:"data.table",p:[14,2,530]}," ",{p:[19,2,623],t:7,e:"ui-display",f:[{p:[20,3,639],t:7,e:"ui-display",a:{title:"Patient State"},f:[{t:4,f:[{p:[22,5,704],t:7,e:"ui-section",a:{label:"State"},f:[{p:[23,6,737],t:7,e:"span",a:{"class":[{t:2,r:"data.patient.statstate",p:[23,19,750]}]},f:[{t:2,r:"data.patient.stat",p:[23,47,778]}]}]}," ",{p:[25,5,831],t:7,e:"ui-section",a:{label:"Blood Type"},f:[{p:[26,6,869],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.patient.blood_type",p:[26,28,891]}]}]}," ",{p:[28,5,950],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,6,984],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.patient.minHealth",p:[29,19,997]}],max:[{t:2,r:"data.patient.maxHealth",p:[29,52,1030]}],value:[{t:2,r:"data.patient.health",p:[29,87,1065]}],state:[{t:2,x:{r:["data.patient.health"],s:'_0>=0?"good":"average"'},p:[30,13,1103]}]},f:[{t:2,x:{r:["adata.patient.health"],s:"Math.round(_0)"},p:[30,64,1154]}]}]}," ",{t:4,f:[{p:[33,6,1389],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[33,25,1408]}]},f:[{p:[34,7,1427],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.patient.maxHealth",p:[34,28,1448]}],value:[{t:2,rx:{r:"data.patient",m:[{t:30,n:"type"}]},p:[34,63,1483]}],state:"bad"},f:[{t:2,x:{r:["type","adata.patient"],s:"Math.round(_1[_0])"},p:[34,99,1519]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}]'},p:[32,5,1224]}],n:50,r:"data.patient",p:[21,4,678]},{t:4,n:51,f:["No patient detected."],r:"data.patient"}]}," ",{p:[41,3,1670],t:7,e:"ui-display",a:{title:"Initiated Procedures"},f:[{t:4,f:[{t:4,f:[{p:[44,6,1777],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[44,28,1799]}]},f:[{p:[45,7,1817],t:7,e:"ui-section",a:{label:"Next Step"},f:[{p:[46,8,1856],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"next_step",p:[46,30,1878]}]}," ",{t:4,f:[{p:[48,9,1937],t:7,e:"span",a:{"class":"content"},f:[{p:[48,31,1959],t:7,e:"b",f:["Required chemicals:"]},{p:[48,57,1985],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[48,62,1990]}]}],n:50,r:"chems_needed",p:[47,8,1907]}]}," ",{t:4,f:[{p:[52,8,2091],t:7,e:"ui-section",a:{label:"Alternative Step"},f:[{p:[53,9,2138],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"alternative_step",p:[53,31,2160]}]}," ",{t:4,f:[{p:[55,10,2232],t:7,e:"span",a:{"class":"content"},f:[{p:[55,32,2254],t:7,e:"b",f:["Required chemicals:"]},{p:[55,58,2280],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[55,63,2285]}]}],n:50,r:"alt_chems_needed",p:[54,9,2197]}]}],n:50,r:"alternative_step",p:[51,7,2058]}]}],n:52,r:"data.procedures",p:[43,5,1745]}],n:50,r:"data.procedures",p:[42,4,1716]},{t:4,n:51,f:["No active procedures."],r:"data.procedures"}]}]}],x:{r:["data.menu"],s:"_0==2"}}]},e.exports=a.extend(r.exports)},{341:341}],434:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed points: ",{t:2,r:"data.unclaimedPoints",p:[6,29,159]}," ",{t:4,f:[{p:[8,4,220],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim Points"]}],n:50,r:"data.unclaimedPoints",p:[7,3,187]}]}," ",{p:[13,2,311],t:7,e:"ui-section",f:[{t:4,f:[{p:[15,4,350],t:7,e:"ui-button",a:{action:"Eject"},f:["Eject ID"]}," You have ",{t:2,r:"data.claimedPoints",p:[18,13,421]}," mining points collected."],n:50,r:"data.hasID",p:[14,3,327]},{t:4,n:51,f:[{p:[20,4,485],t:7,e:"ui-button",a:{action:"Insert"},f:["Insert ID"]}],r:"data.hasID"}]}]}," ",{p:[26,1,588],t:7,e:"ui-display",f:[{t:4,f:[{p:[28,3,627],t:7,e:"ui-section",f:[{p:[29,4,644],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[34,4,772],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[35,5,808],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[35,42,845]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[35,129,932]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[38,10,988]},": ",{t:2,r:"name",p:[38,21,999]}]}],n:52,r:"data.diskDesigns",p:[33,3,741]}],n:50,r:"data.hasDisk",p:[27,2,603]},{t:4,n:51,f:[{p:[42,3,1053],t:7,e:"ui-section",f:[{p:[43,4,1070],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{t:4,f:[{p:[50,2,1223],t:7,e:"ui-display",f:[{p:[51,3,1239],t:7,e:"ui-section",f:[{p:[52,4,1256],t:7,e:"b",f:["Warning"]},": ",{t:2,r:"data.disconnected",p:[52,20,1272]},". Please contact the quartermaster."]}]}],n:50,r:"data.disconnected",p:[49,1,1195]},{t:4,f:[{p:[57,2,1412],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[58,3,1445],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[59,5,1480],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[62,5,1538],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[65,5,1595],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[67,5,1639],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[69,5,1683],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[74,4,1785],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[75,5,1820],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[76,6,1849]}]}," ",{p:[78,5,1879],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[79,6,1922]}]}," ",{p:[81,5,1954],t:7,e:"section",a:{"class":"cell"},f:[{p:[82,6,1983],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[82,19,1996]}],placeholder:"###","class":"number"}}]}," ",{p:[84,5,2063],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[85,6,2106],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[85,60,2160]}],params:['{ "id" : ',{t:2,r:"id",p:[85,115,2215]},', "sheets" : ',{t:2,r:"sheets",p:[85,134,2234]}," }"]},f:["Release"]}]}," ",{p:[89,5,2305],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[90,6,2348]}]}]}],n:52,r:"data.materials",p:[73,3,1756]}," ",{t:4,f:[{p:[95,4,2431],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[96,5,2466],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[97,6,2495]}]}," ",{p:[99,5,2525],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[100,6,2568]}]}," ",{p:[102,5,2600],t:7,e:"section",a:{"class":"cell"},f:[{p:[103,6,2629],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[103,19,2642]}],placeholder:"###","class":"number"}}]}," ",{p:[105,5,2709],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[106,6,2752],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[106,58,2804]}],params:['{ "id" : ',{t:2,r:"id",p:[106,114,2860]},', "sheets" : ',{t:2,r:"sheets",p:[106,133,2879]}," }"]},f:["Smelt"]}]}," ",{p:[110,5,2947],t:7,e:"section",a:{"class":"cell",align:"right"},f:[]}]}],n:52,r:"data.alloys",p:[94,3,2405]}]}],n:50,x:{r:["data.materials","data.alloys"],s:"_0||_1"},p:[56,1,1372]}]},e.exports=a.extend(r.exports)},{341:341}],435:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,4,87],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[4,36,119]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[7,4,231],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[7,35,262]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[10,4,358], +t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[10,35,389]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[15,4,528],t:7,e:"ui-section",f:[{t:4,f:[{p:[17,6,578],t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[16,5,546]},{t:4,n:51,f:[{p:[19,6,644],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[21,8,712],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[21,38,742]}]}," ",{p:[22,8,782],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[22,39,813]}]}],n:50,r:"data.has_blood",p:[20,7,681]},{t:4,n:51,f:[{p:[24,8,870],t:7,e:"ui-section",f:[{p:[25,9,892],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[14,3,500]},{t:4,n:51,f:[{p:[32,4,1054],t:7,e:"ui-section",f:[{p:[33,5,1072],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[38,3,1188],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[43,8,1343],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[43,64,1399]}],params:['{"index": ',{t:2,r:"index",p:[43,116,1451]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[42,7,1320]}," ",{p:[47,7,1538],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[47,69,1600]}],params:['{"index": ',{t:2,r:"index",p:[47,124,1655]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,24,1269]}],button:0},f:[" ",{p:[51,6,1749],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[51,40,1783]}]}," ",{p:[52,6,1812],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[52,38,1844]}]}," ",{p:[53,6,1879],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[53,33,1906]}]}," ",{p:[54,6,1936],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[54,40,1970]}]}," ",{t:4,f:[{p:[56,7,2021],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[58,9,2087],t:7,e:"ui-button",a:{action:"symptom_details",state:"",params:['{"picked_symptom": ',{t:2,r:"sym_index",p:[58,81,2159]},', "index": ',{t:2,r:"index",p:[58,105,2183]},"}"]},f:[{t:2,r:"name",p:[59,10,2206]}," "]},{p:[60,21,2236],t:7,e:"br"}],n:52,r:"symptoms",p:[57,8,2059]}]}," ",{p:[63,7,2289],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[63,38,2320]}]}," ",{p:[64,7,2355],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[64,35,2383]}]}," ",{p:[65,7,2415],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[65,39,2447]}]}," ",{p:[66,7,2483],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[66,44,2520]}]}],n:50,r:"is_adv",p:[55,6,1999]}]}],n:52,r:"data.viruses",p:[39,4,1222]},{t:4,n:51,f:[{p:[70,5,2601],t:7,e:"ui-section",f:[{p:[71,6,2620],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[75,3,2743],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[77,5,2811],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[77,24,2830]}]},f:[{p:[78,7,2848],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[78,43,2884]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[78,129,2970]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[76,4,2779]},{t:4,n:51,f:[{p:[83,5,3067],t:7,e:"ui-section",f:[{p:[84,6,3086],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[37,2,1162]}],n:50,x:{r:["data.mode"],s:"_0==1"},p:[1,1,0]},{t:4,n:51,f:[{p:[90,2,3231],t:7,e:"ui-button",a:{icon:"undo",state:"",action:"back"},f:["Back"]}," ",{t:4,f:[{p:[94,4,3330],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[94,23,3349]}]},f:[{p:[95,4,3364],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[96,5,3382]}," ",{t:4,f:[{p:[98,5,3417],t:7,e:"br"}," ",{p:[99,5,3428],t:7,e:"b",f:["This symptom has been neutered, and has no effect. It will still affect the virus' statistics."]}],n:50,r:"neutered",p:[97,4,3395]}]}," ",{p:[102,4,3564],t:7,e:"ui-section",f:[{p:[103,5,3582],t:7,e:"ui-section",a:{label:"Level"},f:[{t:2,r:"level",p:[103,31,3608]}]}," ",{p:[104,5,3636],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[104,36,3667]}]}," ",{p:[105,5,3700],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[105,33,3728]}]}," ",{p:[106,5,3758],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[106,37,3790]}]}," ",{p:[107,5,3824],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[107,42,3861]}]}]}," ",{p:[109,4,3913],t:7,e:"ui-subdisplay",a:{title:"Effect Thresholds"},f:[{p:[110,5,3960],t:7,e:"ui-section",f:[{t:3,r:"threshold_desc",p:[110,17,3972]}]}]}]}],n:53,r:"data.symptom",p:[93,2,3303]}],x:{r:["data.mode"],s:"_0==1"}}]},e.exports=a.extend(r.exports)},{341:341}],436:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(484);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{341:341,484:484}],437:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{341:341}],438:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[3,1,69],t:7,e:"ui-notice",f:[{p:[4,3,84],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[4,23,104]}," connected to a tank."]}]}," ",{p:[6,1,182],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[7,3,220],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[8,5,255],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[8,11,261]}," kPa"]}]}," ",{p:[10,3,323],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[11,5,354],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[11,18,367]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[11,59,408]}]}]}]}," ",{p:[14,1,499],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[15,3,530],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,579]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[17,14,630]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,687]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[24,7,856],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[24,38,887]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[23,5,828]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[28,3,1007],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[29,4,1038]}]}," ",{p:[31,3,1080],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[32,4,1114]}," kPa"]}],n:50,r:"data.holding",p:[27,3,983]},{t:4,n:51,f:[{p:[35,3,1188],t:7,e:"ui-section",f:[{p:[36,4,1205],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}," ",{p:[40,1,1293],t:7,e:"ui-display",a:{title:"Filters"},f:[{t:4,f:[{p:[42,5,1345],t:7,e:"filters"}],n:53,r:"data",p:[41,3,1325]}]}]},r.exports.components=r.exports.components||{};var i={filters:t(457)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,457:457}],439:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}]}]}," ",{p:[52,5,1464],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1499],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1505]}]}]}],r:"config.fancy"}]}," ",{p:[57,1,1574],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1604],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1629],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1666],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1705],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1742],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1781],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1823],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1864],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1949],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1968]}],nowrap:0},f:[{p:[69,7,1993],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2014]}," %"]}," ",{p:[70,7,2072],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[70,28,2093]}]}," ",{p:[71,7,2135],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2156],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2169]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2198]}]}]}," ",{p:[72,7,2245],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2266],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2279]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2302]}," [",{p:[72,87,2325],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2331]}]},"]"]}]}," ",{p:[73,7,2380],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2401],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2414]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2437]}," [",{p:[73,87,2460],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2466]}]},"]"]}]}," ",{p:[74,7,2515],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2536],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2549]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2572]}," [",{p:[74,87,2595],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2601]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1923]}]}]},e.exports=a.extend(r.exports)},{341:341}],440:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=a.extend(r.exports)},{341:341}],441:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," "," "," "," "," "," ",{p:[11,1,560],t:7,e:"rdheader"}," ",{t:4,f:[{p:[13,2,595],t:7,e:"ui-display",a:{title:"CONSOLE LOCKED"},f:[{p:[14,3,634],t:7,e:"ui-button",a:{action:"Unlock"},f:["Unlock"]}]}],n:50,r:"data.locked",p:[12,1,573]},{t:4,f:[{p:[18,2,729],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[18,17,744]}]},f:[{p:[19,3,763],t:7,e:"tab",a:{name:"Technology"},f:[{p:[20,4,791],t:7,e:"techweb"}]}," ",{p:[22,3,815],t:7,e:"tab",a:{name:"View Node"},f:[{p:[23,4,842],t:7,e:"nodeview"}]}," ",{p:[25,3,867],t:7,e:"tab",a:{name:"View Design"},f:[{p:[26,4,896],t:7,e:"designview"}]}," ",{p:[28,3,923],t:7,e:"tab",a:{name:"Disk Operations - Design"},f:[{p:[29,4,965],t:7,e:"diskopsdesign"}]}," ",{p:[31,3,995],t:7,e:"tab",a:{name:"Disk Operations - Technology"},f:[{p:[32,4,1041],t:7,e:"diskopstech"}]}," ",{p:[34,3,1069],t:7,e:"tab",a:{name:"Deconstructive Analyzer"},f:[{p:[35,4,1110],t:7,e:"destruct"}]}," ",{p:[37,3,1135],t:7,e:"tab",a:{name:"Protolathe"},f:[{p:[38,4,1163],t:7,e:"protolathe"}]}," ",{p:[40,3,1190],t:7,e:"tab",a:{name:"Circuit Imprinter"},f:[{p:[41,4,1225],t:7,e:"circuit"}]}," ",{p:[43,3,1249],t:7,e:"tab",a:{name:"Settings"},f:[{p:[44,4,1275],t:7,e:"settings"}]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[17,1,706]}]},r.exports.components=r.exports.components||{};var i={settings:t(450),circuit:t(442),protolathe:t(448),destruct:t(444),diskopsdesign:t(445),diskopstech:t(446),designview:t(443),nodeview:t(447),techweb:t(451),rdheader:t(449)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451}],442:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,58],t:7,e:"ui-display",a:{title:"Circuit Imprinter Busy!"}}],n:50,r:"data.circuitbusy",p:[2,2,30]},{t:4,n:51,f:[{p:[5,3,130],t:7,e:"ui-display",f:[{p:[6,4,147],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,189],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,202]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,261],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "circuit", "inputText" : ',{t:2,r:"textsearch",p:[8,84,340]},"}"]},f:["Search"]}]}," ",{p:[10,4,398],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.circuitmats",p:[10,27,421]}," / ",{t:2,r:"data.circuitmaxmats",p:[10,50,444]}]}," ",{p:[11,4,485],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.circuitchems",p:[11,26,507]}," / ",{t:2,r:"data.circuitmaxchems",p:[11,50,531]}]}," ",{p:[12,3,572],t:7,e:"ui-display",f:[{p:[14,3,590],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,605]}]},f:[{p:[15,4,631],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,696],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.circuitcat"],s:'_0=="{{name}}"?"selected":null'},p:[17,43,733]}],params:['{"type" : "circuit", "cat" : "',{t:2,r:"name",p:[17,135,825]},'"}']},f:[{t:2,r:"name",p:[17,147,837]}]}],n:52,r:"data.circuitcats",p:[16,5,663]}]}," ",{p:[20,4,888],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,956],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,968]},{t:2,r:"matstring",p:[22,26,976]}," ",{p:[23,7,997],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[23,40,1030]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[23,119,1109]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitdes",p:[21,5,924]}]}," ",{p:[27,4,1187],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[29,6,1254],t:7,e:"ui-section",f:[{t:2,r:"name",p:[29,18,1266]},{t:2,r:"matstring",p:[29,26,1274]}," ",{p:[30,7,1295],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[30,40,1328]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[30,119,1407]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitmatch",p:[28,5,1220]}]}," ",{p:[34,4,1485],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[36,6,1550],t:7,e:"ui-section",f:[{t:2,r:"name",p:[36,18,1562]}," : ",{t:2,r:"amount",p:[36,29,1573]}," cm3 - ",{t:4,f:[{p:[38,7,1623],t:7,e:"input",a:{value:[{t:2,r:"number",p:[38,20,1636]}],placeholder:["1-",{t:2,r:"sheets",p:[38,46,1662]}],"class":"number"}}," ",{p:[39,7,1698],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "circuit", "mat_id" : ',{t:2,r:"mat_id",p:[39,84,1775]},', "sheets" : ',{t:2,r:"number",p:[39,107,1798]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[37,6,1597]}]}],n:52,r:"data.circuitmat_list",p:[35,5,1513]}]}," ",{p:[44,4,1895],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[46,6,1961],t:7,e:"ui-section",f:[{t:2,r:"name",p:[46,18,1973]}," : ",{t:2,r:"amount",p:[46,29,1984]}," - ",{p:[47,7,2005],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "circuit", "name" : ',{t:2,r:"name",p:[47,80,2078]},', "id" : ',{t:2,r:"reagentid",p:[47,97,2095]},"}"]},f:["Purge"]}]}],n:52,r:"data.circuitchem_list",p:[45,5,1923]}]}]}]}]}],r:"data.circuitbusy"}],n:50,r:"data.circuit_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[55,2,2216],t:7,e:"ui-display",a:{title:"No Linked Circuit Imprinter"}}],r:"data.circuit_linked"}]},e.exports=a.extend(r.exports)},{341:341}],443:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:[{t:2,r:"data.sdesign_name",p:[2,21,50]}]},f:[{p:[3,3,77],t:7,e:"ui-section",a:{title:"Description"},f:[{t:2,r:"data.sdesign_desc",p:[3,35,109]}]}]}," ",{p:[5,2,162],t:7,e:"ui-display",a:{title:"Lathe Types"},f:[{t:4,f:[{p:[7,4,239],t:7,e:"ui-section",a:{title:"Circuit Imprinter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&1"},p:[6,3,198]}," ",{t:4,f:[{p:[10,4,346],t:7,e:"ui-section",a:{title:"Protolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&2"},p:[9,3,305]}," ",{t:4,f:[{p:[13,4,446],t:7,e:"ui-section",a:{title:"Autolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&4"},p:[12,3,405]}," ",{t:4,f:[{p:[16,4,545],t:7,e:"ui-section",a:{title:"Crafting Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&8"},p:[15,3,504]}," ",{t:4,f:[{p:[19,4,655],t:7,e:"ui-section",a:{title:"Exosuit Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&16"},p:[18,3,613]}," ",{t:4,f:[{p:[22,4,764],t:7,e:"ui-section",a:{title:"Biogenerator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&32"},p:[21,3,722]}," ",{t:4,f:[{p:[25,4,867],t:7,e:"ui-section",a:{title:"Limb Grower"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&64"},p:[24,3,825]}," ",{t:4,f:[{p:[28,4,970],t:7,e:"ui-section",a:{title:"Ore Smelter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&128"},p:[27,3,927]}]}," ",{p:[31,2,1045],t:7,e:"ui-display",a:{title:"Materials"},f:[{t:4,f:[{p:[33,4,1116],t:7,e:"ui-section",a:{title:[{t:2,r:"matname",p:[33,23,1135]}]},f:[{t:2,r:"matamt",p:[33,36,1148]}," cm^3"]}],n:52,r:"data.sdesign_materials",p:[32,3,1079]}]}],n:50,r:"data.design_selected",p:[1,1,0]},{t:4,f:[{p:[38,2,1248],t:7,e:"ui-display",a:{title:"No Design Selected."}}],n:50,x:{r:["data.design_selected"],s:"!_0"},p:[37,1,1216]}]},e.exports=a.extend(r.exports)},{341:341}],444:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[4,3,60],t:7,e:"ui-display",a:{title:"Destructive Analyzer Busy!"}}],n:50,r:"data.destroybusy",p:[3,2,32]},{t:4,n:51,f:[{t:4,f:[{p:[7,4,168],t:7,e:"ui-display",a:{title:"Destructive Analyzer Unloaded"}}],n:50,x:{r:["data.destroy_loaded"],s:"!_0"},p:[6,3,135]},{t:4,n:51,f:[{p:[9,4,248],t:7,e:"ui-display",a:{title:"Loaded Item"},f:[{p:[10,4,285],t:7,e:"ui-section",a:{title:"Name"},f:[{t:2,r:"data.destroy_name",p:[10,29,310]}]}]}," ",{p:[12,4,367],t:7,e:"ui-display",a:{title:"Boost Nodes"},f:[{t:4,f:[{p:[14,6,438],t:7,e:"ui-section",a:{title:[{t:2,r:"name",p:[14,25,457]}," | ",{t:2,r:"value",p:[14,36,468]}]},f:[{p:[15,7,487],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["allow"],s:'_0?null:"disabled"'},p:[15,25,505]}],action:"deconstruct",params:['{"id":',{t:2,r:"id",p:[15,90,570]},"}"]},f:["Deconstruct and Boost"]}]}],n:52,r:"data.boost_paths",p:[13,5,405]}]}," ",{p:[19,4,670],t:7,e:"ui-button",a:{action:"eject_da"},f:["Eject Item"]}],x:{r:["data.destroy_loaded"],s:"!_0"}}],r:"data.destroybusy"}],n:50,r:"data.destroy_linked",p:[2,1,2]},{t:4,n:51,f:[{p:[23,2,755],t:7,e:"ui-display",a:{title:"No Linked Destructive Analyzer"}}],r:"data.destroy_linked"}]},e.exports=a.extend(r.exports)},{341:341}],445:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={ +v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Design Disk Loaded"}}],n:50,x:{r:["data.ddisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,121],t:7,e:"ui-display",a:{title:"Design Disk Updating"}}],n:50,r:"data.ddisk_update",p:[5,2,92]},{t:4,n:51,f:[{t:4,f:[{p:[9,4,221],t:7,e:"ui-display",a:{title:"Design Disk"},f:[{p:[10,5,259],t:7,e:"ui-section",a:{title:"Disk Space"},f:["Disk Capacity: ",{t:2,r:"data.ddisk_size",p:[10,51,305]}," blueprints."]}," ",{p:[11,5,355],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[11,33,383],t:7,e:"ui-button",a:{action:"ddisk_upall"},f:["Upload all designs"]}]}," ",{p:[12,5,464],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[12,36,495],t:7,e:"ui-button",a:{action:"clear_designdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[13,5,591],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[13,36,622],t:7,e:"ui-button",a:{action:"eject_designdisk"},f:["Eject Disk"]}]}]}," ",{p:[15,4,717],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[17,6,792],t:7,e:"ui-section",a:{title:"Number"},f:["#",{t:2,r:"pos",p:[17,34,820]},": ",{t:4,f:[{p:[19,8,866],t:7,e:"ui-button",a:{action:"upload_empty_ddisk_slot",params:['{"slot": "',{t:2,r:"pos",p:[19,70,928]},'"}']},f:["Upload to Empty Slot"]}],n:50,x:{r:["id"],s:'_0=="null"'},p:[18,7,837]},{t:4,n:51,f:[{p:[21,8,996],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[21,58,1046]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[21,75,1063]}]},f:[{t:2,r:"name",p:[21,122,1110]}]}," ",{p:[22,8,1139],t:7,e:"ui-button",a:{action:"ddisk_erasepos",style:"danger",params:['{"id": "',{t:2,r:"id",p:[22,74,1205]},'"}'],state:[{t:2,x:{r:["id"],s:'_0=="null"?"disabled":null'},p:[22,91,1222]}]},f:["Delete Slot"]}],x:{r:["id"],s:'_0=="null"'}}]}],n:52,r:"data.ddisk_designs",p:[16,5,757]}]}],n:50,x:{r:["data.ddisk_upload"],s:"!_0"},p:[8,3,190]},{t:4,n:51,f:[{p:[28,4,1367],t:7,e:"ui-display",a:{title:"Upload Design to Disk"},f:[{p:[28,46,1409],t:7,e:"ui-section",f:["Available Designs:"]}]}," ",{t:4,f:[{p:[30,5,1513],t:7,e:"ui-section",f:[{p:[30,17,1525],t:7,e:"ui-button",a:{action:"ddisk_uploaddesign",params:['{"id": "',{t:2,r:"id",p:[30,72,1580]},'"}']},f:[{t:2,r:"name",p:[30,82,1590]}]}]}],n:52,r:"data.ddisk_possible_designs",p:[29,4,1470]}],x:{r:["data.ddisk_upload"],s:"!_0"}}],r:"data.ddisk_update"}],x:{r:["data.ddisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],446:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Technology Disk Loaded"}}],n:50,x:{r:["data.tdisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,125],t:7,e:"ui-display",a:{title:"Technology Disk Updating"}}],n:50,r:"data.tdisk_update",p:[5,2,96]},{t:4,n:51,f:[{p:[8,3,198],t:7,e:"ui-display",a:{title:"Technology Disk"},f:[{p:[9,4,239],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[9,32,267],t:7,e:"ui-button",a:{action:"tdisk_down"},f:["Download Research to Disk"]},{p:[9,100,335],t:7,e:"ui-button",a:{action:"tdisk_up"},f:["Upload Research from Disk"]}," ",{p:[10,4,406],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[10,35,437],t:7,e:"ui-button",a:{action:"clear_techdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[11,4,530],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[11,35,561],t:7,e:"ui-button",a:{action:"eject_techdisk"},f:["Eject Disk"]}]}]}]}," ",{p:[13,3,652],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[15,5,723],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,53,771]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,70,788]}]},f:[{t:2,r:"display_name",p:[15,115,833]}]}],n:52,r:"data.tdisk_nodes",p:[14,4,691]}]}],r:"data.tdisk_update"}],x:{r:["data.tdisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],447:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,29],t:7,e:"ui-display",a:{title:[{t:2,r:"data.snode_name",p:[2,21,48]}]},f:[{p:[3,3,73],t:7,e:"ui-section",a:{title:"Description"},f:["Description: ",{t:2,r:"data.snode_desc",p:[3,48,118]}]}," ",{p:[4,3,154],t:7,e:"ui-section",a:{title:"Point Cost"},f:["Point Cost: ",{t:2,r:"data.snode_cost",p:[4,46,197]}]}," ",{p:[5,3,233],t:7,e:"ui-section",a:{title:"Export Price"},f:["Export Price: ",{t:2,r:"data.snode_export",p:[5,50,280]}]}," ",{p:[6,3,318],t:7,e:"ui-button",a:{action:"research_node",params:['{"id"="',{t:2,r:"id",p:[6,52,367]},'"}'],state:[{t:2,x:{r:["data.snode_researched"],s:'_0?"disabled":null'},p:[6,69,384]}]},f:[{t:2,x:{r:["data.snode_researched"],s:'_0?"Researched":"Research Node"'},p:[6,115,430]}]}]}," ",{p:[8,2,518],t:7,e:"ui-display",a:{title:"Prerequisites"},f:[{t:4,f:[{p:[10,4,588],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[10,52,636]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[10,69,653]}]},f:[{t:2,r:"display_name",p:[10,114,698]}]}],n:52,r:"data.node_prereqs",p:[9,3,556]}]}," ",{p:[13,2,759],t:7,e:"ui-display",a:{title:"Unlocks"},f:[{t:4,f:[{p:[15,4,823],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,52,871]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,69,888]}]},f:[{t:2,r:"display_name",p:[15,114,933]}]}],n:52,r:"data.node_unlocks",p:[14,3,791]}]}," ",{p:[18,2,994],t:7,e:"ui-display",a:{title:"Designs"},f:[{t:4,f:[{p:[20,4,1058],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[20,54,1108]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[20,71,1125]}]},f:[{t:2,r:"name",p:[20,118,1172]}]}],n:52,r:"data.node_designs",p:[19,3,1026]}]}],n:50,r:"data.node_selected",p:[1,1,0]},{t:4,f:[{p:[25,2,1263],t:7,e:"ui-display",a:{title:"No Node Selected."}}],n:50,x:{r:["data.node_selected"],s:"!_0"},p:[24,1,1233]}]},e.exports=a.extend(r.exports)},{341:341}],448:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,59],t:7,e:"ui-display",a:{title:"Protolathe Busy!"}}],n:50,r:"data.protobusy",p:[2,2,33]},{t:4,n:51,f:[{p:[5,3,124],t:7,e:"ui-display",f:[{p:[6,4,141],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,183],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,196]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,255],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "proto", "inputText" : ',{t:2,r:"textsearch",p:[8,82,332]},"}"]},f:["Search"]}]}," ",{p:[10,4,390],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.protomats",p:[10,27,413]}," / ",{t:2,r:"data.protomaxmats",p:[10,48,434]}]}," ",{p:[11,4,473],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.protochems",p:[11,26,495]}," / ",{t:2,r:"data.protomaxchems",p:[11,48,517]}]}," ",{p:[12,3,556],t:7,e:"ui-display",f:[{p:[14,3,574],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,589]}]},f:[{p:[15,4,615],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,678],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.protocat","name"],s:'_0==_1?"selected":null'},p:[17,43,715]}],params:['{"type" : "proto", "cat" : "',{t:2,r:"name",p:[17,125,797]},'"}']},f:[{t:2,r:"name",p:[17,137,809]}]}],n:52,r:"data.protocats",p:[16,5,647]}]}," ",{p:[20,4,860],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,926],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,938]},{t:2,r:"matstring",p:[22,26,946]}," ",{t:4,f:[{p:[24,8,996],t:7,e:"input",a:{value:[{t:2,r:"number",p:[24,21,1009]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[24,47,1035]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[23,7,967]}," ",{p:[26,7,1108],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[26,40,1141]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[26,117,1218]},'", "amount" : "',{t:2,r:"number",p:[26,138,1239]},'"}']},f:["Print"]}]}],n:52,r:"data.protodes",p:[21,5,896]}]}," ",{p:[30,4,1321],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[32,6,1386],t:7,e:"ui-section",f:[{t:2,r:"name",p:[32,18,1398]},{t:2,r:"matstring",p:[32,26,1406]}," ",{t:4,f:[{p:[34,8,1456],t:7,e:"input",a:{value:[{t:2,r:"number",p:[34,21,1469]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[34,47,1495]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[33,7,1427]}," ",{p:[36,7,1568],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[36,40,1601]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[36,117,1678]},'", "amount" : "',{t:2,r:"number",p:[36,138,1699]},'"}']},f:["Print"]}]}],n:52,r:"data.protomatch",p:[31,5,1354]}]}," ",{p:[40,4,1781],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[42,6,1844],t:7,e:"ui-section",f:[{t:2,r:"name",p:[42,18,1856]}," : ",{t:2,r:"amount",p:[42,29,1867]}," cm3 - ",{t:4,f:[{p:[44,7,1917],t:7,e:"input",a:{value:[{t:2,r:"number",p:[44,20,1930]}],placeholder:["1-",{t:2,r:"sheets",p:[44,46,1956]}],"class":"number"}}," ",{p:[45,7,1992],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "proto", "mat_id" : ',{t:2,r:"mat_id",p:[45,82,2067]},', "sheets" : ',{t:2,r:"number",p:[45,105,2090]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[43,6,1891]}]}],n:52,r:"data.protomat_list",p:[41,5,1809]}]}," ",{p:[50,4,2187],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[52,6,2251],t:7,e:"ui-section",f:[{t:2,r:"name",p:[52,18,2263]}," : ",{t:2,r:"amount",p:[52,29,2274]}," - ",{p:[53,7,2295],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "proto", "name" : ',{t:2,r:"name",p:[53,78,2366]},', "id" : ',{t:2,r:"reagentid",p:[53,95,2383]},"}"]},f:["Purge"]}]}],n:52,r:"data.protochem_list",p:[51,5,2215]}]}]}]}]}],r:"data.protobusy"}],n:50,r:"data.protolathe_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[61,2,2504],t:7,e:"ui-display",a:{title:"No Linked Protolathe"}}],r:"data.protolathe_linked"}]},e.exports=a.extend(r.exports)},{341:341}],449:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,1,14],t:7,e:"span",a:{"class":"memoedit"},f:["Nanotrasen R&D Console"]},{p:[2,53,66],t:7,e:"br"}," Available Points: ",{p:[3,19,91],t:7,e:"ui-section",a:{title:"Research Points"},f:[{t:2,r:"data.research_points_stored",p:[3,55,127]}]}," ",{p:[4,1,173],t:7,e:"ui-section",a:{title:["Page Selection - ",{t:2,r:"page",p:[4,37,209]}]},f:[{p:[4,47,219],t:7,e:"input",a:{value:[{t:2,r:"pageselect",p:[4,60,232]}],placeholder:"1","class":"number"}}," Select Page: ",{p:[5,14,294],t:7,e:"ui-button",a:{action:"page",params:['{"num" : "',{t:2,r:"pageselect",p:[5,57,337]},'"}']},f:["[Go]"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],450:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"span",a:{"class":"bad"},f:["Settings"]},{p:[1,34,33],t:7,e:"br"},{p:[1,39,38],t:7,e:"br"}," ",{p:[2,1,45],t:7,e:"ui-button",a:{action:"Resync"},f:["RESYNC MACHINERY"]},{p:[2,56,100],t:7,e:"br"}," ",{p:[3,1,107],t:7,e:"ui-button",a:{action:"Lock"},f:["LOCK"]}," ",{p:[4,1,150],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "destroy"}',state:[{t:2,x:{r:["data.destroy_linked"],s:'_0?null:"disabled"'},p:[4,71,220]}]},f:["Disconnect Destructive Analyzer"]}," ",{p:[5,1,309],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "lathe"}',state:[{t:2,x:{r:["data.protolathe_linked"],s:'_0?null:"disabled"'},p:[5,69,377]}]},f:["Disconnect Protolathe"]}," ",{p:[6,1,459],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "imprinter"}',state:[{t:2,x:{r:["data.circuit_linked"],s:'_0?null:"disabled"'},p:[6,73,531]}]},f:["Disconnect Circuit Imprinter"]}]},e.exports=a.extend(r.exports)},{341:341}],451:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Available for Research"},f:[{t:4,f:[{p:[3,3,78],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[3,51,126]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[3,68,143]}]},f:[{t:2,r:"display_name",p:[3,113,188]}]}],n:52,r:"data.techweb_avail",p:[2,2,46]}]}," ",{p:[6,1,245],t:7,e:"ui-display",a:{title:"Locked Nodes"},f:[{t:4,f:[{p:[8,3,314],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[8,51,362]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[8,68,379]}]},f:[{t:2,r:"display_name",p:[8,113,424]}]}],n:52,r:"data.techweb_locked",p:[7,2,281]}]}," ",{p:[11,1,482],t:7,e:"ui-display",a:{title:"Researched Nodes"},f:[{t:4,f:[{p:[13,3,559],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[13,51,607]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[13,68,624]}]},f:[{t:2,r:"display_name",p:[13,113,669]}]}],n:52,r:"data.techweb_researched",p:[12,2,522]}]}]},e.exports=a.extend(r.exports)},{341:341}],452:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,25],t:7,e:"ui-notice",f:[{p:[3,3,40],t:7,e:"span",f:["The grinder is currently processing and cannot be used."]}]}],n:50,r:"data.processing",p:[1,1,0]},{p:{button:[{p:[8,5,208],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[8,36,239]}],action:"eject"},f:["Eject Contents"]}]},t:7,e:"ui-display",a:{title:"Processing Chamber",button:0},f:[" ",{p:[10,3,364],t:7,e:"ui-section",a:{label:"Grinding"},f:[{p:[11,5,399],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.operating"],s:'_0?"average":"good"'},p:[11,18,412]}]},f:[{t:2,x:{r:["data.operating"],s:'_0?"Busy":"Ready"'},p:[11,59,453]}]}," ",{p:[12,2,500],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[12,35,533]}],action:"grind"},f:["Activate"]}]}," ",{p:[14,3,653],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[17,9,755],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["The ",{t:2,r:"name",p:[17,56,802]}]},{p:[17,71,817],t:7,e:"br"}],n:52,r:"adata.contentslist",p:[16,7,717]},{t:4,n:51,f:[{p:[19,9,848],t:7,e:"span",f:["No Contents"]}],r:"adata.contentslist"}],n:50,r:"data.contents",p:[15,5,688]},{t:4,n:51,f:[{p:[22,7,911],t:7,e:"span",f:["No Contents"]}],r:"data.contents"}]}]}," ",{p:{button:[{p:[28,5,1047],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.isBeakerLoaded"],s:'(_0==0)&&_1?null:"disabled"'},p:[28,36,1078]}],action:"detach"},f:["Detach"]}]},t:7,e:"ui-display",a:{title:"Container",button:0},f:[" ",{p:[30,3,1202],t:7,e:"ui-section",a:{label:"Reagents"},f:[{t:4,f:[{p:[32,7,1272],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[32,13,1278]},"/",{t:2,r:"data.beakerMaxVolume",p:[32,55,1320]}," Units"]}," ",{p:[33,7,1365],t:7,e:"br"}," ",{t:4,f:[{p:[35,9,1418],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[35,52,1461]}," units of ",{t:2,r:"name",p:[35,87,1496]}]},{p:[35,102,1511],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[34,7,1378]},{t:4,n:51,f:[{p:[37,9,1542],t:7,e:"span",a:{"class":"bad"},f:["Container Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[31,5,1237]},{t:4,n:51,f:[{p:[40,7,1621],t:7,e:"span",a:{"class":"average"},f:["No Container"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],453:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"span",a:{"class":["pipes32x32 ",{t:2,r:"dir",p:[6,80,253]},"-",{t:2,r:"icon_state",p:[6,88,261]}],title:[{t:2,r:"dir_name",p:[6,111,284]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}," ",{t:4,f:[{p:[12,2,406],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[14,4,468],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["@key","data.selected_color"],s:'_0==_1?"selected":null'},p:[14,22,486]}],action:"color",params:['{"paint_color": ',{t:2,r:"@key",p:[15,44,583]},"}"]},f:[{t:2,r:"@key",p:[15,55,594]}]}],n:52,r:"data.paint_colors",p:[13,3,436]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[11,1,377]},{p:[19,1,654],t:7,e:"ui-display",a:{title:"Utilities"},f:[{p:[20,2,687],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&1?"check-square-o":"square-o"'},p:[20,19,704]}],action:"mode",params:'{"mode": 1}'},f:["Build"]}," ",{p:[22,2,813],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&2?"check-square-o":"square-o"'},p:[22,19,830]}],action:"mode",params:'{"mode": 2}'},f:["Wrench"]}," ",{p:[24,2,940],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&4?"check-square-o":"square-o"'},p:[24,19,957]}],action:"mode",params:'{"mode": 4}'},f:["Destroy"]}," ",{t:4,f:[{p:[27,3,1098],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&8?"check-square-o":"square-o"'},p:[27,20,1115]}],action:"mode",params:'{"mode": 8}'},f:["Paint"]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[26,2,1068]}]}," ",{p:[31,1,1249],t:7,e:"ui-display",a:{title:"Category"},f:[{p:[32,2,1281],t:7,e:"ui-section",f:[{p:[33,3,1297],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==0?"check-square-o":"square-o"'},p:[33,20,1314]}],state:[{t:2,x:{r:["data.category"],s:'_0<=0?"selected":null'},p:[33,83,1377]}],action:"category",params:'{"category": 0}'},f:["Atmospherics"]}," ",{p:[35,3,1496],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==1?"check-square-o":"square-o"'},p:[35,20,1513]}],state:[{t:2,x:{r:["data.category"],s:'_0==1?"selected":null'},p:[35,83,1576]}],action:"category",params:'{"category": 1}'},f:["Disposals"]}," ",{p:[37,3,1692],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==2?"check-square-o":"square-o"'},p:[37,20,1709]}],state:[{t:2,x:{r:["data.category"],s:'_0==2?"selected":null'},p:[37,83,1772]}],action:"category",params:'{"category": 2}'},f:["Transit Tubes"]}]}," ",{t:4,f:[{p:[41,3,1937],t:7,e:"ui-section",a:{label:"Piping Layer"},f:[{p:[42,4,1975],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==1?"selected":null'},p:[42,22,1993]}],action:"piping_layer",params:'{"piping_layer": 1}'},f:["1"]}," ",{p:[44,4,2115],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==2?"selected":null'},p:[44,22,2133]}],action:"piping_layer",params:'{"piping_layer": 2}'},f:["2"]}," ",{p:[46,4,2255],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==3?"selected":null'},p:[46,22,2273]}],action:"piping_layer",params:'{"piping_layer": 3}'},f:["3"]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[40,2,1907]}]}," ",{t:4,f:[{p:[52,2,2462],t:7,e:"ui-display",a:{title:[{t:2,r:"cat_name",p:[52,21,2481]}]},f:[{t:4,f:[{p:[54,4,2521],t:7,e:"ui-section",f:[{p:[55,5,2539],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[55,23,2557]}],action:"pipe_type",params:['{"pipe_type": ',{t:2,r:"pipe_index",p:[56,28,2638]},', "category": ',{t:2,r:"cat_name",p:[56,56,2666]},"}"]},f:[{t:2,r:"pipe_name",p:[56,71,2681]}]}]}],n:52,r:"recipes",p:[53,3,2499]}]}],n:52,r:"data.categories",p:[51,1,2434]}]},e.exports=a.extend(r.exports)},{341:341}],454:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[3,21,78]}],action:"color",params:['{"paint_color": ',{t:2,r:"color_name",p:[4,28,155]},"}"]},f:[{t:2,r:"color_name",p:[4,45,172]}]}],n:52,r:"data.paint_colors",p:[2,2,29]}]}]},e.exports=a.extend(r.exports)},{341:341}],455:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"img",a:{src:["pipe.",{t:2,r:"dir",p:[6,71,244]},".",{t:2,r:"icon_state",p:[6,79,252]},".png"],title:[{t:2,r:"dir_name",p:[6,106,279]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}]},e.exports=a.extend(r.exports)},{341:341}],456:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{341:341}],457:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,26],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[2,20,43]}],style:[{t:2,x:{r:["enabled"],s:'_0?"selected":null'},p:[2,72,95]}],action:"toggle_filter",params:['{"id_tag": "',{t:2,r:"id_tag",p:[3,48,176]},'", "val": ',{t:2,r:"gas_id",p:[3,68,196]},"}"]},f:[{t:2,r:"gas_name",p:[3,81,209]}]}],n:52,r:"filter_types",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],458:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(459),templates:t(461),status:t(460)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,459:459,460:460,461:461}],459:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=a.extend(r.exports)},{341:341}],460:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"table",a:{width:"100%"},f:[{t:4,f:[{p:[3,3,49],t:7,e:"tr",f:[{p:[4,5,59],t:7,e:"td",f:[{p:[5,7,71],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[5,69,133]},'"}']},f:["JMP"]}]}," ",{p:[9,5,193],t:7,e:"td",f:[{p:[10,7,205],t:7,e:"ui-button",a:{action:"fly",params:['{"id": "',{t:2,r:"id",p:[10,47,245]},'"}'],state:[{t:2,x:{r:["can_fly"],s:'_0?null:"disabled"'},p:[10,64,262]}]},f:["Fly"]}]}," ",{p:[14,5,345],t:7,e:"td",f:[{t:2,r:"name",p:[15,7,357]}," (",{p:[15,17,367],t:7,e:"code",f:[{t:2,r:"id",p:[15,23,373]}]},")"]}," ",{p:[17,5,404],t:7,e:"td",f:[{t:2,r:"status",p:[18,7,416]}]}," ",{p:[20,5,443],t:7,e:"td",f:[{t:4,f:[{t:2,r:"mode",p:[22,9,477]}],n:50,r:"mode",p:[21,7,455]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[25,10,532]},") ",{p:[26,9,555],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[26,57,603]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[26,74,620]}]},f:["Fast Travel"]}],n:50,r:"timer",p:[24,7,508]}]}]}],n:52,r:"data.shuttles",p:[2,1,22]}]}]},e.exports=a.extend(r.exports)},{341:341}],461:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=a.extend(r.exports)},{341:341}],462:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,186],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,220],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,233]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,262]}]}]}," ",{p:[9,5,315],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[10,7,350],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[10,20,363]}],max:[{t:2,r:"data.occupant.maxHealth",p:[10,54,397]}],value:[{t:2,r:"data.occupant.health",p:[10,90,433]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[11,16,475]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[11,68,527]}]}]}," ",{t:4,f:[{p:[14,7,764],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[14,26,783]}]},f:[{p:[15,9,804],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[15,30,825]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[15,66,861]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[15,103,898]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[13,5,598]}," ",{t:4,f:[{p:[19,7,1020],t:7,e:"ui-section",a:{label:"Blood"},f:[{p:[20,9,1056],t:7,e:"ui-section",a:{label:"Volume"},f:[{p:[21,11,1095],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.blood.maxBloodVolume",p:[21,32,1116]}],value:[{t:2,r:"data.occupant.blood.currentBloodVolume",p:[21,79,1163]}],state:[{t:2,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"bad":"good"'},p:[21,130,1214]}]},f:[{t:3,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"LOW":"OK"'},p:[21,232,1316]}," - ",{t:2,x:{r:["data.occupant.blood.currentBloodVolume"],s:"Math.round(_0)"},p:[21,342,1426]}," cl"]}]}," ",{p:[23,9,1525],t:7,e:"ui-section",a:{label:"Type"},f:[{p:[24,11,1562],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:"data.occupant.blood.bloodType",p:[24,35,1586]}]}]}]}],n:50,r:"data.occupant.blood",p:[18,5,985]}," ",{p:[28,5,1689],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[29,9,1725],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[29,22,1738]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[29,68,1784]}]}]}," ",{p:[31,5,1867],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[32,9,1903],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[32,22,1916]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[32,68,1962]}]}]}," ",{p:[34,5,2046],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[36,11,2133],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[36,54,2176]}," units of ",{t:2,r:"name",p:[36,89,2211]}]},{p:[36,104,2226],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[35,9,2088]},{t:4,n:51,f:[{p:[38,11,2261],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[5,3,159]}]}," ",{p:[43,1,2357],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[44,2,2389],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[45,5,2420],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[45,22,2437]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[45,71,2486]}]}]}," ",{p:[47,3,2551],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[49,7,2612],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[49,38,2643]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[49,122,2727]},'"}']},f:[{t:2,r:"name",p:[49,132,2737]}]},{p:[49,152,2757],t:7,e:"br"}],n:52,r:"data.chems",p:[48,5,2584]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],463:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:4,f:["You Are Here"],n:50,x:{r:["occupied"],s:'_0=="owner"'},p:[10,7,491]},{t:4,n:51,f:[{t:4,f:["Occupied"],n:50,x:{ +r:["occupied"],s:'_0=="stranger"'},p:[13,9,566]},{t:4,n:51,f:["Swap"],x:{r:["occupied"],s:'_0=="stranger"'}}],x:{r:["occupied"],s:'_0=="owner"'}}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],464:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,23,82],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.drying"],s:'_0?"stop":"tint"'},p:[4,40,99]}],action:"Dry"},f:[{t:2,x:{r:["data.drying"],s:'_0?"Stop drying":"Dry"'},p:[4,88,147]}]}],n:50,r:"data.isdryer",p:[4,3,62]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[7,3,258],t:7,e:"ui-notice",f:[{p:[8,5,275],t:7,e:"span",f:["Unfortunately, this ",{t:2,r:"data.name",p:[8,31,301]}," is empty."]}]}],n:50,x:{r:["data.contents.length"],s:"_0==0"},p:[6,1,221]},{t:4,n:51,f:[{p:[11,1,359],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[12,2,391],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[13,4,425],t:7,e:"section",a:{"class":"cell bold"},f:["Item"]}," ",{p:[16,4,482],t:7,e:"section",a:{"class":"cell bold"},f:["Quantity"]}," ",{p:[19,4,543],t:7,e:"section",a:{"class":"cell bold",align:"center"},f:[{t:4,f:[{t:2,r:"data.verb",p:[20,22,608]}],n:50,r:"data.verb",p:[20,5,591]},{t:4,n:51,f:["Dispense"],r:"data.verb"}]}]}," ",{t:4,f:[{p:[24,3,703],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[25,4,737],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[26,5,765]}]}," ",{p:[28,4,793],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[29,5,835]}]}," ",{p:[31,4,865],t:7,e:"section",a:{"class":"table",alight:"right"},f:[{p:[32,5,909],t:7,e:"section",a:{"class":"cell"}}," ",{p:[33,5,947],t:7,e:"section",a:{"class":"cell"},f:[{p:[34,6,976],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[34,45,1015]}],params:['{ "name" : ',{t:2,r:"name",p:[34,102,1072]},', "amount" : 1 }']},f:["One"]}]}," ",{p:[38,5,1151],t:7,e:"section",a:{"class":"cell"},f:[{p:[39,6,1180],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>1)?null:"disabled"'},p:[39,45,1219]}],params:['{ "name" : ',{t:2,r:"name",p:[39,101,1275]}," }"]},f:["Many"]}]}]}]}],n:52,r:"data.contents",p:[23,2,676]}]}],x:{r:["data.contents.length"],s:"_0==0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],465:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]},"   [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,r:"adata.inputLevel_text",p:[37,78,1447]}]}]}," ",{p:[39,3,1501],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1540],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1579]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1674],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1708]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1804],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1894],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1927]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2039],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2077]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2204],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2238],t:7,e:"span",f:[{t:2,r:"adata.inputAvailable",p:[47,9,2244]}]}]}]}," ",{p:[50,1,2308],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2339],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2377],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2394]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2449]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2519]}]},"   [",{p:[55,6,2587],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2600]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2617]}]},"]"]}," ",{p:[57,3,2724],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2764],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2785]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2817]}]},f:[{t:2,r:"adata.outputLevel_text",p:[58,80,2839]}]}]}," ",{p:[60,3,2894],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2934],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2973]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3070],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3104]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3202],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3293],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3326]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3441],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3479]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3609],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3644],t:7,e:"span",f:[{t:2,r:"adata.outputUsed",p:[68,9,3650]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],466:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:["\ufeff",{t:4,f:[" ",{p:[2,2,33],t:7,e:"ui-display",a:{title:"Dispersal Tank"},f:[{p:[3,3,73],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[4,4,104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.active"],s:'_0?"power-off":"close"'},p:[4,21,121]}],style:[{t:2,x:{r:["data.active"],s:'_0?"selected":null'},p:[5,12,174]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[6,12,223]}],action:"power"},f:[{t:2,x:{r:["data.active"],s:'_0?"On":"Off"'},p:[7,20,286]}]}]}," ",{p:[10,3,354],t:7,e:"ui-section",a:{label:"Smoke Radius Setting"},f:[{p:[11,5,401],t:7,e:"div",a:{"class":"content",style:"float:left"},f:[{p:[12,6,448],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=1?null:"disabled"'},p:[12,36,478]}],style:[{t:2,x:{r:["data.setting"],s:'_0==1?"selected":null'},p:[12,89,531]}],action:"setting",params:'{"amount": 1}'},f:["3"]}," ",{p:[13,6,634],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=2?null:"disabled"'},p:[13,36,664]}],style:[{t:2,x:{r:["data.setting"],s:'_0==2?"selected":null'},p:[13,89,717]}],action:"setting",params:'{"amount": 2}'},f:["6"]}," ",{p:[14,6,820],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=3?null:"disabled"'},p:[14,36,850]}],style:[{t:2,x:{r:["data.setting"],s:'_0==3?"selected":null'},p:[14,89,903]}],action:"setting",params:'{"amount": 3}'},f:["9"]}," ",{p:[15,6,1006],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=4?null:"disabled"'},p:[15,36,1036]}],style:[{t:2,x:{r:["data.setting"],s:'_0==4?"selected":null'},p:[15,89,1089]}],action:"setting",params:'{"amount": 4}'},f:["12"]}," ",{p:[16,6,1193],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=5?null:"disabled"'},p:[16,36,1223]}],style:[{t:2,x:{r:["data.setting"],s:'_0==5?"selected":null'},p:[16,89,1276]}],action:"setting",params:'{"amount": 5}'},f:["15"]}]}]}," ",{p:[19,3,1410],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[21,6,1476],t:7,e:"span",f:[{t:2,x:{r:["adata.TankCurrentVolume"],s:"Math.round(_0)"},p:[21,12,1482]},"/",{t:2,r:"data.TankMaxVolume",p:[21,52,1522]}," Units"]}," ",{p:[22,6,1564],t:7,e:"br"}," ",{p:[23,5,1575],t:7,e:"br"}," ",{t:4,f:[{p:[25,7,1623],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[25,50,1666]}," units of ",{t:2,r:"name",p:[25,85,1701]}]},{p:[25,100,1716],t:7,e:"br"}],n:52,r:"adata.TankContents",p:[24,6,1587]}],n:50,r:"data.isTankLoaded",p:[20,4,1444]},{t:4,n:51,f:[{p:[28,6,1757],t:7,e:"span",a:{"class":"bad"},f:["Tank Empty"]}],r:"data.isTankLoaded"}," ",{p:[30,4,1809],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Eject":"Close"'},p:[30,21,1826]}],style:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"selected":null'},p:[31,12,1881]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[32,12,1936]}],action:"purge"},f:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Purge Contents":"No chemicals detected"'},p:[33,20,1999]}]}]}]}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,2,1]}]},e.exports=a.extend(r.exports)},{341:341}],467:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],468:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],469:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,8,97],t:7,e:"ui-button",a:{action:"jump",params:['{"name" : ',{t:2,r:"name",p:[4,51,140]},"}"]},f:["Jump"]}," ",{p:[7,9,195],t:7,e:"ui-button",a:{action:"spawn",params:['{"name" : ',{t:2,r:"name",p:[7,53,239]},"}"]},f:["Spawn"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[2,22,46]}],button:0},f:[" ",{p:[11,3,308],t:7,e:"ui-section",a:{label:"Description"},f:[{p:[12,5,346],t:7,e:"span",f:[{t:3,r:"desc",p:[12,11,352]}]}]}," ",{p:[14,3,390],t:7,e:"ui-section",a:{label:"Spawners left"},f:[{p:[15,5,430],t:7,e:"span",f:[{t:2,r:"amount_left",p:[15,11,436]}]}]}]}],n:52,r:"data.spawners",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],470:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],471:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=a.extend(r.exports)},{341:341}],472:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],473:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],474:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],475:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 1:return"good";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,173],t:7,e:"ui-notice",f:[{p:[14,2,187],t:7,e:"ui-section",a:{label:"Reconnect"},f:[{p:[15,3,221],t:7,e:"div",a:{style:"float:right"},f:[{p:[16,4,251],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]}]}]}," ",{p:[20,1,359],t:7,e:"ui-display",a:{title:"Turbine Controller"},f:[{p:[21,2,401],t:7,e:"ui-section",a:{label:"Status"},f:[{t:4,f:[{p:[23,4,456],t:7,e:"span",a:{"class":"bad"},f:["Broken"]}],n:50,r:"data.broken",p:[22,3,432]},{t:4,n:51,f:[{p:[25,4,504],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.online"],s:"_0(_1)"},p:[25,17,517]}]},f:[{t:2,x:{r:["data.online","data.compressor_broke","data.turbine_broke"],s:'_0&&!(_1||_2)?"Online":"Offline"'},p:[25,46,546]}]}],r:"data.broken"}," ",{p:[27,3,656],t:7,e:"div",a:{style:"float:right"},f:[{p:[28,4,686],t:7,e:"ui-button",a:{icon:"power-off",action:"power-on",state:[{t:2,r:"data.broken",p:[28,57,739]}],style:[{t:2,x:{r:["data.online"],s:'_0?"selected":""'},p:[28,81,763]}]},f:["On"]}," ",{p:[29,4,817],t:7,e:"ui-button",a:{icon:"close",action:"power-off",state:[{t:2,r:"data.broken",p:[29,54,867]}],style:[{t:2,x:{r:["data.online"],s:'_0?"":"selected"'},p:[29,78,891]}]},f:["Off"]}]}," ",{t:4,f:[{p:[32,4,989],t:7,e:"br"}," [ ",{p:[33,6,1e3],t:7,e:"span",a:{"class":"bad"},f:["Compressor is inoperable"]}," ]"],n:50,r:"data.compressor_broke",p:[31,3,955]}," ",{t:4,f:[{p:[36,4,1097],t:7,e:"br"}," [ ",{p:[37,6,1108],t:7,e:"span",a:{"class":"bad"},f:["Turbine is inoperable"]}," ]"],n:50,r:"data.turbine_broke",p:[35,3,1066]}]}]}," ",{p:[41,1,1200],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[42,2,1230],t:7,e:"ui-section",a:{label:"Turbine Speed"},f:[{p:[43,3,1268],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.rpm"],s:'_0?"--":_1'},p:[43,9,1274]}," RPM"]}]}," ",{p:[45,2,1337],t:7,e:"ui-section",a:{label:"Internal Temp"},f:[{p:[46,3,1375],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.temp"],s:'_0?"--":_1'},p:[46,9,1381]}," K"]}]}," ",{p:[48,2,1443],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{p:[49,3,1483],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.power"],s:'_0?"--":_1'},p:[49,9,1489]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],476:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{341:341}],477:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,331],t:7,e:"ui-notice",f:[{p:[17,4,347],t:7,e:"span",f:["Safety restraints disabled."]}]}],n:50,r:"data.emagged",p:[15,2,307]}," ",{t:4,f:[{p:[21,3,442],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[22,4,482],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[23,5,513]}]}," ",{p:[25,4,559],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[26,5,592]}]}," ",{p:[28,4,640],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,5,673],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[29,26,694]}],value:[{t:2,r:"adata.vr_avatar.health",p:[29,64,732]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[29,99,767]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[29,140,808]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[29,179,847]}]}]}]}],n:50,r:"data.vr_avatar",p:[20,2,416]},{t:4,n:51,f:[{p:[33,3,935],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[37,2,1031],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[38,3,1067],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[38,20,1084]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[39,4,1151]}," the VR Sleeper"]}," ",{t:4,f:[{p:[42,4,1253],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[41,3,1225]}," ",{t:4,f:[{p:[47,4,1376],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar"},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[46,3,1349]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],478:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section", +a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=a.extend(r.exports)},{341:341}],479:[function(t,e,n){(function(e){"use strict";var n=t(341),a=e.interopRequireDefault(n);t(331),t(1),t(327),t(330);var r=t(480),i=e.interopRequireDefault(r),o=t(481),s=t(328),p=t(329),u=e.interopRequireDefault(p);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(485)),window.initialize=function(e){window.tgui=window.tgui||new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(482),text:t(486),config:n.config,data:n.data,adata:n.data}}})};var c=document.getElementById("data"),l=c.textContent,d=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(d,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var f=new u["default"]("FontAwesome");f.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,327:327,328:328,329:329,330:330,331:331,341:341,480:480,481:481,482:482,485:485,486:486,"babel/external-helpers":"babel/external-helpers"}],480:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(481),a=t(483);e.exports={components:{"ui-bar":t(342),"ui-button":t(343),"ui-display":t(344),"ui-input":t(345),"ui-linegraph":t(346),"ui-notice":t(347),"ui-section":t(349),"ui-subdisplay":t(350),"ui-tabs":t(351)},events:{enter:t(339).enter,space:t(339).space},transitions:{fade:t(340)},onconfig:function(){var e=this.get("config.interface"),n={ai_airlock:t(355),airalarm:t(356),"airalarm/back":t(357),"airalarm/modes":t(358),"airalarm/scrubbers":t(359),"airalarm/status":t(360),"airalarm/thresholds":t(361),"airalarm/vents":t(362),airlock_electronics:t(363),apc:t(364),atmos_alert:t(365),atmos_control:t(366),atmos_filter:t(367),atmos_mixer:t(368),atmos_pump:t(369),borgopanel:t(370),brig_timer:t(371),bsa:t(372),canister:t(373),cargo:t(374),cargo_express:t(375),cellular_emporium:t(376),centcom_podlauncher:t(377),chem_dispenser:t(378),chem_heater:t(379),chem_master:t(380),chem_synthesizer:t(381),clockwork_slab:t(382),codex_gigas:t(383),computer_fabricator:t(384),crayon:t(385),crew:t(386),cryo:t(387),disposal_unit:t(388),dna_vault:t(389),dogborg_sleeper:t(390),eightball:t(391),emergency_shuttle_console:t(392),engraved_message:t(393),error:t(394),"exofab - Copia":t(395),exonet_node:t(396),firealarm:t(397),gps:t(398),gulag_console:t(399),gulag_item_reclaimer:t(400),holodeck:t(401),implantchair:t(402),intellicard:t(403),keycard_auth:t(404),labor_claim_console:t(405),language_menu:t(406),launchpad_remote:t(407),mech_bay_power_console:t(408),mulebot:t(409),nanite_chamber_control:t(410),nanite_cloud_control:t(411),nanite_program_hub:t(412),nanite_programmer:t(413),nanite_remote:t(414),notificationpanel:t(415),ntnet_relay:t(416),ntos_ai_restorer:t(417),ntos_card:t(418),ntos_configuration:t(419),ntos_file_manager:t(420),ntos_main:t(421),ntos_net_chat:t(422),ntos_net_dos:t(423),ntos_net_downloader:t(424),ntos_net_monitor:t(425),ntos_net_transfer:t(426),ntos_power_monitor:t(427),ntos_revelation:t(428),ntos_station_alert:t(429),ntos_supermatter_monitor:t(430),ntosheader:t(431),nuclear_bomb:t(432),operating_computer:t(433),ore_redemption_machine:t(434),pandemic:t(435),personal_crafting:t(436),portable_pump:t(437),portable_scrubber:t(438),power_monitor:t(439),radio:t(440),rdconsole:t(441),"rdconsole/circuit":t(442),"rdconsole/designview":t(443),"rdconsole/destruct":t(444),"rdconsole/diskopsdesign":t(445),"rdconsole/diskopstech":t(446),"rdconsole/nodeview":t(447),"rdconsole/protolathe":t(448),"rdconsole/rdheader":t(449),"rdconsole/settings":t(450),"rdconsole/techweb":t(451),reagentgrinder:t(452),rpd:t(453),"rpd/colorsel":t(454),"rpd/dirsel":t(455),sat_control:t(456),scrubbing_types:t(457),shuttle_manipulator:t(458),"shuttle_manipulator/modification":t(459),"shuttle_manipulator/status":t(460),"shuttle_manipulator/templates":t(461),sleeper:t(462),slime_swap_body:t(463),smartvend:t(464),smes:t(465),smoke_machine:t(466),solar_control:t(467),space_heater:t(468),spawners_menu:t(469),station_alert:t(470),suit_storage_unit:t(471),tank_dispenser:t(472),tanks:t(473),thermomachine:t(474),turbine_computer:t(475),uplink:t(476),vr_sleeper:t(477),wires:t(478)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(354),titlebar:t(353),resize:t(348)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{339:339,340:340,341:341,342:342,343:343,344:344,345:345,346:346,347:347,348:348,349:349,350:350,351:351,353:353,354:354,355:355,356:356,357:357,358:358,359:359,360:360,361:361,362:362,363:363,364:364,365:365,366:366,367:367,368:368,369:369,370:370,371:371,372:372,373:373,374:374,375:375,376:376,377:377,378:378,379:379,380:380,381:381,382:382,383:383,384:384,385:385,386:386,387:387,388:388,389:389,390:390,391:391,392:392,393:393,394:394,395:395,396:396,397:397,398:398,399:399,400:400,401:401,402:402,403:403,404:404,405:405,406:406,407:407,408:408,409:409,410:410,411:411,412:412,413:413,414:414,415:415,416:416,417:417,418:418,419:419,420:420,421:421,422:422,423:423,424:424,425:425,426:426,427:427,428:428,429:429,430:430,431:431,432:432,433:433,434:434,435:435,436:436,437:437,438:438,439:439,440:440,441:441,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451,452:452,453:453,454:454,455:455,456:456,457:457,458:458,459:459,460:460,461:461,462:462,463:463,464:464,465:465,466:466,467:467,468:468,469:469,470:470,471:471,472:472,473:473,474:474,475:475,476:476,477:477,478:478,481:481,483:483}],481:[function(t,e,n){"use strict";function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],482:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],483:[function(t,e,n){"use strict";function a(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function r(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(481)},{481:481}],484:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;a||p.textContent.toLowerCase().includes(e)?p.style.display="":p.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],485:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],486:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var p=Array(o),u=0;o>u;u++)p[u]=arguments[u+3];n.children=p}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(p){r("throw",p)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(p){return void n(p)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e {{#if data.isBeakerLoaded}} {{Math.round(adata.beakerCurrentVolume)}}/{{data.beakerMaxVolume}} Units + pH: {{Math.round(adata.beakerCurrentpH*10)/10}}
      {{#each adata.beakerContents}} {{Math.fixed(volume, 2)}} units of {{name}}
      diff --git a/tgui/src/interfaces/chem_heater.ract b/tgui/src/interfaces/chem_heater.ract index 9093804cb7..60558c1580 100644 --- a/tgui/src/interfaces/chem_heater.ract +++ b/tgui/src/interfaces/chem_heater.ract @@ -16,6 +16,8 @@ {{#if data.isBeakerLoaded}} Temperature: {{Math.round(adata.currentTemp)}} K +
      + pH: {{Math.round(adata.currentpH*10)/10}}
      {{#each adata.beakerContents}} {{Math.fixed(volume, 2)}} units of {{name}}
      From 538e0fad29beed9e7d892242c99076e6b95a2ca3 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 30 Jun 2019 02:06:30 +0100 Subject: [PATCH 330/608] Oops --- code/modules/surgery/organs/vocal_cords.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 9800c015d2..856afc9b69 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1315,7 +1315,7 @@ H.SetStun(0) //INSTILL - else if((findtext(message, objective_words))) + else if((findtext(message, instill_words))) for(var/V in listeners) var/mob/living/carbon/human/H = V var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) @@ -1323,7 +1323,7 @@ var/instill = stripped_input(user, "Instill an emotion in your [(user.lewd?"Your pet":"listener")].", MAX_MESSAGE_LEN) var/customSpan = list("Notice", "Warning", "Hypnophrase", "Love", "Velvet") to_chat(H, "[instill]") - + //RECOGNISE else if((findtext(message, recognise_words))) for(var/V in listeners) From 937d6467e63ffce0518dd6708c4df8e38f5c679e Mon Sep 17 00:00:00 2001 From: Thalpy Date: Sun, 30 Jun 2019 19:16:27 +0100 Subject: [PATCH 331/608] Buncha fixes and QoL stuff. (pH, hypo, heater and dispencer_ --- code/modules/jobs/job_types/medical.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 17 +++++--- .../chemistry/machinery/chem_dispenser.dm | 4 ++ .../chemistry/machinery/chem_heater.dm | 9 +++- code/modules/research/designs/misc_designs.dm | 6 +-- code/modules/surgery/organs/vocal_cords.dm | 1 + code/modules/vending/wardrobes.dm | 2 +- .../code/modules/arousal/organs/genitals.dm | 4 +- .../chemistry/reagents/enlargement.dm | 35 ++++++++++++--- .../reagents/chemistry/recipes/fermi.dm | 25 ++++++++--- .../code/modules/reagents/objects/items.dm | 43 +++++++++++++------ tgui/assets/tgui.js | 20 ++++----- tgui/src/interfaces/chem_dispenser.ract | 2 +- tgui/src/interfaces/chem_heater.ract | 7 ++- 14 files changed, 126 insertions(+), 51 deletions(-) diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index 716e58f417..da1f9a7b33 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -127,7 +127,7 @@ Chemist backpack = /obj/item/storage/backpack/chemistry satchel = /obj/item/storage/backpack/satchel/chem duffelbag = /obj/item/storage/backpack/duffelbag/med - l_hand = /obj/item/FermiChem/pHbooklet + l_hand = /obj/item/fermichem/pHbooklet chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 770d8186d8..436688e2c0 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -198,7 +198,7 @@ trans_data = copy_data(T) - R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, T.purity, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, T.purity, pH, no_react = TRUE, ignore_pH = TRUE) //we only handle reaction after every reagent has been transfered. remove_reagent(T.id, transfer_amount, ignore_pH = TRUE) @@ -805,7 +805,7 @@ var/obj/item/reagent_containers/RC = my_atom RC.temp_check() -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, other_purity = 1, other_pH, no_react = 0) +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, other_purity = 1, other_pH, no_react = 0, ignore_pH = FALSE) if(!isnum(amount) || !amount) return FALSE @@ -818,7 +818,7 @@ WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") return FALSE - if (D.id == "water") //Do like an otter, add acid to water. + if (D.id == "water" && no_react == FALSE) //Do like an otter, add acid to water. if (pH <= 2) SSblackbox.record_feedback("tally", "fermi_chem", 1, "water-acid explosions") var/datum/effect_system/smoke_spread/chem/s = new @@ -858,10 +858,13 @@ chem_temp = thermal_energy / (specific_heat * new_total) //cacluate reagent based pH shift. - pH = ((cached_pH * cached_total)+(D.pH * amount))/(cached_total + amount)//should be right - if(istype(my_atom, /obj/item/reagent_containers/)) - var/obj/item/reagent_containers/RC = my_atom - RC.pH_check()//checks beaker resilience + if(ignore_pH == FALSE) + pH = ((cached_pH * cached_total)+(D.pH * amount))/(cached_total + amount)//should be right + if(istype(my_atom, /obj/item/reagent_containers/)) + var/obj/item/reagent_containers/RC = my_atom + RC.pH_check()//checks beaker resilience + else + pH = other_pH //add the reagent to the existing if it exists for(var/A in cached_reagents) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 4d1cc32564..fd57472a8e 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -190,6 +190,10 @@ data["beakerMaxVolume"] = beaker.volume data["beakerTransferAmounts"] = beaker.possible_transfer_amounts data["beakerCurrentpH"] = beaker.reagents.pH + //pH accuracy + for(var/obj/item/stock_parts/capacitor/C in component_parts) + data["partRating"]= 10**(C.rating-1) + else data["beakerCurrentVolume"] = null data["beakerMaxVolume"] = null diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 9ccb2fafcc..436ee80e7b 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -100,11 +100,18 @@ data["currentpH"] = beaker ? beaker.reagents.pH : null data["beakerCurrentVolume"] = beaker ? beaker.reagents.total_volume : null data["beakerMaxVolume"] = beaker ? beaker.volume : null + //purity and pH accuracy + for(var/obj/item/stock_parts/micro_laser/M in component_parts) + data["partRating"]= 10**(M.rating-1) + if(M.rating == 4) + data["showPurity"] = 1 + else + data["showPurity"] = 0 var beakerContents[0] if(beaker) for(var/datum/reagent/R in beaker.reagents.reagent_list) - beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list... + beakerContents.Add(list(list("name" = R.name, "volume" = R.volume, "purity" = R.purity))) // list in a list because Byond merges the first list... data["beakerContents"] = beakerContents return data diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 838753d308..05479ea7c1 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -468,16 +468,16 @@ build_path = /obj/item/anomaly_neutralizer category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING - + /datum/design/pHmeter name = "pH meter" desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution." id = "pHmeter" build_type = PROTOLATHE materials = list(MAT_METAL = 1000, MAT_SILVER = 100, MAT_DIAMOND = 100) - build_path = /obj/item/FermiChem/pHmeter + build_path = /obj/item/fermichem/pHmeter category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE ///////////////////////////////////////// ////////////Armour/////////////////////// diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 856afc9b69..fdd75ffd7b 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1323,6 +1323,7 @@ var/instill = stripped_input(user, "Instill an emotion in your [(user.lewd?"Your pet":"listener")].", MAX_MESSAGE_LEN) var/customSpan = list("Notice", "Warning", "Hypnophrase", "Love", "Velvet") to_chat(H, "[instill]") + E.cooldown += 1 //RECOGNISE else if((findtext(message, recognise_words))) diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index c40bec7eda..4e88833553 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -313,7 +313,7 @@ /obj/item/storage/backpack/chemistry = 3, /obj/item/storage/backpack/satchel/chem = 3, /obj/item/storage/bag/chemistry = 3, - /obj/item/FermiChem/pHbooklet = 3)//pH indicator) + /obj/item/fermichem/pHbooklet = 3)//pH indicator) refill_canister = /obj/item/vending_refill/wardrobe/chem_wardrobe /obj/item/vending_refill/wardrobe/chem_wardrobe diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 85c92edfdc..de3a75f3f1 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -310,10 +310,10 @@ if(istype(O, /obj/item/organ/genital)) organCheck = TRUE if(/obj/item/organ/genital/penis) - dna.features["has_cock"] = TRUE + //dna.features["has_cock"] = TRUE willyCheck = TRUE if(/obj/item/organ/genital/breasts) - dna.features["has_breasts"] = TRUE//Goddamnit get in there. + //dna.features["has_breasts"] = TRUE//Goddamnit get in there. breastCheck = TRUE if(organCheck == FALSE) if(ishuman(src) && dna.species.id == "human") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 70cef57f0f..64e4e12b66 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -134,7 +134,7 @@ ..() /datum/reagent/fermi/BEsmaller - name = "Succubus milk" + name = "Modesty milk" id = "BEsmaller" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." color = "#E60584" // rgb: 96, 0, 255 @@ -158,18 +158,31 @@ ..() /datum/reagent/fermi/BEsmaller_hypo - name = "Modesty milk" + name = "Rectify milk" //Rectify id = "BEsmaller_hypo" color = "#E60584" taste_description = "a milky ice cream like flavour." + metabolization_rate = 0.25 description = "A medicine used to treat organomegaly in a patient's breasts." var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) +/datum/reagent/fermi/BEsmaller_hypo/on_mob_add(mob/living/carbon/M) + . = ..() + if(M.dna.features["has_vag"]) + var/obj/item/organ/genital/vagina/nV = new + nV.Insert(M) + if(M.dna.features["has_womb"]) + var/obj/item/organ/genital/womb/nW = new + nW.Insert(M) + /datum/reagent/fermi/BEsmaller_hypo/on_mob_life(mob/living/carbon/M) var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) return..() - if(B.cached_size > (sizeConv[M.dna.features["breasts_size"]]+0.1)) + if(!M.dna.features["has_breasts"])//Fast fix for those who don't want it. + B.cached_size = B.cached_size - 0.1 + B.update() + else if(B.cached_size > (sizeConv[M.dna.features["breasts_size"]]+0.1)) B.cached_size = B.cached_size - 0.05 B.update() else if(B.cached_size < (sizeConv[M.dna.features["breasts_size"]])+0.1) @@ -285,7 +298,7 @@ ..() /datum/reagent/fermi/PEsmaller // Due to cozmo's request...! - name = "Incubus draft" + name = "Chastity draft" id = "PEsmaller" description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." color = "#888888" // This is greyish..? @@ -310,17 +323,27 @@ ..() /datum/reagent/fermi/PEsmaller_hypo - name = "Chastity draft" + name = "Rectify draft" id = "PEsmaller_hypo" color = "#888888" // This is greyish..? taste_description = "chinese dragon powder" description = "A medicine used to treat organomegaly in a patient's penis." + metabolization_rate = 0.5 + +/datum/reagent/fermi/PEsmaller_hypo/on_mob_add(mob/living/carbon/M) + . = ..() + if(M.dna.features["has_balls"]) + var/obj/item/organ/genital/testicles/nT = new + nT.Insert(M) /datum/reagent/fermi/PEsmaller_hypo/on_mob_life(mob/living/carbon/M) var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) return ..() - if(P.cached_length > (M.dna.features["cock_length"]+0.1)) + if(!M.dna.features["has_penis"])//Fast fix for those who don't want it. + P.cached_length = P.cached_length - 0.2 + P.update() + else if(P.cached_length > (M.dna.features["cock_length"]+0.1)) P.cached_length = P.cached_length - 0.1 P.update() else if(P.cached_length < (M.dna.features["cock_length"]+0.1)) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index d3a1f7b401..372ef001c4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -139,8 +139,8 @@ /datum/chemical_reaction/fermi/breast_enlarger name = "Sucubus milk" id = "breast_enlarger" - results = list("breast_enlarger" = 0.4) - required_reagents = list("salglu_solution" = 0.1, "milk" = 0.5, "synthflesh" = 0.2, "silicon" = 0.2, "aphro" = 0.2) + results = list("breast_enlarger" = 0.8) + required_reagents = list("salglu_solution" = 0.1, "milk" = 0.1, "synthflesh" = 0.2, "silicon" = 0.3, "aphro" = 0.3) mix_message = "the reaction gives off a mist of milk." //FermiChem vars: OptimalTempMin = 200 @@ -151,7 +151,7 @@ ReactpHLim = 3 CatalystFact = 0 CurveSharpT = 2 - CurveSharppH = 2 + CurveSharppH = 1 ThermicConstant = 1 HIonRelease = -0.1 RateUpLim = 5 @@ -159,6 +159,14 @@ FermiExplode = TRUE PurityMin = 0.1 +/datum/chemical_reaction/fermi/breast_enlarger/FermiFinish(datum/reagents/holder, var/atom/my_atom) + var/datum/reagent/fermi/breast_enlarger/BE = locate(/datum/reagent/fermi/breast_enlarger) in my_atom.reagents.reagent_list + var/cached_volume = BE.volume + if(BE.purity < 0.35) + holder.remove_reagent(src.id, cached_volume) + holder.add_reagent("BEsmaller", cached_volume) + + /datum/chemical_reaction/fermi/breast_enlarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) var/obj/item/organ/genital/breasts/B = new /obj/item/organ/genital/breasts(get_turf(my_atom)) var/list/seen = viewers(8, get_turf(my_atom)) @@ -171,7 +179,7 @@ /datum/chemical_reaction/fermi/penis_enlarger name = "Incubus draft" id = "penis_enlarger" - results = list("penis_enlarger" = 0.4) + results = list("penis_enlarger" = 0.8) required_reagents = list("blood" = 0.5, "synthflesh" = 0.2, "carbon" = 0.2, "aphro" = 0.2, "salglu_solution" = 0.1,) mix_message = "the reaction gives off a spicy mist." //FermiChem vars: @@ -183,7 +191,7 @@ ReactpHLim = 3 CatalystFact = 0 CurveSharpT = 2 - CurveSharppH = 2 + CurveSharppH = 1 ThermicConstant = 1 HIonRelease = 0.1 RateUpLim = 5 @@ -200,6 +208,13 @@ P.length = ((PE.volume * PE.purity) / 10)//half as effective. my_atom.reagents.clear_reagents() +/datum/chemical_reaction/fermi/penis_enlarger/FermiFinish(datum/reagents/holder, var/atom/my_atom) + var/datum/reagent/fermi/penis_enlarger/PE = locate(/datum/reagent/fermi/penis_enlarger) in my_atom.reagents.reagent_list + var/cached_volume = PE.volume + if(PE.purity < 0.35) + holder.remove_reagent(src.id, cached_volume) + holder.add_reagent("PEsmaller", cached_volume) + /datum/chemical_reaction/fermi/astral name = "Astrogen" id = "astral" diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 96e4e6fd53..a1d7a296a4 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -1,4 +1,4 @@ -/obj/item/FermiChem/pHbooklet +/obj/item/fermichem/pHbooklet name = "pH indicator booklet" desc = "A booklet containing paper soaked in universal indicator." icon_state = "pHbooklet" @@ -9,10 +9,10 @@ w_class = WEIGHT_CLASS_TINY //A little janky with pockets -/obj/item/FermiChem/pHbooklet/attack_hand(mob/user) +/obj/item/fermichem/pHbooklet/attack_hand(mob/user) if(user.get_held_index_of_item(src))//Does this check pockets too..? if(numberOfPages >= 1) - var/obj/item/FermiChem/pHpaper/P = new /obj/item/FermiChem/pHpaper + var/obj/item/fermichem/pHpaper/P = new /obj/item/fermichem/pHpaper P.add_fingerprint(user) P.forceMove(user.loc) user.put_in_active_hand(P) @@ -34,10 +34,10 @@ if(!I) user.put_in_active_hand(src) -/obj/item/FermiChem/pHbooklet/MouseDrop() +/obj/item/fermichem/pHbooklet/MouseDrop() var/mob/living/user = usr if(numberOfPages >= 1) - var/obj/item/FermiChem/pHpaper/P = new /obj/item/FermiChem/pHpaper + var/obj/item/fermichem/pHpaper/P = new /obj/item/fermichem/pHpaper P.add_fingerprint(user) P.forceMove(user) user.put_in_active_hand(P) @@ -54,7 +54,7 @@ return ..() -/obj/item/FermiChem/pHpaper +/obj/item/fermichem/pHpaper name = "pH indicator strip" desc = "A piece of paper that will change colour depending on the pH of a solution." icon_state = "pHpaper" @@ -65,7 +65,7 @@ resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_TINY -/obj/item/FermiChem/pHpaper/afterattack(obj/item/reagent_containers/cont, mob/user, proximity) +/obj/item/fermichem/pHpaper/afterattack(obj/item/reagent_containers/cont, mob/user, proximity) if(!istype(cont)) return if(used == TRUE) @@ -107,20 +107,39 @@ desc += " The paper looks to be around a pH of [round(cont.reagents.pH, 1)]" used = TRUE -/obj/item/FermiChem/pHmeter - name = "pH meter" +/obj/item/fermichem/pHmeter + name = "Chemistry Analyser" desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays nothing." icon_state = "pHmeter" icon = 'modular_citadel/icons/obj/FermiChem.dmi' resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_TINY + var/scanmode = 1 -/obj/item/FermiChem/pHmeter/afterattack(atom/A, mob/user, proximity) +/obj/item/fermichem/pHmeter/attack_self(mob/user) + if(!scanmode) + to_chat(user, "You switch the chemical analyzer to give a detailed report.") + scanmode = 1 + else + to_chat(user, "You switch the chemical analyzer to give a reduced report.") + scanmode = 0 + +/obj/item/fermichem/pHmeter/afterattack(atom/A, mob/user, proximity) . = ..() if(!istype(A, /obj/item/reagent_containers)) return var/obj/item/reagent_containers/cont = A if(LAZYLEN(cont.reagents.reagent_list) == null) return - to_chat(user, "The pH meter beeps and displays [round(cont.reagents.pH, 0.1)]") - desc = "An electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays [round(cont.reagents.pH, 0.1)]." + var/out_message + to_chat(user, "The chemistry meter beeps and displays:") + out_message += "Total volume: [round(cont.volume, 0.01)] Total pH: [round(cont.reagents.pH, 0.1)]\n" + if(cont.reagents.fermiIsReacting) + out_message += "A reaction appears to be occuring currently.\n" + out_message += "Chemicals found in the beaker:\n" + for(var/datum/reagent/R in cont.reagents.reagent_list) + out_message += "[R.name], Purity: [R.purity] [(scanmode?"Overdose: [R.overdose_threshold], Addiction: [R.addiction_threshold], Base pH [R.pH]":"")]\n" + if(scanmode) + out_message += "Analysis: [R.description]\n" + to_chat(user, "[out_message]") + desc = "An electrode attached to a small circuit box that will analyse a beaker. It can be toggled to give a reduced or extended report. The screen currently displays [round(cont.reagents.pH, 0.1)]." diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index bbc64eee4f..919ecdbf29 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -9,13 +9,13 @@ name:"css",extend:function(t,e,n){if(n.css){var a=Up++,r=n.noCssTransform?n.css: return t.replace(/-([a-zA-Z])/g,function(t,e){return e.toUpperCase()})};Xi?(uf={},cf=co("div").style,pf=function(t){var e,n,a;if(t=mf(t),!uf[t])if(void 0!==cf[t])uf[t]=t;else for(a=t.charAt(0).toUpperCase()+t.substring(1),e=ro.length;e--;)if(n=ro[e],void 0!==cf[n+a]){uf[t]=n+a;break}return uf[t]}):pf=null;var gf,vf,bf=pf;Xi?(vf=window.getComputedStyle||Po.getComputedStyle,gf=function(t){var e,n,a,r,o;if(e=vf(this.node),"string"==typeof t)return o=e[bf(t)],"0px"===o&&(o=0),o;if(!i(t))throw Error("Transition$getStyle must be passed a string, or an array of strings representing CSS properties");for(n={},a=t.length;a--;)r=t[a],o=e[bf(r)],"0px"===o&&(o=0),n[r]=o;return n}):gf=null;var yf=gf,_f=function(t,e){var n;if("string"==typeof t)this.node.style[bf(t)]=e;else for(n in t)t.hasOwnProperty(n)&&(this.node.style[bf(n)]=t[n]);return this},xf=function(t){var e;this.duration=t.duration,this.step=t.step,this.complete=t.complete,"string"==typeof t.easing?(e=t.root.easing[t.easing],e||(g(Io(t.easing,"easing")),e=qa)):e="function"==typeof t.easing?t.easing:qa,this.easing=e,this.start=ns(),this.end=this.start+this.duration,this.running=!0,xs.add(this)};xf.prototype={tick:function(t){var e,n;return this.running?t>this.end?(this.step&&this.step(1),this.complete&&this.complete(1),!1):(e=t-this.start,n=this.easing(e/this.duration),this.step&&this.step(n),!0):!1},stop:function(){this.abort&&this.abort(),this.running=!1}};var wf,kf,Sf,Ef,Cf,Pf,Af,Of,Tf=xf,Rf=RegExp("^-(?:"+ro.join("|")+")-"),Mf=function(t){return t.replace(Rf,"")},Lf=RegExp("^(?:"+ro.join("|")+")([A-Z])"),jf=function(t){var e;return t?(Lf.test(t)&&(t="-"+t),e=t.replace(/[A-Z]/g,function(t){return"-"+t.toLowerCase()})):""},Df={},Nf={};Xi?(kf=co("div").style,function(){void 0!==kf.transition?(Sf="transition",Ef="transitionend",Cf=!0):void 0!==kf.webkitTransition?(Sf="webkitTransition",Ef="webkitTransitionEnd",Cf=!0):Cf=!1}(),Sf&&(Pf=Sf+"Duration",Af=Sf+"Property",Of=Sf+"TimingFunction"),wf=function(t,e,n,a,r){setTimeout(function(){var i,o,s,p,u;p=function(){o&&s&&(t.root.fire(t.name+":end",t.node,t.isIntro),r())},i=(t.node.namespaceURI||"")+t.node.tagName,t.node.style[Af]=a.map(bf).map(jf).join(","),t.node.style[Of]=jf(n.easing||"linear"),t.node.style[Pf]=n.duration/1e3+"s",u=function(e){var n;n=a.indexOf(mf(Mf(e.propertyName))),-1!==n&&a.splice(n,1),a.length||(t.node.removeEventListener(Ef,u,!1),s=!0,p())},t.node.addEventListener(Ef,u,!1),setTimeout(function(){for(var r,c,l,d,f,h=a.length,g=[];h--;)d=a[h],r=i+d,Cf&&!Nf[r]&&(t.node.style[bf(d)]=e[d],Df[r]||(c=t.getStyle(d),Df[r]=t.getStyle(d)!=e[d],Nf[r]=!Df[r],Nf[r]&&(t.node.style[bf(d)]=c))),(!Cf||Nf[r])&&(void 0===c&&(c=t.getStyle(d)),l=a.indexOf(d),-1===l?m("Something very strange happened with transitions. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!",{node:t.node}):a.splice(l,1),f=/[^\d]*$/.exec(e[d])[0],g.push({name:bf(d),interpolator:qo(parseFloat(c),parseFloat(e[d])),suffix:f}));g.length?new Tf({root:t.root,duration:n.duration,easing:mf(n.easing||""),step:function(e){var n,a;for(a=g.length;a--;)n=g[a],t.node.style[n.name]=n.interpolator(e)+n.suffix},complete:function(){o=!0,p()}}):o=!0,a.length||(t.node.removeEventListener(Ef,u,!1),s=!0,p())},0)},n.delay||0)}):wf=null;var Ff,If,Bf,qf,Uf,Vf=wf;if("undefined"!=typeof document){if(Ff="hidden",Uf={},Ff in document)Bf="";else for(qf=ro.length;qf--;)If=ro[qf],Ff=If+"Hidden",Ff in document&&(Bf=If);void 0!==Bf?(document.addEventListener(Bf+"visibilitychange",Ua),Ua()):("onfocusout"in document?(document.addEventListener("focusout",Va),document.addEventListener("focusin",Ga)):(window.addEventListener("pagehide",Va),window.addEventListener("blur",Va),window.addEventListener("pageshow",Ga),window.addEventListener("focus",Ga)),Uf.hidden=!1)}var Gf,zf,Wf,Hf=Uf;Xi?(zf=window.getComputedStyle||Po.getComputedStyle,Gf=function(t,e,n){var a,r=this;if(4===arguments.length)throw Error("t.animateStyle() returns a promise - use .then() instead of passing a callback");if(Hf.hidden)return this.setStyle(t,e),Wf||(Wf=us.resolve());"string"==typeof t?(a={},a[t]=e):(a=t,n=e),n||(g('The "%s" transition does not supply an options object to `t.animateStyle()`. This will break in a future version of Ractive. For more info see https://github.com/RactiveJS/Ractive/issues/340',this.name),n=this);var i=new us(function(t){var e,i,o,s,p,u,c;if(!n.duration)return r.setStyle(a),void t();for(e=Object.keys(a),i=[],o=zf(r.node),p={},u=e.length;u--;)c=e[u],s=o[bf(c)],"0px"===s&&(s=0),s!=a[c]&&(i.push(c),r.node.style[bf(c)]=s);return i.length?void Vf(r,a,n,i,t):void t()});return i}):Gf=null;var Kf=Gf,Qf=function(t,e){return"number"==typeof t?t={duration:t}:"string"==typeof t?t="slow"===t?{duration:600}:"fast"===t?{duration:200}:{duration:400}:t||(t={}),r({},t,e)},Yf=za,$f=function(t,e,n){this.init(t,e,n)};$f.prototype={init:hf,start:Yf,getStyle:yf,setStyle:_f,animateStyle:Kf,processParams:Qf};var Jf,Xf,Zf=$f,th=Ha;Jf=function(){var t=this.node,e=this.fragment.toString(!1);if(window&&window.appearsToBeIELessEqual8&&(t.type="text/css"),t.styleSheet)t.styleSheet.cssText=e;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}},Xf=function(){this.node.type&&"text/javascript"!==this.node.type||m("Script tag was updated. This does not cause the code to be re-evaluated!",{ractive:this.root}),this.node.text=this.fragment.toString(!1)};var eh=function(){var t,e;return this.template.y?"":(t="<"+this.template.e,t+=this.attributes.map(Xa).join("")+this.conditionalAttributes.map(Xa).join(""),"option"===this.name&&$a(this)&&(t+=" selected"),"input"===this.name&&Ja(this)&&(t+=" checked"),t+=">","textarea"===this.name&&void 0!==this.getAttribute("value")?t+=Se(this.getAttribute("value")):void 0!==this.getAttribute("contenteditable")&&(t+=this.getAttribute("value")||""),this.fragment&&(e="script"!==this.name&&"style"!==this.name,t+=this.fragment.toString(e)),ic.test(this.template.e)||(t+=""),t)},nh=Za,ah=tr,rh=function(t){this.init(t)};rh.prototype={bubble:Tl,detach:Rl,find:Ml,findAll:Ll,findAllComponents:jl,findComponent:Dl,findNextNode:Nl,firstNode:Fl,getAttribute:Il,init:df,rebind:ff,render:th,toString:eh,unbind:nh,unrender:ah};var ih=rh,oh=/^\s*$/,sh=/^\s*/,ph=function(t){var e,n,a,r;return e=t.split("\n"),n=e[0],void 0!==n&&oh.test(n)&&e.shift(),a=D(e),void 0!==a&&oh.test(a)&&e.pop(),r=e.reduce(nr,null),r&&(t=e.map(function(t){return t.replace(r,"")}).join("\n")),t},uh=ar,ch=function(t,e){var n;return e?n=t.split("\n").map(function(t,n){return n?e+t:t}).join("\n"):t},lh='Could not find template for partial "%s"',dh=function(t){var e,n;e=this.parentFragment=t.parentFragment,this.root=e.root,this.type=Au,this.index=t.index,this.name=t.template.r,this.rendered=!1,this.fragment=this.fragmentToRender=this.fragmentToUnrender=null,Gc.init(this,t),this.keypath||((n=uh(this.root,this.name,e))?(_c.call(this),this.isNamed=!0,this.setTemplate(n)):g(lh,this.name))};dh.prototype={bubble:function(){this.parentFragment.bubble()},detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},firstNode:function(){return this.fragment.firstNode()},findNextNode:function(){return this.parentFragment.findNextNode(this)},getPartialName:function(){return this.isNamed&&this.name?this.name:void 0===this.value?this.name:this.value},getValue:function(){return this.fragment.getValue()},rebind:function(t,e){this.isNamed||Vc.call(this,t,e),this.fragment&&this.fragment.rebind(t,e)},render:function(){return this.docFrag=document.createDocumentFragment(),this.update(),this.rendered=!0,this.docFrag},resolve:Gc.resolve,setValue:function(t){var e;(void 0===t||t!==this.value)&&(void 0!==t&&(e=uh(this.root,""+t,this.parentFragment)),!e&&this.name&&(e=uh(this.root,this.name,this.parentFragment))&&(_c.call(this),this.isNamed=!0),e||g(lh,this.name,{ractive:this.root}),this.value=t,this.setTemplate(e||[]),this.bubble(),this.rendered&&bs.addView(this))},setTemplate:function(t){this.fragment&&(this.fragment.unbind(),this.rendered&&(this.fragmentToUnrender=this.fragment)),this.fragment=new rg({template:t,root:this.root,owner:this,pElement:this.parentFragment.pElement}),this.fragmentToRender=this.fragment},toString:function(t){var e,n,a,r;return e=this.fragment.toString(t),n=this.parentFragment.items[this.index-1],n&&n.type===ku?(a=n.text.split("\n").pop(),(r=/^\s+$/.exec(a))?ch(e,r[0]):e):e},unbind:function(){this.isNamed||_c.call(this),this.fragment&&this.fragment.unbind()},unrender:function(t){this.rendered&&(this.fragment&&this.fragment.unrender(t),this.rendered=!1)},update:function(){var t,e;this.fragmentToUnrender&&(this.fragmentToUnrender.unrender(!0),this.fragmentToUnrender=null),this.fragmentToRender&&(this.docFrag.appendChild(this.fragmentToRender.render()),this.fragmentToRender=null),this.rendered&&(t=this.parentFragment.getNode(),e=this.parentFragment.findNextNode(this),t.insertBefore(this.docFrag,e))}};var fh,hh,mh,gh=dh,vh=pr,bh=ur,yh=new is("detach"),_h=cr,xh=lr,wh=dr,kh=fr,Sh=hr,Eh=mr,Ch=function(t,e,n,a){var r=t.root,i=t.keypath;a?r.viewmodel.smartUpdate(i,e,a):r.viewmodel.mark(i)},Ph=[],Ah=["pop","push","reverse","shift","sort","splice","unshift"];Ah.forEach(function(t){var e=function(){for(var e=arguments.length,n=Array(e),a=0;e>a;a++)n[a]=arguments[a];var r,i,o,s;for(r=bp(this,t,n),i=Array.prototype[t].apply(this,arguments),bs.start(),this._ractive.setting=!0,s=this._ractive.wrappers.length;s--;)o=this._ractive.wrappers[s],bs.addRactive(o.root),Ch(o,this,t,r);return bs.end(),this._ractive.setting=!1,i};Eo(Ph,t,{value:e})}),fh={},fh.__proto__?(hh=function(t){t.__proto__=Ph},mh=function(t){t.__proto__=Array.prototype}):(hh=function(t){var e,n;for(e=Ah.length;e--;)n=Ah[e],Eo(t,n,{value:Ph[n],configurable:!0})},mh=function(t){var e;for(e=Ah.length;e--;)delete t[Ah[e]]}),hh.unpatch=mh;var Oh,Th,Rh,Mh=hh;Oh={filter:function(t){return i(t)&&(!t._ractive||!t._ractive.setting)},wrap:function(t,e,n){return new Th(t,e,n)}},Th=function(t,e,n){this.root=t,this.value=e,this.keypath=S(n),e._ractive||(Eo(e,"_ractive",{value:{wrappers:[],instances:[],setting:!1},configurable:!0}),Mh(e)),e._ractive.instances[t._guid]||(e._ractive.instances[t._guid]=0,e._ractive.instances.push(t)),e._ractive.instances[t._guid]+=1,e._ractive.wrappers.push(this)},Th.prototype={get:function(){return this.value},teardown:function(){var t,e,n,a,r;if(t=this.value,e=t._ractive,n=e.wrappers,a=e.instances,e.setting)return!1;if(r=n.indexOf(this),-1===r)throw Error(Rh);if(n.splice(r,1),n.length){if(a[this.root._guid]-=1,!a[this.root._guid]){if(r=a.indexOf(this.root),-1===r)throw Error(Rh);a.splice(r,1)}}else delete t._ractive,Mh.unpatch(this.value)}},Rh="Something went wrong in a rather interesting way";var Lh,jh,Dh=Oh,Nh=/^\s*[0-9]+\s*$/,Fh=function(t){return Nh.test(t)?[]:{}};try{Object.defineProperty({},"test",{value:0}),Lh={filter:function(t,e,n){var a,r;return e?(e=S(e),(a=n.viewmodel.wrapped[e.parent.str])&&!a.magic?!1:(r=n.viewmodel.get(e.parent),i(r)&&/^[0-9]+$/.test(e.lastKey)?!1:r&&("object"==typeof r||"function"==typeof r))):!1},wrap:function(t,e,n){return new jh(t,e,n)}},jh=function(t,e,n){var a,r,i;return n=S(n),this.magic=!0,this.ractive=t,this.keypath=n,this.value=e,this.prop=n.lastKey,a=n.parent,this.obj=a.isRoot?t.viewmodel.data:t.viewmodel.get(a),r=this.originalDescriptor=Object.getOwnPropertyDescriptor(this.obj,this.prop),r&&r.set&&(i=r.set._ractiveWrappers)?void(-1===i.indexOf(this)&&i.push(this)):void gr(this,e,r)},jh.prototype={get:function(){return this.value},reset:function(t){return this.updating?void 0:(this.updating=!0,this.obj[this.prop]=t,bs.addRactive(this.ractive),this.ractive.viewmodel.mark(this.keypath,{keepExistingWrapper:!0}),this.updating=!1,!0)},set:function(t,e){this.updating||(this.obj[this.prop]||(this.updating=!0,this.obj[this.prop]=Fh(t),this.updating=!1),this.obj[this.prop][t]=e)},teardown:function(){var t,e,n,a,r;return this.updating?!1:(t=Object.getOwnPropertyDescriptor(this.obj,this.prop),e=t&&t.set,void(e&&(a=e._ractiveWrappers,r=a.indexOf(this),-1!==r&&a.splice(r,1),a.length||(n=this.obj[this.prop],Object.defineProperty(this.obj,this.prop,this.originalDescriptor||{writable:!0,enumerable:!0,configurable:!0}),this.obj[this.prop]=n))))}}}catch(Ao){Lh=!1}var Ih,Bh,qh=Lh;qh&&(Ih={filter:function(t,e,n){return qh.filter(t,e,n)&&Dh.filter(t)},wrap:function(t,e,n){return new Bh(t,e,n)}},Bh=function(t,e,n){this.value=e,this.magic=!0,this.magicWrapper=qh.wrap(t,e,n),this.arrayWrapper=Dh.wrap(t,e,n)},Bh.prototype={get:function(){return this.value},teardown:function(){this.arrayWrapper.teardown(),this.magicWrapper.teardown()},reset:function(t){return this.magicWrapper.reset(t)}});var Uh=Ih,Vh=vr,Gh={},zh=_r,Wh=xr,Hh=Sr,Kh=Or,Qh=Tr,Yh=function(t,e){this.computation=t,this.viewmodel=t.viewmodel,this.ref=e,this.root=this.viewmodel.ractive,this.parentFragment=this.root.component&&this.root.component.parentFragment};Yh.prototype={resolve:function(t){this.computation.softDeps.push(t),this.computation.unresolvedDeps[t.str]=null,this.viewmodel.register(t,this.computation,"computed")}};var $h=Yh,Jh=function(t,e){this.key=t,this.getter=e.getter,this.setter=e.setter,this.hardDeps=e.deps||[],this.softDeps=[],this.unresolvedDeps={},this.depValues={},this._dirty=this._firstRun=!0};Jh.prototype={constructor:Jh,init:function(t){var e,n=this;this.viewmodel=t,this.bypass=!0,e=t.get(this.key),t.clearCache(this.key.str),this.bypass=!1,this.setter&&void 0!==e&&this.set(e),this.hardDeps&&this.hardDeps.forEach(function(e){return t.register(e,n,"computed")})},invalidate:function(){this._dirty=!0},get:function(){var t,e,n=this,a=!1;if(this.getting){var r="The "+this.key.str+" computation indirectly called itself. This probably indicates a bug in the computation. It is commonly caused by `array.sort(...)` - if that's the case, clone the array first with `array.slice().sort(...)`";return h(r),this.value}if(this.getting=!0,this._dirty){if(this._firstRun||!this.hardDeps.length&&!this.softDeps.length?a=!0:[this.hardDeps,this.softDeps].forEach(function(t){var e,r,i;if(!a)for(i=t.length;i--;)if(e=t[i],r=n.viewmodel.get(e),!s(r,n.depValues[e.str]))return n.depValues[e.str]=r,void(a=!0)}),a){this.viewmodel.capture();try{this.value=this.getter()}catch(i){m('Failed to compute "%s"',this.key.str),d(i.stack||i),this.value=void 0}t=this.viewmodel.release(),e=this.updateDependencies(t),e&&[this.hardDeps,this.softDeps].forEach(function(t){t.forEach(function(t){n.depValues[t.str]=n.viewmodel.get(t)})})}this._dirty=!1}return this.getting=this._firstRun=!1,this.value},set:function(t){if(this.setting)return void(this.value=t);if(!this.setter)throw Error("Computed properties without setters are read-only. (This may change in a future version of Ractive!)");this.setter(t)},updateDependencies:function(t){var e,n,a,r,i;for(n=this.softDeps,e=n.length;e--;)a=n[e],-1===t.indexOf(a)&&(r=!0,this.viewmodel.unregister(a,this,"computed"));for(e=t.length;e--;)a=t[e],-1!==n.indexOf(a)||this.hardDeps&&-1!==this.hardDeps.indexOf(a)||(r=!0,Rr(this.viewmodel,a)&&!this.unresolvedDeps[a.str]?(i=new $h(this,a.str),t.splice(e,1),this.unresolvedDeps[a.str]=i,bs.addUnresolved(i)):this.viewmodel.register(a,this,"computed"));return r&&(this.softDeps=t.slice()),r}};var Xh=Jh,Zh=Mr,tm={FAILED_LOOKUP:!0},em=Lr,nm={},am=Dr,rm=Nr,im=function(t,e){this.localKey=t,this.keypath=e.keypath,this.origin=e.origin,this.deps=[],this.unresolved=[],this.resolved=!1};im.prototype={forceResolution:function(){this.keypath=this.localKey,this.setup()},get:function(t,e){return this.resolved?this.origin.get(this.map(t),e):void 0},getValue:function(){return this.keypath?this.origin.get(this.keypath):void 0},initViewmodel:function(t){this.local=t,this.setup()},map:function(t){return void 0===typeof this.keypath?this.localKey:t.replace(this.localKey,this.keypath)},register:function(t,e,n){this.deps.push({keypath:t,dep:e,group:n}),this.resolved&&this.origin.register(this.map(t),e,n)},resolve:function(t){void 0!==this.keypath&&this.unbind(!0),this.keypath=t,this.setup()},set:function(t,e){this.resolved||this.forceResolution(),this.origin.set(this.map(t),e)},setup:function(){var t=this;void 0!==this.keypath&&(this.resolved=!0,this.deps.length&&(this.deps.forEach(function(e){var n=t.map(e.keypath);if(t.origin.register(n,e.dep,e.group),e.dep.setValue)e.dep.setValue(t.origin.get(n));else{if(!e.dep.invalidate)throw Error("An unexpected error occurred. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");e.dep.invalidate()}}),this.origin.mark(this.keypath)))},setValue:function(t){if(!this.keypath)throw Error("Mapping does not have keypath, cannot set value. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");this.origin.set(this.keypath,t)},unbind:function(t){var e=this;t||delete this.local.mappings[this.localKey],this.resolved&&(this.deps.forEach(function(t){e.origin.unregister(e.map(t.keypath),t.dep,t.group)}),this.tracker&&this.origin.unregister(this.keypath,this.tracker))},unregister:function(t,e,n){var a,r;if(this.resolved){for(a=this.deps,r=a.length;r--;)if(a[r].dep===e){a.splice(r,1);break}this.origin.unregister(this.map(t),e,n)}}};var om=Fr,sm=function(t,e){var n,a,r,i;return n={},a=0,r=t.map(function(t,r){var o,s,p;s=a,p=e.length;do{if(o=e.indexOf(t,s),-1===o)return i=!0,-1;s=o+1}while(n[o]&&p>s);return o===a&&(a+=1),o!==r&&(i=!0),n[o]=!0,o})},pm=Ir,um={},cm=Ur,lm=Gr,dm=zr,fm=Wr,hm=Kr,mm={implicit:!0},gm={noCascade:!0},vm=Yr,bm=$r,ym=function(t){var e,n,a=t.adapt,r=t.data,i=t.ractive,o=t.computed,s=t.mappings;this.ractive=i,this.adaptors=a,this.onchange=t.onchange,this.cache={},this.cacheMap=So(null),this.deps={computed:So(null),"default":So(null)},this.depsMap={computed:So(null),"default":So(null)},this.patternObservers=[],this.specials=So(null),this.wrapped=So(null),this.computations=So(null),this.captureGroups=[],this.unresolvedImplicitDependencies=[],this.changes=[],this.implicitChanges={},this.noCascade={},this.data=r,this.mappings=So(null);for(e in s)this.map(S(e),s[e]);if(r)for(e in r)(n=this.mappings[e])&&void 0===n.getValue()&&n.setValue(r[e]);for(e in o)s&&e in s&&l("Cannot map to a computed property ('%s')",e),this.compute(S(e),o[e]);this.ready=!0};ym.prototype={adapt:Vh,applyChanges:Hh,capture:Kh,clearCache:Qh,compute:Zh,get:em,init:am,map:rm,mark:om,merge:pm,register:cm,release:lm,reset:dm,set:fm,smartUpdate:hm,teardown:vm,unregister:bm};var _m=ym;Xr.prototype={constructor:Xr,begin:function(t){this.inProcess[t._guid]=!0},end:function(t){var e=t.parent;e&&this.inProcess[e._guid]?Zr(this.queue,e).push(t):ti(this,t),delete this.inProcess[t._guid]}};var xm=Xr,wm=ei,km=/\$\{([^\}]+)\}/g,Sm=new is("construct"),Em=new is("config"),Cm=new xm("init"),Pm=0,Am=["adaptors","components","decorators","easing","events","interpolators","partials","transitions"],Om=ii,Tm=ci;ci.prototype={bubble:function(){this.dirty||(this.dirty=!0,bs.addView(this))},update:function(){this.callback(this.fragment.getValue()),this.dirty=!1},rebind:function(t,e){this.fragment.rebind(t,e)},unbind:function(){this.fragment.unbind()}};var Rm=function(t,e,n,r,o){var s,p,u,c,l,d,f={},h={},g={},v=[];for(p=t.parentFragment,u=t.root,o=o||{},a(f,o),o.content=r||[],f[""]=o.content,e.defaults.el&&m("The <%s/> component has a default `el` property; it has been disregarded",t.name),c=p;c;){if(c.owner.type===Mu){l=c.owner.container;break}c=c.parent}return n&&Object.keys(n).forEach(function(e){var a,r,o=n[e];if("string"==typeof o)a=dc(o),h[e]=a?a.value:o;else if(0===o)h[e]=!0;else{if(!i(o))throw Error("erm wut");di(o)?(g[e]={origin:t.root.viewmodel,keypath:void 0},r=li(t,o[0],function(t){t.isSpecial?d?s.set(e,t.value):(h[e]=t.value,delete g[e]):d?s.viewmodel.mappings[e].resolve(t):g[e].keypath=t})):r=new Tm(t,o,function(t){d?s.set(e,t):h[e]=t}),v.push(r)}}),s=So(e.prototype),Om(s,{el:null,append:!0,data:h,partials:o,magic:u.magic||e.defaults.magic,modifyArrays:u.modifyArrays,adapt:u.adapt},{parent:u,component:t,container:l,mappings:g,inlinePartials:f,cssIds:p.cssIds}),d=!0,t.resolvers=v,s},Mm=fi,Lm=function(t){var e,n;for(e=t.root;e;)(n=e._liveComponentQueries["_"+t.name])&&n.push(t.instance),e=e.parent},jm=mi,Dm=gi,Nm=vi,Fm=bi,Im=yi,Bm=new is("teardown"),qm=xi,Um=function(t,e){this.init(t,e)};Um.prototype={detach:bh,find:_h,findAll:xh,findAllComponents:wh,findComponent:kh,findNextNode:Sh,firstNode:Eh,init:jm,rebind:Dm,render:Nm,toString:Fm,unbind:Im,unrender:qm};var Vm=Um,Gm=function(t){this.type=Ou,this.value=t.template.c};Gm.prototype={detach:vc,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createComment(this.value)),this.node},toString:function(){return""},unrender:function(t){t&&this.node.parentNode.removeChild(this.node)}};var zm=Gm,Wm=function(t){var e,n;this.type=Mu,this.container=e=t.parentFragment.root,this.component=n=e.component,this.container=e,this.containerFragment=t.parentFragment,this.parentFragment=n.parentFragment;var a=this.name=t.template.n||"",r=e._inlinePartials[a];r||(m('Could not find template for partial "'+a+'"',{ractive:t.root}),r=[]),this.fragment=new rg({owner:this,root:e.parent,template:r,pElement:this.containerFragment.pElement}),i(n.yielders[a])?n.yielders[a].push(this):n.yielders[a]=[this],bs.scheduleTask(function(){if(n.yielders[a].length>1)throw Error("A component template can only have one {{yield"+(a?" "+a:"")+"}} declaration at a time")})};Wm.prototype={detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},findNextNode:function(){return this.containerFragment.findNextNode(this)},firstNode:function(){return this.fragment.firstNode()},getValue:function(t){return this.fragment.getValue(t)},render:function(){return this.fragment.render()},unbind:function(){this.fragment.unbind()},unrender:function(t){this.fragment.unrender(t),N(this.component.yielders[this.name],this)},rebind:function(t,e){this.fragment.rebind(t,e)},toString:function(){return""+this.fragment}};var Hm=Wm,Km=function(t){this.declaration=t.template.a};Km.prototype={init:ko,render:ko,unrender:ko,teardown:ko,toString:function(){return""}};var Qm=Km,Ym=wi,$m=Si,Jm=Ei,Xm=Ci,Zm=Oi,tg=Ri,eg=function(t){this.init(t)};eg.prototype={bubble:cu,detach:lu,find:du,findAll:fu,findAllComponents:hu,findComponent:mu,findNextNode:gu,firstNode:vu,getArgsList:hc,getNode:mc,getValue:gc,init:Ym,rebind:$m,registerIndexRef:function(t){var e=this.registeredIndexRefs;-1===e.indexOf(t)&&e.push(t)},render:Jm,toString:Xm,unbind:Zm,unregisterIndexRef:function(t){var e=this.registeredIndexRefs;e.splice(e.indexOf(t),1)},unrender:tg};var ng,ag,rg=eg,ig=Mi,og=["template","partials","components","decorators","events"],sg=new is("reset"),pg=function(t,e){function n(e,a,r){r&&r.partials[t]||e.forEach(function(e){e.type===Au&&e.getPartialName()===t&&a.push(e),e.fragment&&n(e.fragment.items,a,r),i(e.fragments)?n(e.fragments,a,r):i(e.items)?n(e.items,a,r):e.type===Ru&&e.instance&&n(e.instance.fragment.items,a,e.instance),e.type===Pu&&(i(e.attributes)&&n(e.attributes,a,r),i(e.conditionalAttributes)&&n(e.conditionalAttributes,a,r))})}var a,r=[];return n(this.fragment.items,r),this.partials[t]=e,a=bs.start(this,!0),r.forEach(function(e){e.value=void 0,e.setValue(t)}),bs.end(),a},ug=Li,cg=_p("reverse"),lg=ji,dg=_p("shift"),fg=_p("sort"),hg=_p("splice"),mg=Ni,gg=Fi,vg=new is("teardown"),bg=Bi,yg=qi,_g=Ui,xg=new is("unrender"),wg=_p("unshift"),kg=Vi,Sg=new is("update"),Eg=Gi,Cg={add:Zo,animate:Ss,detach:Cs,find:As,findAll:Fs,findAllComponents:Is,findComponent:Bs,findContainer:qs,findParent:Us,fire:Ws,get:Hs,insert:Qs,merge:$s,observe:lp,observeOnce:dp,off:mp,on:gp,once:vp,pop:xp,push:wp,render:Tp,reset:ig,resetPartial:pg,resetTemplate:ug,reverse:cg,set:lg,shift:dg,sort:fg,splice:hg,subtract:mg,teardown:gg,toggle:bg,toHTML:yg,toHtml:yg,unrender:_g,unshift:wg,update:kg,updateModel:Eg},Pg=function(t,e,n){return n||Wi(t,e)?function(){var n,a="_super"in this,r=this._super;return this._super=e,n=t.apply(this,arguments),a&&(this._super=r),n}:t},Ag=Hi,Og=$i,Tg=function(t){var e,n,a={};return t&&(e=t._ractive)?(a.ractive=e.root,a.keypath=e.keypath.str,a.index={},(n=Oc(e.proxy.parentFragment))&&(a.index=Oc.resolve(n)),a):a};ng=function(t){return this instanceof ng?void Om(this,t):new ng(t)},ag={DEBUG:{writable:!0,value:!0},DEBUG_PROMISES:{writable:!0,value:!0},extend:{value:Og},getNodeInfo:{value:Tg},parse:{value:Hp},Promise:{value:us},svg:{value:ao},magic:{value:eo},VERSION:{value:"0.7.3"},adaptors:{writable:!0,value:{}},components:{writable:!0,value:{}},decorators:{writable:!0,value:{}},easing:{writable:!0,value:po},events:{writable:!0,value:{}},interpolators:{writable:!0,value:Vo},partials:{writable:!0,value:{}},transitions:{writable:!0,value:{}}},Co(ng,ag),ng.prototype=a(Cg,so),ng.prototype.constructor=ng,ng.defaults=ng.prototype;var Rg="function";if(typeof Date.now!==Rg||typeof String.prototype.trim!==Rg||typeof Object.keys!==Rg||typeof Array.prototype.indexOf!==Rg||typeof Array.prototype.forEach!==Rg||typeof Array.prototype.map!==Rg||typeof Array.prototype.filter!==Rg||"undefined"!=typeof window&&typeof window.addEventListener!==Rg)throw Error("It looks like you're attempting to use Ractive.js in an older browser. You'll need to use one of the 'legacy builds' in order to continue - see http://docs.ractivejs.org/latest/legacy-builds for more information.");var Mg=ng;return Mg})},{}],342:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.observe("value",function(e,n,a){var r=t.get(),i=r.min,o=r.max,s=Math.clamp(i,o,e);t.animate("percentage",Math.round((s-i)/(o-i)*100))})}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,305],t:7,e:"div",a:{"class":"bar"},f:[{p:[14,3,326],t:7,e:"div",a:{"class":["barFill ",{t:2,r:"state",p:[14,23,346]}],style:["width: ",{t:2,r:"percentage",p:[14,48,371]},"%"]}}," ",{p:[15,3,398],t:7,e:"span",a:{"class":"barText"},f:[{t:16,p:[15,25,420]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],343:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(482),a=t(481);e.exports={computed:{clickable:function(){return!this.get("enabled")||this.get("state")&&"toggle"!=this.get("state")?!1:!0},enabled:function(){return this.get("config.status")===n.UI_INTERACTIVE?!0:!1},styles:function(){var t="";if(this.get("class")&&(t+=" "+this.get("class")),this.get("tooltip-side")&&(t=" tooltip-"+this.get("tooltip-side")),this.get("grid")&&(t+=" gridable"),this.get("enabled")){var e=this.get("state"),n=this.get("style");return e?"inactive "+e+" "+t:"active normal "+n+" "+t}return"inactive disabled "+t}},oninit:function(){var t=this;this.on("press",function(e){var n=t.get(),r=n.action,i=n.params;(0,a.act)(t.get("config.ref"),r,i),e.node.blur()})},data:{iconStackToHTML:function(t){var e="",n=t.split(",");if(n.length){e+='';for(var a=n,r=Array.isArray(a),i=0,a=r?a:a[Symbol.iterator]();;){var o;if(r){if(i>=a.length)break;o=a[i++]}else{if(i=a.next(),i.done)break;o=i.value}var s=o,p=/([\w\-]+)\s*(\dx)/g,u=p.exec(s),c=u[1],l=u[2];e+=''}}return e&&(e+=""),e}}}}(r),r.exports.template={v:3,t:[" ",{p:[70,1,2019],t:7,e:"span",a:{"class":["button ",{t:2,r:"styles",p:[70,21,2039]}],unselectable:"on","data-tooltip":[{t:2,r:"tooltip",p:[73,17,2124]}]},m:[{t:4,f:["tabindex='0'"],r:"clickable",p:[72,3,2075]}],v:{"mouseover-mousemove":"hover",mouseleave:"unhover","click-enter":{n:[{t:4,f:["press"],r:"clickable",p:[76,19,2217]}],d:[]}},f:[{t:4,f:[{p:[78,5,2265],t:7,e:"i",a:{"class":["fa fa-",{t:2,r:"icon",p:[78,21,2281]}]}}],n:50,r:"icon",p:[77,3,2247]}," ",{t:4,f:[{t:3,x:{r:["iconStackToHTML","icon_stack"],s:"_0(_1)"},p:[81,6,2335]}],n:50,r:"icon_stack",p:[80,3,2310]}," ",{t:16,p:[83,3,2383]}]}]},e.exports=a.extend(r.exports)},{341:341,481:481,482:482}],344:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"display"},f:[{t:4,f:[{p:[3,5,44],t:7,e:"header",f:[{p:[4,7,60],t:7,e:"h3",f:[{t:2,r:"title",p:[4,11,64]}]}," ",{t:4,f:[{p:[6,9,110],t:7,e:"div",a:{"class":"buttonRight"},f:[{t:16,n:"button",p:[6,34,135]}]}],n:50,r:"button",p:[5,7,86]}]}],n:50,r:"title",p:[2,3,25]}," ",{p:[10,3,202],t:7,e:"article",f:[{t:16,p:[11,5,217]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],345:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.on("clear",function(){t.set("value",""),t.find("input").focus()})}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,170],t:7,e:"input",a:{type:"text",value:[{t:2,r:"value",p:[12,27,196]}],placeholder:[{t:2,r:"placeholder",p:[12,51,220]}]}}," ",{p:[13,1,240],t:7,e:"ui-button",a:{icon:"refresh"},v:{press:"clear"}}]},e.exports=a.extend(r.exports)},{341:341}],346:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";e.exports={data:{graph:t(338),xaccessor:function(t){return t.x},yaccessor:function(t){return t.y}},computed:{size:function(){var t=this.get("points");return t[0].length},scale:function(){var t=this.get("points");return Math.max.apply(Math,Array.map(t,function(t){return Math.max.apply(Math,Array.map(t,function(t){return t.y}))}))},xaxis:function(){var t=this.get("xinc"),e=this.get("size");return Array.from(Array(e).keys()).filter(function(e){return e&&e%t==0})},yaxis:function(){var t=this.get("yinc"),e=this.get("scale");return Array.from(Array(t).keys()).map(function(t){return Math.round(e*(++t/100)*10)})}},oninit:function(){var t=this;this.on({enter:function(t){this.set("selected",t.index.count)},exit:function(t){this.set("selected")}}),window.addEventListener("resize",function(e){t.set("width",t.el.clientWidth)})},onrender:function(){this.set("width",this.el.clientWidth)}}}(r),r.exports.template={v:3,t:[" ",{p:[47,1,1269],t:7,e:"svg",a:{"class":"linegraph",width:"100%",height:[{t:2,x:{r:["height"],s:"_0+10"},p:[47,45,1313]}]},f:[{p:[48,3,1334],t:7,e:"g",a:{transform:"translate(0, 5)"},f:[{t:4,f:[{t:4,f:[{p:[51,9,1504],t:7,e:"line",a:{x1:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,19,1514]}],x2:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,38,1533]}],y1:"0",y2:[{t:2,r:"height",p:[51,64,1559]}],stroke:"darkgray"}}," ",{t:4,f:[{p:[53,11,1635],t:7,e:"text",a:{x:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[53,20,1644]}],y:[{t:2,x:{r:["height"],s:"_0-5"},p:[53,38,1662]}],"text-anchor":"middle",fill:"white"},f:[{t:2,x:{r:["size",".","xfactor"],s:"(_0-_1)*_2"},p:[53,88,1712]}," ",{t:2,r:"xunit",p:[53,113,1737]}]}],n:50,x:{r:["@index"],s:"_0%2==0"},p:[52,9,1600]}],n:52,r:"xaxis",p:[50,7,1479]}," ",{t:4,f:[{p:[57,9,1820],t:7,e:"line",a:{x1:"0",x2:[{t:2,r:"width",p:[57,26,1837]}],y1:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,41,1852]}],y2:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,60,1871]}],stroke:"darkgray"}}," ",{p:[58,9,1915],t:7,e:"text",a:{x:"0",y:[{t:2,x:{r:["yscale","."],s:"_0(_1)-5"},p:[58,24,1930]}],"text-anchor":"begin",fill:"white"},f:[{t:2,x:{r:[".","yfactor"],s:"_0*_1"},p:[58,76,1982]}," ",{t:2,r:"yunit",p:[58,92,1998]}]}],n:52,r:"yaxis",p:[56,7,1795]}," ",{t:4,f:[{p:[61,9,2071],t:7,e:"path",a:{d:[{t:2,x:{r:["area.path"],s:"_0.print()"},p:[61,18,2080]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[61,47,2109]}],opacity:"0.1"}}],n:52,i:"curve",r:"curves",p:[60,7,2039]}," ",{t:4,f:[{p:[64,9,2200],t:7,e:"path",a:{d:[{t:2,x:{r:["line.path"],s:"_0.print()"},p:[64,18,2209]}],stroke:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[64,49,2240]}],fill:"none"}}],n:52, i:"curve",r:"curves",p:[63,7,2168]}," ",{t:4,f:[{t:4,f:[{p:[68,11,2375],t:7,e:"circle",a:{transform:["translate(",{t:2,r:".",p:[68,40,2404]},")"],r:[{t:2,x:{r:["selected","count"],s:"_0==_1?10:4"},p:[68,51,2415]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[68,89,2453]}]},v:{mouseenter:"enter",mouseleave:"exit"}}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[67,9,2329]}],n:52,i:"curve",r:"curves",p:[66,7,2297]}," ",{t:4,f:[{t:4,f:[{t:4,f:[{p:[74,13,2678],t:7,e:"text",a:{transform:["translate(",{t:2,r:".",p:[74,40,2705]},") ",{t:2,x:{r:["count","size"],s:'_0<=_1/2?"translate(15, 4)":"translate(-15, 4)"'},p:[74,47,2712]}],"text-anchor":[{t:2,x:{r:["count","size"],s:'_0<=_1/2?"start":"end"'},p:[74,126,2791]}],fill:"white"},f:[{t:2,x:{r:["count","item","yfactor"],s:"_1[_0].y*_2"},p:[75,15,2861]}," ",{t:2,r:"yunit",p:[75,43,2889]}," @ ",{t:2,x:{r:["size","count","item","xfactor"],s:"(_0-_2[_1].x)*_3"},p:[75,55,2901]}," ",{t:2,r:"xunit",p:[75,92,2938]}]}],n:50,x:{r:["selected","count"],s:"_0==_1"},p:[73,11,2638]}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[72,9,2592]}],n:52,i:"curve",r:"curves",p:[71,7,2560]}," ",{t:4,f:[{p:[81,9,3063],t:7,e:"g",a:{transform:["translate(",{t:2,x:{r:["width","curves.length","@index"],s:"(_0/(_1+1))*(_2+1)"},p:[81,33,3087]},", 10)"]},f:[{p:[82,11,3154],t:7,e:"circle",a:{r:"4",fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[82,31,3174]}]}}," ",{p:[83,11,3206],t:7,e:"text",a:{x:"8",y:"4",fill:"white"},f:[{t:2,rx:{r:"legend",m:[{t:30,n:"curve"}]},p:[83,42,3237]}]}]}],n:52,i:"curve",r:"curves",p:[80,7,3031]}],x:{r:["graph","points","xaccessor","yaccessor","width","height"],s:"_0({data:_1,xaccessor:_2,yaccessor:_3,width:_4,height:_5})"},p:[49,5,1371]}]}]}]},e.exports=a.extend(r.exports)},{338:338,341:341}],347:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"notice"},f:[{t:16,p:[2,3,24]}]}]},e.exports=a.extend(r.exports)},{341:341}],348:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(481),a=t(483);e.exports={oninit:function(){var t=this,e=a.resize.bind(this),r=function(){return t.set({resize:!1,x:null,y:null})};this.observe("config.fancy",function(a,i,o){(0,n.winset)(t.get("config.window"),"can-resize",!a),a?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",r)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",r))}),this.on("resize",function(){return t.toggle("resize")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[28,3,766],t:7,e:"div",a:{"class":"resize"},v:{mousedown:"resize"}}],n:50,r:"config.fancy",p:[27,1,742]}]},e.exports=a.extend(r.exports)},{341:341,481:481,483:483}],349:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"section",a:{"class":[{t:4,f:["candystripe"],r:"candystripe",p:[1,17,16]}]},f:[{t:4,f:[{p:[3,5,84],t:7,e:"span",a:{"class":"label",style:[{t:4,f:["color:",{t:2,r:"labelcolor",p:[3,53,132]}],r:"labelcolor",p:[3,32,111]}]},f:[{t:2,r:"label",p:[3,84,163]},":"]}],n:50,r:"label",p:[2,3,65]}," ",{t:4,f:[{t:16,p:[6,5,215]}],n:50,r:"nowrap",p:[5,3,195]},{t:4,n:51,f:[{p:[8,5,242],t:7,e:"div",a:{"class":"content",style:[{t:4,f:["float:right;"],r:"right",p:[8,33,270]}]},f:[{t:16,p:[9,7,312]}]}],r:"nowrap"}]}]},e.exports=a.extend(r.exports)},{341:341}],350:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"subdisplay"},f:[{t:4,f:[{p:[3,5,47],t:7,e:"header",f:[{p:[4,7,63],t:7,e:"h4",f:[{t:2,r:"title",p:[4,11,67]}]}," ",{t:4,f:[{t:16,n:"button",p:[5,21,103]}],n:50,r:"button",p:[5,7,89]}]}],n:50,r:"title",p:[2,3,28]}," ",{p:[8,3,156],t:7,e:"article",f:[{t:16,p:[9,5,171]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],351:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.set("active",this.findComponent("tab").get("name")),this.on("switch",function(e){t.set("active",e.node.textContent.trim())}),this.observe("active",function(e,n,a){for(var r=t.findAllComponents("tab"),i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;p.set("shown",p.get("name")===e)}})}}}(r),r.exports.template={v:3,t:[" "," ",{p:[20,1,524],t:7,e:"header",f:[{t:4,f:[{p:[22,5,556],t:7,e:"ui-button",a:{pane:[{t:2,r:".",p:[22,22,573]}]},v:{press:"switch"},f:[{t:2,r:".",p:[22,47,598]}]}],n:52,r:"tabs",p:[21,3,536]}]}," ",{p:[25,1,641],t:7,e:"ui-display",f:[{t:8,r:"content",p:[26,3,657]}]}]},r.exports.components=r.exports.components||{};var i={tab:t(352)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,352:352}],352:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:16,p:[2,3,17]}],n:50,r:"shown",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],353:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(482),a=t(481),r=t(483);e.exports={computed:{visualStatus:function(){switch(this.get("config.status")){case n.UI_INTERACTIVE:return"good";case n.UI_UPDATE:return"average";case n.UI_DISABLED:return"bad";default:return"bad"}}},oninit:function(){var t=this,e=r.drag.bind(this),n=function(e){return t.set({drag:!1,x:null,y:null})};this.observe("config.fancy",function(r,i,o){(0,a.winset)(t.get("config.window"),"titlebar",!r&&t.get("config.titlebar")),r?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",n)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",n))}),this.on({drag:function(){this.toggle("drag")},close:function(){(0,a.winset)(this.get("config.window"),"is-visible",!1),window.location.href=(0,a.href)({command:"uiclose "+this.get("config.ref")},"winset")},minimize:function(){(0,a.winset)(this.get("config.window"),"is-minimized",!0)}})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[50,3,1440],t:7,e:"header",a:{"class":"titlebar"},v:{mousedown:"drag"},f:[{p:[51,5,1491],t:7,e:"i",a:{"class":["statusicon fa fa-eye fa-2x ",{t:2,r:"visualStatus",p:[51,42,1528]}]}}," ",{p:[52,5,1556],t:7,e:"span",a:{"class":"title"},f:[{t:16,p:[52,25,1576]}]}," ",{t:4,f:[{p:[54,7,1626],t:7,e:"i",a:{"class":"minimize fa fa-minus fa-2x"},v:{click:"minimize"}}," ",{p:[55,7,1696],t:7,e:"i",a:{"class":"close fa fa-close fa-2x"},v:{click:"close"}}],n:50,r:"config.fancy",p:[53,5,1598]}]}],n:50,r:"config.titlebar",p:[49,1,1413]}]},e.exports=a.extend(r.exports)},{341:341,481:481,482:482,483:483}],354:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";var e=[11,10,9,8];t.exports={data:{userAgent:navigator.userAgent},computed:{ie:function(){if(document.documentMode)return document.documentMode;for(var t in e){var n=document.createElement("div");if(n.innerHTML="",n.getElementsByTagName("span").length)return t}}},oninit:function(){var t=this;this.on("debug",function(){return t.toggle("debug")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[27,3,662],t:7,e:"ui-notice",f:[{p:[28,5,679],t:7,e:"span",f:["You have an old (IE",{t:2,r:"ie",p:[28,30,704]},"), end-of-life (click 'EOL Info' for more information) version of Internet Explorer installed."]},{p:[28,137,811],t:7,e:"br"}," ",{p:[29,5,822],t:7,e:"span",f:["To upgrade, click 'Upgrade IE' to download IE11 from Microsoft."]},{p:[29,81,898],t:7,e:"br"}," ",{p:[30,5,909],t:7,e:"span",f:["If you are unable to upgrade directly, click 'IE VMs' to download a VM with IE11 or Edge from Microsoft."]},{p:[30,122,1026],t:7,e:"br"}," ",{p:[31,5,1037],t:7,e:"span",f:["Otherwise, click 'No Frills' below to disable potentially incompatible features (and this message)."]}," ",{p:[32,5,1155],t:7,e:"hr"}," ",{p:[33,5,1166],t:7,e:"ui-button",a:{icon:"close",action:"tgui:nofrills"},f:["No Frills"]}," ",{p:[34,5,1240],t:7,e:"ui-button",a:{icon:"internet-explorer",action:"tgui:link",params:'{"url": "http://windows.microsoft.com/en-us/internet-explorer/download-ie"}'},f:["Upgrade IE"]}," ",{p:[36,5,1416],t:7,e:"ui-button",a:{icon:"edge",action:"tgui:link",params:'{"url": "https://dev.windows.com/en-us/microsoft-edge/tools/vms"}'},f:["IE VMs"]}," ",{p:[38,5,1565],t:7,e:"ui-button",a:{icon:"info",action:"tgui:link",params:'{"url": "https://support.microsoft.com/en-us/lifecycle#gp/Microsoft-Internet-Explorer"}'},f:["EOL Info"]}," ",{p:[40,5,1738],t:7,e:"ui-button",a:{icon:"bug"},v:{press:"debug"},f:["Debug Info"]}," ",{t:4,f:[{p:[42,7,1826],t:7,e:"hr"}," ",{p:[43,7,1839],t:7,e:"span",f:["Detected: IE",{t:2,r:"ie",p:[43,25,1857]}]},{p:[43,38,1870],t:7,e:"br"}," ",{p:[44,7,1883],t:7,e:"span",f:["User Agent: ",{t:2,r:"userAgent",p:[44,25,1901]}]}],n:50,r:"debug",p:[41,5,1805]}]}],n:50,x:{r:["config.fancy","ie"],s:"_0&&_1&&_1<11"},p:[26,1,621]}]},e.exports=a.extend(r.exports)},{341:341}],355:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},shockState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[22,1,348],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[23,2,384],t:7,e:"ui-section",a:{label:"Main"},f:[{p:[24,3,413],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.power.main"],s:"_0(_1)"},p:[24,16,426]}]},f:[{t:2,x:{r:["data.power.main"],s:'_0?"Online":"Offline"'},p:[24,49,459]}]}," ",{t:4,f:["[ ",{p:[26,6,567],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.main_1","data.wires.main_2"],s:"!_0||!_1"},p:[25,3,512]},{t:4,n:51,f:[{t:4,f:["[ ",{t:2,r:"data.power.main_timeleft",p:[29,7,674]}," seconds left ]"],n:50,x:{r:["data.power.main_timeleft"],s:"_0>0"},p:[28,4,630]}],x:{r:["data.wires.main_1","data.wires.main_2"],s:"!_0||!_1"}}," ",{p:[32,3,744],t:7,e:"div",a:{style:"float:right"},f:[{p:[33,4,774],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"disrupt-main",state:[{t:2,x:{r:["data.power.main"],s:'_0?null:"disabled"'},p:[33,63,833]}]},f:["Disrupt"]}]}]}," ",{p:[36,2,922],t:7,e:"ui-section",a:{label:"Backup"},f:[{p:[37,3,953],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.power.backup"],s:"_0(_1)"},p:[37,16,966]}]},f:[{t:2,x:{r:["data.power.backup"],s:'_0?"Online":"Offline"'},p:[37,51,1001]}]}," ",{t:4,f:["[ ",{p:[39,6,1115],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.backup_1","data.wires.backup_2"],s:"!_0||!_1"},p:[38,3,1056]},{t:4,n:51,f:[{t:4,f:["[ ",{t:2,r:"data.power.backup_timeleft",p:[42,7,1224]}," seconds left ]"],n:50,x:{r:["data.power.backup_timeleft"],s:"_0>0"},p:[41,4,1178]}],x:{r:["data.wires.backup_1","data.wires.backup_2"],s:"!_0||!_1"}}," ",{p:[45,3,1296],t:7,e:"div",a:{style:"float:right"},f:[{p:[46,4,1326],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"disrupt-backup",state:[{t:2,x:{r:["data.power.backup"],s:'_0?null:"disabled"'},p:[46,65,1387]}]},f:["Disrupt"]}]}]}," ",{p:[49,2,1478],t:7,e:"ui-section",a:{label:"Electrify"},f:[{p:[50,3,1512],t:7,e:"span",a:{"class":[{t:2,x:{r:["shockState","data.shock"],s:"_0(_1)"},p:[50,16,1525]}]},f:[{t:2,x:{r:["data.shock"],s:'_0==2?"Safe":"Electrified"'},p:[50,44,1553]}]}," ",{t:4,f:["[ ",{p:[52,6,1640],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.shock"],s:"!_0"},p:[51,3,1608]},{t:4,n:51,f:[{t:4,f:["[ ",{p:[55,7,1742],t:7,e:"span",a:{"class":"bad"},f:[{t:2,r:"data.shock_timeleft",p:[55,25,1760]}," seconds left"]}," ]"],n:50,x:{r:["data.shock_timeleft"],s:"_0>0"},p:[54,4,1703]}," ",{t:4,f:["[ ",{p:[58,7,1863],t:7,e:"span",a:{"class":"bad"},f:["Permanent"]}," ]"],n:50,x:{r:["data.shock_timeleft"],s:"_0==-1"},p:[57,4,1822]}],x:{r:["data.wires.shock"],s:"!_0"}}," ",{p:[61,3,1926],t:7,e:"div",a:{style:"float:right"},f:[{p:[62,4,1956],t:7,e:"ui-button",a:{icon:"wrench",action:"shock-restore",state:[{t:2,x:{r:["data.wires.shock","data.shock"],s:'_0&&_1==0?null:"disabled"'},p:[62,59,2011]}]},f:["Restore"]}," ",{p:[63,4,2094],t:7,e:"ui-button",a:{icon:"bolt",action:"shock-temp",state:[{t:2,x:{r:["data.wires.shock"],s:"!_0"},p:[63,54,2144]}]},f:["Set (Temporary)"]}," ",{p:[64,4,2199],t:7,e:"ui-button",a:{icon:"bolt",action:"shock-perm",state:[{t:2,x:{r:["data.wires.shock"],s:"!_0"},p:[64,53,2248]}]},f:["Set (Permanent)"]}]}]}]}," ",{p:[68,1,2341],t:7,e:"ui-display",a:{title:"Access & Door Control"},f:[{p:[69,2,2386],t:7,e:"ui-section",a:{label:"ID Scan"},f:[{t:4,f:["[ ",{p:[71,6,2455],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[70,3,2418]}," ",{p:[73,3,2516],t:7,e:"div",a:{style:"float:right"},f:[{p:[74,4,2546],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[74,22,2564]}],icon:"power-off",action:"idscan-on",style:[{t:2,x:{r:["data.id_scanner"],s:'_0?"selected":""'},p:[74,93,2635]}]},f:["Enabled"]}," ",{p:[75,4,2698],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[75,22,2716]}],icon:"close",action:"idscan-off",style:[{t:2,x:{r:["data.id_scanner"],s:'_0?"":"selected"'},p:[75,90,2784]}]},f:["Disabled"]}]}]}," ",{p:[78,2,2872],t:7,e:"ui-section",a:{label:"Emergency Access"},f:[{p:[79,3,2913],t:7,e:"div",a:{style:"float:right"},f:[{p:[80,4,2943],t:7,e:"ui-button",a:{icon:"power-off",action:"emergency-on",style:[{t:2,x:{r:["data.emergency"],s:'_0?"selected":""'},p:[80,61,3e3]}]},f:["Enabled"]}," ",{p:[81,4,3062],t:7,e:"ui-button",a:{icon:"close",action:"emergency-off",style:[{t:2,x:{r:["data.emergency"],s:'_0?"":"selected"'},p:[81,58,3116]}]},f:["Disabled"]}]}]}," ",{p:[84,2,3203],t:7,e:"br"}," ",{p:[85,2,3212],t:7,e:"ui-section",a:{label:"Door bolts"},f:[{t:4,f:["[ ",{p:[87,6,3279],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.bolts"],s:"!_0"},p:[86,3,3247]}," ",{p:[89,3,3340],t:7,e:"div",a:{style:"float:right"},f:[{p:[90,4,3370],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.bolts"],s:"!_0"},p:[90,22,3388]}],icon:"unlock",action:"bolt-raise",style:[{t:2,x:{r:["data.locked"],s:'_0?"":"selected"'},p:[90,85,3451]}]},f:["Raised"]}," ",{p:[91,4,3509],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.bolts"],s:"!_0"},p:[91,22,3527]}],icon:"lock",action:"bolt-drop",style:[{t:2,x:{r:["data.locked"],s:'_0?"selected":""'},p:[91,82,3587]}]},f:["Dropped"]}]}]}," ",{p:[94,2,3670],t:7,e:"ui-section",a:{label:"Door bolt lights"},f:[{t:4,f:["[ ",{p:[96,6,3744],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.lights"],s:"!_0"},p:[95,3,3711]}," ",{p:[98,3,3805],t:7,e:"div",a:{style:"float:right"},f:[{p:[99,4,3835],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.lights"],s:"!_0"},p:[99,22,3853]}],icon:"power-off",action:"light-on",style:[{t:2,x:{r:["data.lights"],s:'_0?"selected":""'},p:[99,88,3919]}]},f:["Enabled"]}," ",{p:[100,4,3978],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.lights"],s:"!_0"},p:[100,22,3996]}],icon:"close",action:"light-off",style:[{t:2,x:{r:["data.lights"],s:'_0?"":"selected"'},p:[100,85,4059]}]},f:["Disabled"]}]}]}," ",{p:[103,2,4143],t:7,e:"ui-section",a:{label:"Door force sensors"},f:[{t:4,f:["[ ",{p:[105,6,4217],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.safe"],s:"!_0"},p:[104,3,4186]}," ",{p:[107,3,4278],t:7,e:"div",a:{style:"float:right"},f:[{p:[108,4,4308],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.safe"],s:"!_0"},p:[108,22,4326]}],icon:"power-off",action:"safe-on",style:[{t:2,x:{r:["data.safe"],s:'_0?"selected":""'},p:[108,85,4389]}]},f:["Enabled"]}," ",{p:[109,4,4446],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.safe"],s:"!_0"},p:[109,22,4464]}],icon:"close",action:"safe-off",style:[{t:2,x:{r:["data.safe"],s:'_0?"":"selected"'},p:[109,82,4524]}]},f:["Disabled"]}]}]}," ",{p:[112,2,4606],t:7,e:"ui-section",a:{label:"Door timing safety"},f:[{t:4,f:["[ ",{p:[114,6,4682],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.timing"],s:"!_0"},p:[113,3,4649]}," ",{p:[116,3,4743],t:7,e:"div",a:{style:"float:right"},f:[{p:[117,4,4773],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.timing"],s:"!_0"},p:[117,22,4791]}],icon:"power-off",action:"speed-on",style:[{t:2,x:{r:["data.speed"],s:'_0?"selected":""'},p:[117,88,4857]}]},f:["Enabled"]}," ",{p:[118,4,4915],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.timing"],s:"!_0"},p:[118,22,4933]}],icon:"close",action:"speed-off",style:[{t:2,x:{r:["data.speed"],s:'_0?"":"selected"'},p:[118,85,4996]}]},f:["Disabled"]}]}]}," ",{p:[121,2,5079],t:7,e:"br"}," ",{p:[122,2,5088],t:7,e:"ui-section",a:{label:"Door control"},f:[{t:4,f:["[ ",{p:[124,6,5166],t:7,e:"span",a:{"class":"bad"},f:["Door is ",{t:2,x:{r:["data.locked","data.welded"],s:'(_0?"bolted":"")+(_0&&_1?" and ":"")+(_1?"welded":"")'},p:[124,32,5192]}]}," ]"],n:50,x:{r:["data.locked","data.welded"],s:"_0||_1"},p:[123,3,5125]}," ",{p:[126,3,5327],t:7,e:"div",a:{style:"float:right"},f:[{p:[127,4,5357],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.locked","data.welded","data.opened"],s:'(_0||_1)||(_2&&"disabled")'},p:[127,22,5375]}],icon:"sign-out",action:"open-close"},f:["Open door"]}," ",{p:[128,4,5502],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.locked","data.welded","data.opened"],s:'(_0||_1)||(!_2&&"disabled")'},p:[128,22,5520]}],icon:"sign-in",action:"open-close"},f:["Close door"]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],356:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," ",{p:[7,1,267],t:7,e:"ui-notice",f:[{t:4,f:[{p:[9,5,312],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[10,7,355],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[10,24,372]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[10,75,423]}]}]}],n:50,r:"data.siliconUser",p:[8,3,282]},{t:4,n:51,f:[{p:[13,5,514],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,31,540]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[16,1,625],t:7,e:"status"}," ",{t:4,f:[{t:4,f:[{p:[19,7,719],t:7,e:"ui-display",a:{title:"Air Controls"},f:[{p:[20,9,762],t:7,e:"ui-section",f:[{p:[21,11,786],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"exclamation-triangle":"exclamation"'},p:[21,28,803]}],style:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"caution":null'},p:[21,98,873]}],action:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"reset":"alarm"'},p:[22,23,937]}]},f:["Area Atmosphere Alarm"]}]}," ",{p:[24,9,1045],t:7,e:"ui-section",f:[{p:[25,11,1069],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==3?"exclamation-triangle":"exclamation"'},p:[25,28,1086]}],style:[{t:2,x:{r:["data.mode"],s:'_0==3?"danger":null'},p:[25,96,1154]}],action:"mode",params:['{"mode": ',{t:2,x:{r:["data.mode"],s:"_0==3?1:3"},p:[26,44,1236]},"}"]},f:["Panic Siphon"]}]}," ",{p:[28,9,1322],t:7,e:"br"}," ",{p:[29,9,1337],t:7,e:"ui-section",f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:"sign-out",action:"tgui:view",params:'{"screen": "vents"}'},f:["Vent Controls"]}]}," ",{p:[32,9,1494],t:7,e:"ui-section",f:[{p:[33,11,1518],t:7,e:"ui-button",a:{icon:"filter",action:"tgui:view",params:'{"screen": "scrubbers"}'},f:["Scrubber Controls"]}]}," ",{p:[35,9,1657],t:7,e:"ui-section",f:[{p:[36,11,1681],t:7,e:"ui-button",a:{icon:"cog",action:"tgui:view",params:'{"screen": "modes"}'},f:["Operating Mode"]}]}," ",{p:[38,9,1810],t:7,e:"ui-section",f:[{p:[39,11,1834],t:7,e:"ui-button",a:{icon:"bar-chart",action:"tgui:view",params:'{"screen": "thresholds"}'},f:["Alarm Thresholds"]}]}]}],n:50,x:{r:["config.screen"],s:'_0=="home"'},p:[18,3,680]},{t:4,n:51,f:[{t:4,n:50,x:{r:["config.screen"],s:'_0=="vents"'},f:[{p:[43,5,2032],t:7,e:"vents"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&(_0=="scrubbers")'},f:[" ",{p:[45,5,2089],t:7,e:"scrubbers"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&(_0=="modes"))'},f:[" ",{p:[47,5,2146],t:7,e:"modes"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&((!(_0=="modes"))&&(_0=="thresholds")))'},f:[" ",{p:[49,5,2204],t:7,e:"thresholds"}]}],x:{r:["config.screen"],s:'_0=="home"'}}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[17,1,636]}]},r.exports.components=r.exports.components||{};var i={vents:t(362),modes:t(358),thresholds:t(361),status:t(360),scrubbers:t(359)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,358:358,359:359,360:360,361:361,362:362}],357:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-button",a:{icon:"arrow-left",action:"tgui:view",params:'{"screen": "home"}'},f:["Back"]}]},e.exports=a.extend(r.exports)},{341:341}],358:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,115],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Operating Modes",button:0},f:[" ",{t:4,f:[{p:[8,5,168],t:7,e:"ui-section",f:[{p:[9,7,188],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["selected"],s:'_0?"check-square-o":"square-o"'},p:[9,24,205]}],state:[{t:2,x:{r:["selected","danger"],s:'_0?_1?"danger":"selected":null'},p:[10,16,267]}],action:"mode",params:['{"mode": ',{t:2,r:"mode",p:[11,40,361]},"}"]},f:[{t:2,r:"name",p:[11,51,372]}]}]}],n:52,r:"data.modes",p:[7,3,142]}]}]},r.exports.components=r.exports.components||{};var i={back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357}],359:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," ",{p:{button:[{p:[6,5,185],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Scrubber Controls",button:0},f:[" ",{t:4,f:[{p:[9,5,242],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[9,27,264]}]},f:[{p:[10,7,287],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,323],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[11,26,340]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[11,68,382]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[12,46,459]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[12,66,479]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[12,80,493]}]}]}," ",{p:[14,7,558],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[15,9,593],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["scrubbing"],s:'_0?"filter":"sign-in"'},p:[15,26,610]}],style:[{t:2,x:{r:["scrubbing"],s:'_0?null:"danger"'},p:[15,71,655]}],action:"scrubbing",params:['{"id_tag": "',{t:2,r:"id_tag",p:[16,50,738]},'", "val": ',{t:2,x:{r:["scrubbing"],s:"+!_0"},p:[16,70,758]},"}"]},f:[{t:2,x:{r:["scrubbing"],s:'_0?"Scrubbing":"Siphoning"'},p:[16,88,776]}]}]}," ",{p:[18,7,858],t:7,e:"ui-section",a:{label:"Range"},f:[{p:[19,9,894],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["widenet"],s:'_0?"expand":"compress"'},p:[19,26,911]}],style:[{t:2,x:{r:["widenet"],s:'_0?"selected":null'},p:[19,70,955]}],action:"widenet",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,1036]},'", "val": ',{t:2,x:{r:["widenet"],s:"+!_0"},p:[20,68,1056]},"}"]},f:[{t:2,x:{r:["widenet"],s:'_0?"Expanded":"Normal"'},p:[20,84,1072]}]}]}," ",{p:[22,7,1148],t:7,e:"ui-section",a:{label:"Filters"},f:[{p:[23,9,1186],t:7,e:"filters"}]}]}],n:52,r:"data.scrubbers",p:[8,3,212]},{t:4,n:51,f:[{p:[27,5,1257],t:7,e:"span",a:{"class":"bad"},f:["Error: No scrubbers connected."]}],r:"data.scrubbers"}]}]},r.exports.components=r.exports.components||{};var i={filters:t(457),back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357,457:457}],360:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Air Status"},f:[{t:4,f:[{t:4,f:[{p:[4,7,110],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[4,26,129]}]},f:[{p:[5,6,146],t:7,e:"span",a:{"class":[{t:2,x:{r:["danger_level"],s:'_0==2?"bad":_0==1?"average":"good"'},p:[5,19,159]}]},f:[{t:2,x:{r:["value"],s:"Math.fixed(_0,2)"},p:[6,5,237]},{t:2,r:"unit",p:[6,29,261]}]}]}],n:52,r:"adata.environment_data",p:[3,5,70]}," ",{p:[10,5,322],t:7,e:"ui-section",a:{label:"Local Status"},f:[{p:[11,7,363],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.danger_level"],s:'_0==2?"bad bold":_0==1?"average bold":"good"'},p:[11,20,376]}]},f:[{t:2,x:{r:["data.danger_level"],s:'_0==2?"Danger (Internals Required)":_0==1?"Caution":"Optimal"'},p:[12,6,475]}]}]}," ",{p:[15,5,619],t:7,e:"ui-section",a:{label:"Area Status"},f:[{p:[16,7,659],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.atmos_alarm","data.fire_alarm"],s:'_0||_1?"bad bold":"good"'},p:[16,20,672]}]},f:[{t:2,x:{r:["data.atmos_alarm","fire_alarm"],s:'_0?"Atmosphere Alarm":_1?"Fire Alarm":"Nominal"'},p:[17,8,744]}]}]}],n:50,r:"data.environment_data",p:[2,3,35]},{t:4,n:51,f:[{p:[21,5,876],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[22,7,912],t:7,e:"span",a:{"class":"bad bold"},f:["Cannot obtain air sample for analysis."]}]}],r:"data.environment_data"}," ",{t:4,f:[{p:[26,5,1040],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[27,7,1076],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[25,3,1014]}]}]},e.exports=a.extend(r.exports)},{341:341}],361:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.css=" th, td {\r\n padding-right: 16px;\r\n text-align: left;\r\n }",r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,116],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Alarm Thresholds",button:0},f:[" ",{p:[7,3,143],t:7,e:"table",f:[{p:[8,5,156],t:7,e:"thead",f:[{p:[8,12,163],t:7,e:"tr",f:[{p:[9,7,175],t:7,e:"th"}," ",{p:[10,7,192],t:7,e:"th",f:[{p:[10,11,196],t:7,e:"span",a:{"class":"bad"},f:["min2"]}]}," ",{p:[11,7,238],t:7,e:"th",f:[{p:[11,11,242],t:7,e:"span",a:{"class":"average"},f:["min1"]}]}," ",{p:[12,7,288],t:7,e:"th",f:[{p:[12,11,292],t:7,e:"span",a:{"class":"average"},f:["max1"]}]}," ",{p:[13,7,338],t:7,e:"th",f:[{p:[13,11,342],t:7,e:"span",a:{"class":"bad"},f:["max2"]}]}]}]}," ",{p:[15,5,401],t:7,e:"tbody",f:[{t:4,f:[{p:[16,32,441],t:7,e:"tr",f:[{p:[17,9,455],t:7,e:"th",f:[{t:3,r:"name",p:[17,13,459]}]}," ",{t:4,f:[{p:[18,27,502],t:7,e:"td",f:[{p:[19,11,518],t:7,e:"ui-button",a:{action:"threshold",params:['{"env": "',{t:2,r:"env",p:[19,58,565]},'", "var": "',{t:2,r:"val",p:[19,76,583]},'"}']},f:[{t:2,x:{r:["selected"],s:"Math.fixed(_0,2)"},p:[19,87,594]}]}]}],n:52,r:"settings",p:[18,9,484]}]}],n:52,r:"data.thresholds",p:[16,7,416]}]}," ",{p:[23,3,697],t:7,e:"table",f:[]}]}]}," "]},r.exports.components=r.exports.components||{};var i={back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357}],362:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,113],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Vent Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,166],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,188]}]},f:[{p:[9,7,211],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,264]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,306]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,383]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,403]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,417]}]}]}," ",{p:[13,7,482],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,517],t:7,e:"span",f:[{t:2,x:{r:["direction"],s:'_0=="release"?"Pressurizing":"Siphoning"'},p:[14,15,523]}]}]}," ",{p:[16,7,616],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[17,9,665],t:7,e:"ui-button",a:{icon:"sign-in",style:[{t:2,x:{r:["incheck"],s:'_0?"selected":null'},p:[17,42,698]}],action:"incheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[18,48,779]},'", "val": ',{t:2,r:"checks",p:[18,68,799]},"}"]},f:["Internal"]}," ",{p:[19,9,842],t:7,e:"ui-button",a:{icon:"sign-out",style:[{t:2,x:{r:["excheck"],s:'_0?"selected":null'},p:[19,43,876]}],action:"excheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,957]},'", "val": ',{t:2,r:"checks",p:[20,68,977]},"}"]},f:["External"]}]}," ",{t:4,f:[{p:[23,9,1064],t:7,e:"ui-section",a:{label:"Internal Target Pressure"},f:[{p:[24,11,1121],t:7,e:"ui-button",a:{icon:"pencil",action:"set_internal_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[25,33,1210]},'"}']},f:[{t:2,x:{r:["internal"],s:"Math.fixed(_0)"},p:[25,47,1224]}]}," ",{p:[26,11,1272],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["intdefault"],s:'_0?"disabled":null'},p:[26,44,1305]}],action:"reset_internal_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[27,33,1407]},'"}']},f:["Reset"]}]}],n:50,r:"incheck",p:[22,7,1039]}," ",{t:4,f:[{p:[31,11,1511],t:7,e:"ui-section",a:{label:"External Target Pressure"},f:[{p:[32,13,1570],t:7,e:"ui-button",a:{icon:"pencil",action:"set_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[33,35,1661]},'"}']},f:[{t:2,x:{r:["external"],s:"Math.fixed(_0)"},p:[33,49,1675]}]}," ",{p:[34,13,1725],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["extdefault"],s:'_0?"disabled":null'},p:[34,46,1758]}],action:"reset_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[35,35,1862]},'"}']},f:["Reset"]}]}],n:50,r:"excheck",p:[30,7,1484]}]}],n:52,r:"data.vents",p:[7,3,140]},{t:4,n:51,f:[{p:[40,5,1973],t:7,e:"span",a:{"class":"bad"},f:["Error: No vents connected."]}],r:"data.vents"}]}]},r.exports.components=r.exports.components||{};var i={back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357}],363:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.css=" table {\r\n width: 100%;\r\n border-spacing: 2px;\r\n }\r\n th {\r\n text-align: left;\r\n }\r\n td {\r\n vertical-align: top;\r\n }\r\n td .button {\r\n margin-top: 4px\r\n }",r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",f:[{p:[3,5,34],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oneAccess"],s:'_0?"unlock":"lock"'},p:[3,22,51]}],action:"one_access"},f:[{t:2,x:{r:["data.oneAccess"],s:'_0?"One":"All"'},p:[3,82,111]}," Required"]}," ",{p:[4,5,172],t:7,e:"ui-button",a:{icon:"refresh",action:"clear"},f:["Clear"]}]}," ",{p:[6,3,251],t:7,e:"hr"}," ",{p:[7,3,260],t:7,e:"table",f:[{p:[8,3,271],t:7,e:"thead",f:[{p:[9,4,283],t:7,e:"tr",f:[{t:4,f:[{p:[10,5,315],t:7,e:"th",f:[{p:[10,9,319],t:7,e:"span",a:{"class":"highlight bold"},f:[{t:2,r:"name",p:[10,38,348]}]}]}],n:52,r:"data.regions",p:[9,8,287]}]}]}," ",{p:[13,3,403],t:7,e:"tbody",f:[{p:[14,4,415],t:7,e:"tr",f:[{t:4,f:[{p:[15,5,447],t:7,e:"td",f:[{t:4,f:[{p:[16,11,481],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["req"],s:'_0?"check-square-o":"square-o"'},p:[16,28,498]}],style:[{t:2,x:{r:["req"],s:'_0?"selected":null'},p:[16,76,546]}],action:"set",params:['{"access": "',{t:2,r:"id",p:[17,46,621]},'"}']},f:[{t:2,r:"name",p:[17,56,631]}]}," ",{p:[18,9,661],t:7,e:"br"}],n:52,r:"accesses",p:[15,9,451]}]}],n:52,r:"data.regions",p:[14,8,419]}]}]}]}," ",{p:[23,2,731],t:7,e:"hr"}," ",{p:[24,2,739],t:7,e:"span",a:{"class":"highlight bold"},f:["Unrestricted Access:"]}," ",{p:[25,2,798],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&1?"check-square-o":"square-o"'},p:[25,19,815]}],style:[{t:2,x:{r:["data.unres_direction"],s:'_0&1?"selected":null'},p:[25,88,884]}],action:"direc_set",params:'{"unres_direction": "1"}'},f:["North"]}," ",{p:[26,2,1007],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&4?"check-square-o":"square-o"'},p:[26,19,1024]}],style:[{t:2,x:{r:["data.unres_direction"],s:'_0&4?"selected":null'},p:[26,88,1093]}],action:"direc_set",params:'{"unres_direction": "4"}'},f:["East"]}," ",{p:[27,2,1215],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&2?"check-square-o":"square-o"'},p:[27,19,1232]}],style:[{t:2,x:{r:["data.unres_direction"], s:'_0&2?"selected":null'},p:[27,88,1301]}],action:"direc_set",params:'{"unres_direction": "2"}'},f:["South"]}," ",{p:[28,2,1424],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&8?"check-square-o":"square-o"'},p:[28,19,1441]}],style:[{t:2,x:{r:["data.unres_direction"],s:'_0&8?"selected":null'},p:[28,88,1510]}],action:"direc_set",params:'{"unres_direction": "8"}'},f:["West"]}]}," "]},e.exports=a.extend(r.exports)},{341:341}],364:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}},computed:{malfAction:function(){switch(this.get("data.malfStatus")){case 1:return"hack";case 2:return"occupy";case 3:return"deoccupy"}},malfButton:function(){switch(this.get("data.malfStatus")){case 1:return"Override Programming";case 2:case 4:return"Shunt Core Process";case 3:return"Return to Main Core"}},malfIcon:function(){switch(this.get("data.malfStatus")){case 1:return"terminal";case 2:case 4:return"caret-square-o-down";case 3:return"caret-square-o-left"}},powerCellStatusState:function(){var t=this.get("data.powerCellStatus");return t>50?"good":t>25?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[46,2,1206],t:7,e:"ui-notice",f:[{p:[47,3,1221],t:7,e:"b",f:[{p:[47,6,1224],t:7,e:"h3",f:["SYSTEM FAILURE"]}]}," ",{p:[48,3,1255],t:7,e:"i",f:["I/O regulators malfunction detected! Waiting for system reboot..."]},{p:[48,75,1327],t:7,e:"br"}," Automatic reboot in ",{t:2,r:"data.failTime",p:[49,23,1355]}," seconds... ",{p:[50,3,1387],t:7,e:"ui-button",a:{icon:"refresh",action:"reboot"},f:["Reboot Now"]},{p:[50,67,1451],t:7,e:"br"},{p:[50,71,1455],t:7,e:"br"},{p:[50,75,1459],t:7,e:"br"}]}],n:50,r:"data.failTime",p:[45,1,1182]},{t:4,n:51,f:[{p:[53,2,1491],t:7,e:"ui-notice",f:[{t:4,f:[{p:[55,3,1535],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[56,5,1576],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[56,22,1593]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[56,73,1644]}]}]}],n:50,r:"data.siliconUser",p:[54,4,1507]},{t:4,n:51,f:[{p:[59,3,1732],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[59,29,1758]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[62,2,1846],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[63,4,1884],t:7,e:"ui-section",a:{label:"Main Breaker"},f:[{t:4,f:[{p:[65,5,1967],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isOperating"],s:'_0?"good":"bad"'},p:[65,18,1980]}]},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[65,57,2019]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[64,3,1921]},{t:4,n:51,f:[{p:[67,5,2079],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[67,22,2096]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[67,75,2149]}],action:"breaker"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[68,21,2212]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}," ",{p:[71,4,2293],t:7,e:"ui-section",a:{label:"External Power"},f:[{p:[72,3,2332],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.externalPower"],s:"_0(_1)"},p:[72,16,2345]}]},f:[{t:2,x:{r:["data.externalPower"],s:'_0==2?"Good":_0==1?"Low":"None"'},p:[72,52,2381]}]}]}," ",{p:[74,4,2490],t:7,e:"ui-section",a:{label:"Power Cell"},f:[{t:4,f:[{p:[76,5,2567],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerCellStatus",p:[76,38,2600]}],state:[{t:2,r:"powerCellStatusState",p:[76,71,2633]}]},f:[{t:2,x:{r:["adata.powerCellStatus"],s:"Math.fixed(_0)"},p:[76,97,2659]},"%"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[75,3,2525]},{t:4,n:51,f:[{p:[78,5,2724],t:7,e:"span",a:{"class":"bad"},f:["Removed"]}],x:{r:["data.powerCellStatus"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[82,3,2830],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{t:4,f:[{p:[84,4,2913],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.chargeMode"],s:'_0?"good":"bad"'},p:[84,17,2926]}]},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[84,55,2964]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[83,5,2868]},{t:4,n:51,f:[{p:[86,4,3026],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.chargeMode"],s:'_0?"refresh":"close"'},p:[86,21,3043]}],style:[{t:2,x:{r:["data.chargeMode"],s:'_0?"selected":null'},p:[86,71,3093]}],action:"charge"},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[87,22,3156]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}," [",{p:[90,6,3236],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.chargingStatus"],s:"_0(_1)"},p:[90,19,3249]}]},f:[{t:2,x:{r:["data.chargingStatus"],s:'_0==2?"Fully Charged":_0==1?"Charging":"Not Charging"'},p:[90,56,3286]}]},"]"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[81,4,2790]}]}," ",{p:[94,2,3445],t:7,e:"ui-display",a:{title:"Power Channels"},f:[{t:4,f:[{p:[96,3,3517],t:7,e:"ui-section",a:{label:[{t:2,r:"title",p:[96,22,3536]}],nowrap:0},f:[{p:[97,5,3560],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.powerChannels",m:[{t:30,n:"@index"},"powerLoad"]},p:[97,26,3581]}]}," ",{p:[98,5,3634],t:7,e:"div",a:{"class":"content"},f:[{p:[98,26,3655],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0>=2?"good":"bad"'},p:[98,39,3668]}]},f:[{t:2,x:{r:["status"],s:'_0>=2?"On":"Off"'},p:[98,73,3702]}]}]}," ",{p:[99,5,3751],t:7,e:"div",a:{"class":"content"},f:["[",{p:[99,27,3773],t:7,e:"span",f:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"Auto":"Manual"'},p:[99,33,3779]}]},"]"]}," ",{p:[100,5,3849],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{t:4,f:[{p:[102,6,3942],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"selected":null'},p:[102,39,3975]}],action:"channel",params:[{t:2,r:"topicParams.auto",p:[103,30,4057]}]},f:["Auto"]}," ",{p:[104,6,4102],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["status"],s:'_0==2?"selected":null'},p:[104,41,4137]}],action:"channel",params:[{t:2,r:"topicParams.on",p:[105,13,4204]}]},f:["On"]}," ",{p:[106,6,4245],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["status"],s:'_0==0?"selected":null'},p:[106,37,4276]}],action:"channel",params:[{t:2,r:"topicParams.off",p:[107,13,4343]}]},f:["Off"]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[101,4,3895]}]}]}],n:52,r:"data.powerChannels",p:[95,4,3485]}," ",{p:[112,4,4439],t:7,e:"ui-section",a:{label:"Total Load"},f:[{p:[113,3,4474],t:7,e:"span",a:{"class":"bold"},f:[{t:2,r:"adata.totalLoad",p:[113,22,4493]}]}]}]}," ",{t:4,f:[{p:[117,4,4585],t:7,e:"ui-display",a:{title:"System Overrides"},f:[{p:[118,3,4626],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"overload"},f:["Overload"]}," ",{t:4,f:[{p:[120,5,4727],t:7,e:"ui-button",a:{icon:[{t:2,r:"malfIcon",p:[120,22,4744]}],state:[{t:2,x:{r:["data.malfStatus"],s:'_0==4?"disabled":null'},p:[120,43,4765]}],action:[{t:2,r:"malfAction",p:[120,97,4819]}]},f:[{t:2,r:"malfButton",p:[120,113,4835]}]}],n:50,r:"data.malfStatus",p:[119,3,4698]}]}],n:50,r:"data.siliconUser",p:[116,2,4556]}," ",{p:[124,2,4903],t:7,e:"ui-notice",f:[{p:[125,4,4919],t:7,e:"ui-section",a:{label:"Emergency Light Fallback"},f:[{t:4,f:[{p:[127,8,5020],t:7,e:"span",f:[{t:2,x:{r:["data.emergencyLights"],s:'_0?"Enabled":"Disabled"'},p:[127,14,5026]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[126,6,4971]},{t:4,n:51,f:[{p:[129,8,5106],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"emergency_lighting"},f:[{t:2,x:{r:["data.emergencyLights"],s:'_0?"Enabled":"Disabled"'},p:[129,66,5164]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}," ",{p:[133,2,5275],t:7,e:"ui-notice",f:[{p:[134,4,5291],t:7,e:"ui-section",a:{label:"Night Shift Lighting"},f:[{t:4,f:[{p:[136,8,5388],t:7,e:"span",f:[{t:2,x:{r:["data.nightshiftLights"],s:'_0?"Enabled":"Disabled"'},p:[136,14,5394]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[135,6,5339]},{t:4,n:51,f:[{p:[138,8,5475],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"toggle_nightshift"},f:[{t:2,x:{r:["data.nightshiftLights"],s:'_0?"Enabled":"Disabled"'},p:[138,65,5532]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}," ",{p:[142,2,5644],t:7,e:"ui-notice",f:[{p:[143,4,5660],t:7,e:"ui-section",a:{label:"Cover Lock"},f:[{t:4,f:[{p:[145,5,5741],t:7,e:"span",f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[145,11,5747]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[144,3,5695]},{t:4,n:51,f:[{p:[147,5,5819],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.coverLocked"],s:'_0?"lock":"unlock"'},p:[147,22,5836]}],action:"cover"},f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[147,79,5893]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}],r:"data.failTime"}]},e.exports=a.extend(r.exports)},{341:341}],365:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Alarms"},f:[{p:[2,3,31],t:7,e:"ul",f:[{t:4,f:[{p:[4,7,72],t:7,e:"li",f:[{p:[4,11,76],t:7,e:"ui-button",a:{icon:"close",style:"danger",action:"clear",params:['{"zone": "',{t:2,r:".",p:[4,83,148]},'"}']},f:[{t:2,r:".",p:[4,92,157]}]}]}],n:52,r:"data.priority",p:[3,5,41]},{t:4,n:51,f:[{p:[6,7,201],t:7,e:"li",f:[{p:[6,11,205],t:7,e:"span",a:{"class":"good"},f:["No Priority Alerts"]}]}],r:"data.priority"}," ",{t:4,f:[{p:[9,7,303],t:7,e:"li",f:[{p:[9,11,307],t:7,e:"ui-button",a:{icon:"close",style:"caution",action:"clear",params:['{"zone": "',{t:2,r:".",p:[9,84,380]},'"}']},f:[{t:2,r:".",p:[9,93,389]}]}]}],n:52,r:"data.minor",p:[8,5,275]},{t:4,n:51,f:[{p:[11,7,433],t:7,e:"li",f:[{p:[11,11,437],t:7,e:"span",a:{"class":"good"},f:["No Minor Alerts"]}]}],r:"data.minor"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],366:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.tank","data.sensors.0.long_name"],s:"_0?_1:null"},p:[1,20,19]}]},f:[{t:4,f:[{p:[3,5,102],t:7,e:"ui-subdisplay",a:{title:[{t:2,x:{r:["data.tank","long_name"],s:"!_0?_1:null"},p:[3,27,124]}]},f:[{p:[4,7,167],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[5,3,200],t:7,e:"span",f:[{t:2,x:{r:["pressure"],s:"Math.fixed(_0,2)"},p:[5,9,206]}," kPa"]}]}," ",{t:4,f:[{p:[8,9,302],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[9,11,346],t:7,e:"span",f:[{t:2,x:{r:["temperature"],s:"Math.fixed(_0,2)"},p:[9,17,352]}," K"]}]}],n:50,r:"temperature",p:[7,7,273]}," ",{t:4,f:[{p:[13,9,462],t:7,e:"ui-section",a:{label:[{t:2,r:"id",p:[13,28,481]}]},f:[{p:[14,5,495],t:7,e:"span",f:[{t:2,x:{r:["."],s:"Math.fixed(_0,2)"},p:[14,11,501]},"%"]}]}],n:52,i:"id",r:"gases",p:[12,4,434]}]}],n:52,r:"adata.sensors",p:[2,3,73]}]}," ",{t:4,f:[{p:{button:[{p:[23,5,704],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[25,5,792],t:7,e:"ui-section",a:{label:"Input Injector"},f:[{p:[26,7,835],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputting"],s:'_0?"power-off":"close"'},p:[26,24,852]}],style:[{t:2,x:{r:["data.inputting"],s:'_0?"selected":null'},p:[26,75,903]}],action:"input"},f:[{t:2,x:{r:["data.inputting"],s:'_0?"Injecting":"Off"'},p:[27,9,968]}]}]}," ",{p:[29,5,1044],t:7,e:"ui-section",a:{label:"Input Rate"},f:[{p:[30,7,1083],t:7,e:"span",f:[{t:2,x:{r:["adata.inputRate"],s:"Math.fixed(_0)"},p:[30,13,1089]}," L/s"]}]}," ",{p:[32,5,1156],t:7,e:"ui-section",a:{label:"Output Regulator"},f:[{p:[33,7,1201],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputting"],s:'_0?"power-off":"close"'},p:[33,24,1218]}],style:[{t:2,x:{r:["data.outputting"],s:'_0?"selected":null'},p:[33,76,1270]}],action:"output"},f:[{t:2,x:{r:["data.outputting"],s:'_0?"Open":"Closed"'},p:[34,9,1337]}]}]}," ",{p:[36,5,1412],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[37,7,1456],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure"},f:[{t:2,x:{r:["adata.outputPressure"],s:"Math.round(_0)"},p:[37,50,1499]}," kPa"]}]}]}],n:50,r:"data.tank",p:[20,1,618]}]},e.exports=a.extend(r.exports)},{341:341}],367:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,518],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[9,11,524]}," kPa"]}]}," ",{p:[11,3,586],t:7,e:"ui-section",a:{label:"Filter"},f:[{t:4,f:[{p:[13,7,654],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[13,25,672]}],action:"filter",params:['{"mode": ',{t:2,r:"id",p:[14,42,748]},"}"]},f:[{t:2,r:"name",p:[14,51,757]}]}],n:52,r:"data.filter_types",p:[12,5,619]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],368:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,522],t:7,e:"span",f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,11,528]}," kPa"]}]}," ",{p:[11,3,594],t:7,e:"ui-section",a:{label:"Node 1"},f:[{p:[12,5,627],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[12,44,666]}],action:"node1",params:'{"concentration": -0.1}'}}," ",{p:[14,5,783],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[14,39,817]}],action:"node1",params:'{"concentration": -0.01}'}}," ",{p:[16,5,935],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[16,38,968]}],action:"node1",params:'{"concentration": 0.01}'}}," ",{p:[18,5,1087],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[18,43,1125]}],action:"node1",params:'{"concentration": 0.1}'}}," ",{p:[20,5,1243],t:7,e:"span",f:[{t:2,x:{r:["adata.node1_concentration"],s:"Math.round(_0)"},p:[20,11,1249]},"%"]}]}," ",{p:[22,3,1319],t:7,e:"ui-section",a:{label:"Node 2"},f:[{p:[23,5,1352],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[23,44,1391]}],action:"node2",params:'{"concentration": -0.1}'}}," ",{p:[25,5,1508],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[25,39,1542]}],action:"node2",params:'{"concentration": -0.01}'}}," ",{p:[27,5,1660],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[27,38,1693]}],action:"node2",params:'{"concentration": 0.01}'}}," ",{p:[29,5,1812],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[29,43,1850]}],action:"node2",params:'{"concentration": 0.1}'}}," ",{p:[31,5,1968],t:7,e:"span",f:[{t:2,x:{r:["adata.node2_concentration"],s:"Math.round(_0)"},p:[31,11,1974]},"%"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],369:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{t:4,f:[{p:[7,5,250],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{p:[8,7,292],t:7,e:"ui-button",a:{icon:"pencil",action:"rate",params:'{"rate": "input"}'},f:["Set"]}," ",{p:[9,7,381],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.rate","data.max_rate"],s:'_0==_1?"disabled":null'},p:[9,37,411]}],action:"rate",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,525],t:7,e:"span",f:[{t:2,x:{r:["adata.rate"],s:"Math.round(_0)"},p:[10,13,531]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,223]},{t:4,n:51,f:[{p:[13,5,605],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,649],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,746],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,776]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,906],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,912]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=a.extend(r.exports)},{341:341}],370:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,72],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"data.borg.name",p:[1,20,19]}],button:0},f:[" ",{p:[5,2,149],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[6,4,181],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.emagged"],s:'_0?"check-square-o":"square-o"'},p:[6,21,198]}],style:[{t:2,x:{r:["data.borg.emagged"],s:'_0?"selected":null'},p:[6,83,260]}],action:"toggle_emagged"},f:["Emagged"]}," ",{p:[7,4,351],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.lockdown"],s:'_0?"check-square-o":"square-o"'},p:[7,21,368]}],style:[{t:2,x:{r:["data.borg.lockdown"],s:'_0?"selected":null'},p:[7,84,431]}],action:"toggle_lockdown"},f:["Locked down"]}," ",{p:[8,4,528],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.scrambledcodes"],s:'_0?"check-square-o":"square-o"'},p:[8,21,545]}],style:[{t:2,x:{r:["data.borg.scrambledcodes"],s:'_0?"selected":null'},p:[8,90,614]}],action:"toggle_scrambledcodes"},f:["Scrambled codes"]}]}," ",{p:[10,2,741],t:7,e:"ui-section",a:{label:"Charge"},f:[{t:4,f:[{p:[12,4,803],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.cell.maxcharge",p:[12,25,824]}],value:[{t:2,r:"data.cell.charge",p:[12,57,856]}]},f:[{t:2,x:{r:["data.cell.charge"],s:"Math.round(_0)"},p:[12,79,878]}," / ",{t:2,x:{r:["data.cell.maxcharge"],s:"Math.round(_0)"},p:[12,114,913]}]}],n:50,x:{r:["data.cell.missing"],s:"!_0"},p:[11,3,772]},{t:4,n:51,f:[{p:[14,4,974],t:7,e:"span",a:{"class":"warning"},f:["Cell missing"]},{p:[14,45,1015],t:7,e:"br"}],x:{r:["data.cell.missing"],s:"!_0"}}," ",{p:[16,3,1035],t:7,e:"ui-button",a:{icon:"pencil",action:"set_charge"},f:["Set"]},{p:[16,63,1095],t:7,e:"ui-button",a:{icon:"eject",action:"change_cell"},f:["Change"]},{p:[16,126,1158],t:7,e:"ui-button",a:{icon:"trash","class":"bad",action:"remove_cell"},f:["Remove"]}]}," ",{p:[18,2,1252],t:7,e:"ui-section",a:{label:"Radio channels"},f:[{t:4,f:[{p:[20,4,1319],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["installed"],s:'_0?"check-square-o":"square-o"'},p:[20,21,1336]}],style:[{t:2,x:{r:["installed"],s:'_0?"selected":null'},p:[20,75,1390]}],action:"toggle_radio",params:['{"channel": "',{t:2,r:"name",p:[20,154,1469]},'"}']},f:[{t:2,r:"name",p:[20,166,1481]}]}],n:52,r:"data.channels",p:[19,3,1291]}]}," ",{p:[23,2,1533],t:7,e:"ui-section",a:{label:"Module"},f:[{t:4,f:[{p:[25,4,1591],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.active_module","type"],s:'_0==_1?"check-square-o":"square-o"'},p:[25,21,1608]}],style:[{t:2,x:{r:["data.borg.active_module","type"],s:'_0==_1?"selected":null'},p:[25,97,1684]}],action:"setmodule",params:['{"module": "',{t:2,r:"type",p:[25,193,1780]},'"}']},f:[{t:2,r:"name",p:[25,205,1792]}]}],n:52,r:"data.modules",p:[24,3,1564]}]}," ",{p:[28,2,1844],t:7,e:"ui-section",a:{label:"Upgrades"},f:[{t:4,f:[{p:[30,4,1905],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["installed"],s:'_0?"check-square-o":"square-o"'},p:[30,21,1922]}],style:[{t:2,x:{r:["installed"],s:'_0?"selected":null'},p:[30,75,1976]}],action:"toggle_upgrade",params:['{"upgrade": "',{t:2,r:"type",p:[30,155,2056]},'"}']},f:[{t:2,r:"name",p:[30,167,2068]}]}],n:52,r:"data.upgrades",p:[29,3,1877]}]}," ",{p:[33,2,2120],t:7,e:"ui-section",a:{label:"Master AI"},f:[{t:4,f:[{p:[35,4,2177],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["connected"],s:'_0?"check-square-o":"square-o"'},p:[35,21,2194]}],style:[{t:2,x:{r:["connected"],s:'_0?"selected":null'},p:[35,75,2248]}],action:"slavetoai",params:['{"slavetoai": "',{t:2,r:"ref",p:[35,152,2325]},'"}']},f:[{t:2,r:"name",p:[35,163,2336]}]}],n:52,r:"data.ais",p:[34,3,2154]}]}]}," ",{p:{button:[{p:[41,3,2460],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.lawupdate"],s:'_0?"check-square-o":"square-o"'},p:[41,20,2477]}],style:[{t:2,x:{r:["data.borg.lawupdate"],s:'_0?"selected":null'},p:[41,84,2541]}],action:"toggle_lawupdate"},f:["Lawsync"]}]},t:7,e:"ui-display",a:{title:"Laws",button:0},f:[" ",{t:4,f:[{p:[44,3,2672],t:7,e:"p",f:[{t:2,r:".",p:[44,6,2675]}]}],n:52,r:"data.laws",p:[43,2,2649]}]}]},e.exports=a.extend(r.exports)},{341:341}],371:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"selected":null'},p:[3,38,100]}],action:[{t:2,x:{r:["data.timing"],s:'_0?"stop":"start"'},p:[3,83,145]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"Stop":"Start"'},p:[3,119,181]}]}," ",{p:[4,5,233],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"flash",style:[{t:2,x:{r:["data.flash_charging"],s:'_0?"disabled":null'},p:[4,57,285]}]},f:[{t:2,x:{r:["data.flash_charging"],s:'_0?"Recharging":"Flash"'},p:[4,102,330]}]}]},t:7,e:"ui-display",a:{title:"Cell Timer",button:0},f:[" ",{p:[6,3,410],t:7,e:"ui-section",f:[{p:[7,5,428],t:7,e:"ui-button",a:{icon:"fast-backward",action:"time",params:'{"adjust": -600}'}}," ",{p:[8,5,518],t:7,e:"ui-button",a:{icon:"backward",action:"time",params:'{"adjust": -100}'}}," ",{p:[9,5,603],t:7,e:"span",f:[{t:2,x:{r:["text","data.minutes"],s:"_0.zeroPad(_1,2)"},p:[9,11,609]},":",{t:2,x:{r:["text","data.seconds"],s:"_0.zeroPad(_1,2)"},p:[9,45,643]}]}," ",{p:[10,5,689],t:7,e:"ui-button",a:{icon:"forward",action:"time",params:'{"adjust": 100}'}}," ",{p:[11,5,772],t:7,e:"ui-button",a:{icon:"fast-forward",action:"time",params:'{"adjust": 600}'}}]}," ",{p:[13,3,875],t:7,e:"ui-section",f:[{p:[14,7,895],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "short"}'},f:["Short"]}," ",{p:[15,7,999],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "medium"}'},f:["Medium"]}," ",{p:[16,7,1105],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "long"}'},f:["Long"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],372:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Bluespace Artillery Control",button:0},f:[{t:4,f:[{p:[8,3,167],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,5,200],t:7,e:"ui-button",a:{icon:"crosshairs",action:"recalibrate"},f:[{t:2,r:"data.target",p:[9,55,250]}]}]}," ",{p:[11,3,298],t:7,e:"ui-section",a:{label:"Controls"},f:[{t:4,f:[{p:[13,3,356],t:7,e:"ui-notice",f:[{p:[14,4,372],t:7,e:"span",f:["Bluespace Artillery firing protocols must be globally unlocked from two keycard authentication devices first!"]}]}],n:50,x:{r:["data.unlocked"],s:"!_0"},p:[12,2,330]},{t:4,n:51,f:[{p:[17,3,525],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.ready"],s:'_0?null:"disabled"'},p:[17,36,558]}],action:"fire"},f:["FIRE!"]}],x:{r:["data.unlocked"],s:"!_0"}}]}],n:50,r:"data.connected",p:[7,3,141]}," ",{t:4,f:[{p:[22,3,694],t:7,e:"ui-section",a:{label:"Maintenance"},f:[{p:[23,7,734],t:7,e:"ui-button",a:{icon:"wrench",action:"build"},f:["Complete Deployment."]}]}],n:50,x:{r:["data.connected"],s:"!_0"},p:[21,3,667]}]}]},e.exports=a.extend(r.exports)},{341:341}],373:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,185],t:7,e:"ui-button",a:{icon:"pencil",action:"relabel"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,266],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,301],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,307]}," kPa"]}]}," ",{p:[11,3,373],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,404],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,417]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,462]}]}]}," ",{t:4,f:[{p:[15,3,573],t:7,e:"ui-section",a:{label:"Access"},f:[{p:[16,7,608],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.restricted"],s:'_0?"lock":"unlock"'},p:[16,24,625]}],style:[{t:2,x:{r:[],s:'"caution"'},p:[17,14,680]}],action:"restricted"},f:[{t:2,x:{r:["data.restricted"],s:'_0?"Restricted to Engineering":"Public"'},p:[18,27,722]}]}]}],n:50,r:"data.isPrototype",p:[14,3,544]}]}," ",{p:[22,1,839],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[23,3,869],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[24,5,912],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[24,18,925]}],max:[{t:2,r:"data.maxReleasePressure",p:[24,52,959]}],value:[{t:2,r:"data.releasePressure",p:[25,14,1002]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[25,40,1028]}," kPa"]}]}," ",{p:[27,3,1099],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[28,5,1144],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[28,38,1177]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[30,5,1333],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[30,36,1364]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1511],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1606],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1636]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1798],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1830],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1847]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1901]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1995]}]}]}]}," ",{t:4,f:[{p:[42,1,2090],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2155],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2196],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2229]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2358],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2389]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2520],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2552]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2637],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2667]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2133]}," ",{p:[55,3,2833],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2866],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2899]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2969]}]}," ",{p:[59,2,3017],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3064],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3070]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2062]},{p:{button:[{t:4,f:[{p:[69,7,3277],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3308]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3242]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3442],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3473]}]}," ",{p:[76,3,3519],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3553]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3411]},{t:4,n:51,f:[{p:[80,3,3635],t:7,e:"ui-section",f:[{p:[81,4,3652],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{341:341}],374:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"CentCom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],t:7,e:"span",a:{"class":"bad"},f:["Loaned to CentCom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove", -params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"desc",p:[85,31,2720]}],"tooltip-side":"left",action:"add",params:['{"id": "',{t:2,r:"id",p:[85,90,2779]},'"}']},f:[{t:2,r:"cost",p:[85,100,2789]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{341:341}],375:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,174],t:7,e:"ui-notice",f:[{t:4,f:[{p:[14,5,220],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[15,7,263],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[15,24,280]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[15,75,331]}]}]}],n:50,r:"data.siliconUser",p:[13,3,189]},{t:4,n:51,f:[{p:[18,5,422],t:7,e:"span",f:["Swipe a QM-Level ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[18,39,456]}," this interface."]}],r:"data.siliconUser"}]}," ",{t:4,f:[{p:[23,3,568],t:7,e:"ui-display",a:{title:"Express Cargo Console"},f:[{p:[25,5,618],t:7,e:"ui-section",a:{label:"Landing Location"},f:[{p:[26,7,663],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.usingBeacon"],s:'_0?null:"selected"'},p:[26,25,681]}],action:"LZCargo"},f:["Cargo Bay"]}," ",{p:[27,7,770],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.hasBeacon","data.usingBeacon"],s:'_0?_1?"selected":null:"disabled"'},p:[27,25,788]}],action:"LZBeacon"},f:[{t:2,r:"data.beaconzone",p:[27,116,879]}," (",{t:2,r:"data.beaconName",p:[27,137,900]},")"]}," ",{p:[28,7,940],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.canBuyBeacon"],s:'_0?null:"disabled"'},p:[28,25,958]}],action:"printBeacon"},f:[{t:2,r:"data.printMsg",p:[28,90,1023]}]}]}," ",{p:[31,5,1079],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[32,7,1115],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[32,13,1121]}]}]}," ",{p:[35,5,1183],t:7,e:"ui-section",a:{label:"Notice"},f:[{p:[36,7,1218],t:7,e:"span",f:[{t:2,r:"data.message",p:[36,13,1224]}]}]}]}," ",{p:[39,3,1287],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[39,18,1302]}]},f:[{t:4,f:[{p:[41,7,1349],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[41,18,1360]}]},f:[{t:4,f:[{p:[43,11,1407],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[43,30,1426]}],candystripe:0,right:0},f:[{p:[44,13,1468],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.canBeacon"],s:'_0?null:"disabled"'},p:[44,31,1486]}],tooltip:[{t:2,r:"desc",p:[44,80,1535]}],"tooltip-side":"left",action:"add",params:['{"id": "',{t:2,r:"id",p:[44,139,1594]},'"}']},f:[{t:2,r:"cost",p:[44,149,1604]}," Credits ",{t:2,r:"data.beaconError",p:[44,166,1621]}]}]}],n:52,r:"packs",p:[42,9,1380]}]}],n:52,r:"data.supplies",p:[40,5,1318]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[22,1,543]}]},e.exports=a.extend(r.exports)},{341:341}],376:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,49],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,82]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,169],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,226]}]}]}," ",{p:[8,1,293],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,335],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,354]}],candystripe:0,right:0},f:[{p:[11,5,388],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,394]}]}," ",{p:[12,5,415],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,421]}]}," ",{p:[13,5,446],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,458]}]}," ",{p:[14,5,483],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,508]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,615]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,635]}]}]}],n:52,r:"data.abilities",p:[9,1,307]},{t:4,f:[{p:[23,3,738],t:7,e:"span",a:{"class":"warning"},f:["No abilities available."]}],n:51,r:"data.abilities",p:[22,1,715]}]}]},e.exports=a.extend(r.exports)},{341:341}],377:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["To use this, simply spawn the atoms you want in one of the four Centcom Supplypod Bays. Items in the bay will then be launched inside your supplypod, one turf-full at a time! You can optionally use the following buttons to configure how the supplypod acts."]}]}," ",{p:[5,1,304],t:7,e:"ui-display",a:{title:"Centcom Pod Customization (to be used against helen weinstein)"},f:[{p:[6,4,392],t:7,e:"ui-section",a:{label:"Which supplypod bay will you use?"},f:[{p:[7,9,458],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==1?"selected":null'},p:[7,27,476]}],action:"bay1"},f:["Bay #1"]}," ",{p:[8,9,557],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==2?"selected":null'},p:[8,27,575]}],action:"bay2"},f:["Bay #2"]}," ",{p:[9,9,656],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==3?"selected":null'},p:[9,27,674]}],action:"bay3"},f:["Bay #3"]}," ",{p:[10,9,755],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==4?"selected":null'},p:[10,27,773]}],action:"bay4"},f:["Bay #4"]}]}," ",{p:[13,5,871],t:7,e:"ui-section",a:{label:"Useful teleport tools!"},f:[{p:[14,9,926],t:7,e:"ui-button",a:{action:"teleportCentcom"},f:["Teleport to Centcom's Supplypod Loading Bay"]}," ",{p:[15,9,1027],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.oldArea"],s:'_0?null:"disabled"'},p:[15,27,1045]}],action:"teleportBack"},f:["Teleport Back to ",{t:2,x:{r:["data.oldArea"],s:'_0?_0:"where you were"'},p:[15,103,1121]}]}]}," ",{p:[18,5,1210],t:7,e:"ui-section",a:{label:"Keep stuff after launching?"},f:[{p:[19,9,1268],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.launchClone"],s:'_0?"selected":null'},p:[19,27,1286]}],action:"launchClone","tooltip-side":"left",tooltip:"Choosing this will create a duplicate of the item to be launched in Centcom, allowing you to send one type of item multiple times. Either way, the atoms are forceMoved into the supplypod after it lands (but before it opens)."},f:["Clone and Launch"]}]}," ",{p:[23,5,1668],t:7,e:"ui-section",a:{label:"Launch all at once?"},f:[{p:[24,9,1718],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.launchChoice"],s:'_0==1?"selected":null'},p:[24,27,1736]}],action:"launchOrdered","tooltip-side":"left",tooltip:'Instead of launching everything in the bay at once, this will "scan" things (one turf-full at a time) in order, left to right and top to bottom. Refreshing will reset the "scanner" to the top-leftmost position.'},f:["Ordered"]}," ",{p:[26,9,2086],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.launchChoice"],s:'_0==2?"selected":null'},p:[26,27,2104]}],action:"launchRandom","tooltip-side":"left",tooltip:"Instead of launching everything in the bay at once, this will launch one random turf of items at a time."},f:["Random"]}]}," ",{p:[30,5,2362],t:7,e:"ui-section",a:{label:"Add an explosion?"},f:[{p:[31,9,2410],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.explosionChoice"],s:'_0==1?"selected":null'},p:[31,27,2428]}],action:"explosionCustom","tooltip-side":"left",tooltip:"This will cause an explosion of whatever size you like (including flame range) to occur as soon as the supplypod lands. Dont worry, supply-pods are explosion-proof!"},f:["Custom Size"]}," ",{p:[33,9,2740],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.explosionChoice"],s:'_0==2?"selected":null'},p:[33,27,2758]}],action:"explosionBus","tooltip-side":"left",tooltip:"This will cause a maxcap explosion (dependent on server config) to occur as soon as the supplypod lands. Dont worry, supply-pods are explosion-proof!"},f:["Adminbus"]}]}," ",{p:[37,5,3066],t:7,e:"ui-section",a:{label:"Extra damage?","(default":"None)"},f:[{p:[38,9,3127],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.damageChoice"],s:'_0==1?"selected":null'},p:[38,27,3145]}],action:"damageCustom","tooltip-side":"left",tooltip:"Anyone caught under the pod when it lands will be dealt this amount of brute damage. Sucks to be them!"},f:["Custom Damage"]}," ",{p:[40,9,3392],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.damageChoice"],s:'_0==2?"selected":null'},p:[40,27,3410]}],action:"damageGib","tooltip-side":"left",tooltip:"This will attempt to gib any mob caught under the pod when it lands, as well as dealing a nice 5000 brute damage. Ya know, just to be sure!"},f:["Gib"]}]}," ",{p:[44,5,3698],t:7,e:"ui-section",a:{label:"Extra effects?"},f:[{p:[45,9,3743],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectStun"],s:'_0?"selected":null'},p:[45,27,3761]}],action:"effectStun","tooltip-side":"left",tooltip:"Anyone who is on the turf when the supplypod is launched will be stunned until the supplypod lands. They cant get away that easy!"},f:["Stun"]}," ",{p:[47,9,4017],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectLimb"],s:'_0?"selected":null'},p:[47,27,4035]}],action:"effectLimb","tooltip-side":"left",tooltip:"This will cause anyone caught under the pod to lose a limb, excluding their head."},f:["Delimb"]}," ",{p:[49,9,4245],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectBluespace"],s:'_0?"selected":null'},p:[49,27,4263]}],action:"effectBluespace","tooltip-side":"left",tooltip:"Gives the supplypod an advanced Bluespace Recyling Device. After opening, the supplypod will be warped directly to the surface of a nearby NT-designated trash planet (/r/ss13)."},f:["Bluespace"]}," ",{p:[51,9,4581],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectStealth"],s:'_0?"selected":null'},p:[51,27,4599]}],action:"effectStealth","tooltip-side":"left",tooltip:'This hides the red target icon from appearing when you launch the supplypod. Combos well with the "Invisible" style. Sneak attack, go!'},f:["Stealth"]}," ",{p:[53,9,4869],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectQuiet"],s:'_0?"selected":null'},p:[53,27,4887]}],action:"effectQuiet","tooltip-side":"left",tooltip:"This will keep the supplypod from making any sounds, except for those specifically set by admins in the Sound section."},f:["Quiet Landing"]}," ",{p:[55,9,5143],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectReverse"],s:'_0?"selected":null'},p:[55,27,5161]}],action:"effectReverse","tooltip-side":"left",tooltip:"This pod will not send any items. Instead, after landing, the supplypod will close (similar to a normal closet closing), and then launch back to the right centcom bay to drop off any new contents."},f:["Reverse Mode"]}," ",{p:[57,9,5498],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectMissile"],s:'_0?"selected":null'},p:[57,27,5516]}],action:"effectMissile","tooltip-side":"left",tooltip:"This pod will not send any items. Instead, it will immediatley delete after landing (Similar visually to setting openDelay & departDelay to 0, but this looks nicer). Useful if you just wanna fuck some shit up. Combos well with the Missile style."},f:["Missile Mode"]}," ",{p:[59,9,5902],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectCircle"],s:'_0?"selected":null'},p:[59,27,5920]}],action:"effectCircle","tooltip-side":"left",tooltip:"This will make the supplypod come in from any angle. Im not sure why this feature exists, but here it is."},f:["Any Descent Angle"]}," ",{p:[61,9,6169],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectBurst"],s:'_0?"selected":null'},p:[61,27,6187]}],action:"effectBurst","tooltip-side":"left",tooltip:"This will make each click launch 5 supplypods inaccuratly around the target turf (a 3x3 area). Combos well with the Missle Mode if you dont want shit lying everywhere after."},f:["Machine Gun Mode"]}," ",{p:[63,9,6501],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectTarget"],s:'_0?"selected":null'},p:[63,27,6519]}],action:"effectTarget","tooltip-side":"left",tooltip:"This will make the supplypod target a specific atom, instead of the mouses position. Smiting does this automatically!"},f:["Specific Target"]}," ",{p:[65,9,6778],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectName"],s:'_0?"selected":null'},p:[65,27,6796]}],action:"effectName","tooltip-side":"left",tooltip:"Allows you to add a custom name and description."},f:["Custom Name/Desc"]}]}," ",{p:[69,5,7e3],t:7,e:"ui-section",a:{label:"Sound?"},f:[{p:[70,9,7037],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.landingSound"],s:'_0?"selected":null'},p:[70,27,7055]}],action:"landingSound","tooltip-side":"left",tooltip:"Choose a sound to play when the pod lands."},f:["Custom Landing Sound"]}," ",{p:[72,10,7245],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.openingSound"],s:'_0?"selected":null'},p:[72,28,7263]}],action:"openingSound","tooltip-side":"left",tooltip:"Choose a sound to play when the pod opens."},f:["Custom Opening Sound"]}," ",{p:[74,9,7452],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.leavingSound"],s:'_0?"selected":null'},p:[74,27,7470]}],action:"leavingSound","tooltip-side":"left",tooltip:"Choose a sound to play when the pod departs (whether that be delection in the case of a bluespace pod, or leaving for centcom for a reversing pod)."},f:["Custom Leaving Sound"]}," ",{p:[76,9,7764],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.soundVolume"],s:'_0?"selected":null'},p:[76,27,7782]}],action:"soundVolume","tooltip-side":"left",tooltip:"Choose the volume for the sound to play at. Default values are between 1 and 100, but hey, do whatever. Im a tooltip, not a cop."},f:["Admin Sound Volume"]}]}," ",{p:[80,5,8070],t:7,e:"ui-section",a:{label:"Delay timers?"},f:[{p:[81,9,8114],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.landingDelay"],s:'_0!=5?"selected":null'},p:[81,27,8132]}],action:"landingDelay","tooltip-side":"left",tooltip:"Choose the amount of time it takes for the supplypod to hit the station. By default this value is 0.5 seconds."},f:["Custom Landing Time"]}," ",{p:[83,10,8394],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.openingDelay"],s:'_0!=30?"selected":null'},p:[83,28,8412]}],action:"openingDelay","tooltip-side":"left",tooltip:"Choose the amount of time it takes for the supplypod to open after landing. Useful for giving whatevers inside the pod a nice dramatic entrance! By default this value is 3 seconds."},f:["Custom Opening Time"]}," ",{p:[85,9,8744],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.departureDelay"],s:'_0!=30?"selected":null'},p:[85,27,8762]}],action:"departureDelay","tooltip-side":"left",tooltip:"Choose the amount of time it takes for the supplypod to leave after landing. By default this value is 3 seconds."},f:["Custom Leaving Time"]}]}," ",{p:[89,5,9047],t:7,e:"ui-section",a:{label:"Style?"},f:[{p:[90,9,9084],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==1?"selected":null'},p:[90,27,9102]}],action:"styleStandard","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to your standard Nanotrasen black and orange. Same color scheme as the normal station-used supplypods."},f:["Standard"]}," ",{p:[92,9,9405],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==2?"selected":null'},p:[92,27,9423]}],action:"styleBluespace","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to the same as the stations upgraded blue-and-white Bluespace Supplypods."},f:["Advanced"]}," ",{p:[94,9,9698],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==4?"selected":null'},p:[94,27,9716]}],action:"styleSyndie","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to a menacing black and blood-red. Great for sending meme-ops in style!"},f:["Syndicate"]}," ",{p:[96,9,9987],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==5?"selected":null'},p:[96,27,10005]}],action:"styleBlue","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to a menacing black and dark blue. Great for sending deathsquads in style!"},f:["Deathsquad"]}," ",{p:[98,10,10279],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==6?"selected":null'},p:[98,28,10297]}],action:"styleCult","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a blood and rune covered cult pod!"},f:["Cult Pod"]}," ",{p:[100,9,10524],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==7?"selected":null'},p:[100,27,10542]}],action:"styleMissile","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a large missile. Combos well with a missile mode, so the missile doesnt stick around after landing."},f:["Missile"]}," ",{p:[102,9,10836],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==8?"selected":null'},p:[102,27,10854]}],action:"styleSMissile","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a large blood-red missile. Combos well with missile mode, so the missile doesnt stick around after landing."},f:["Syndicate Missile"]}," ",{p:[104,9,11167],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==9?"selected":null'},p:[104,27,11185]}],action:"styleBox","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a large, dark-green military supply crate."},f:["Supply Crate"]}," ",{p:[106,9,11423],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==10?"selected":null'},p:[106,27,11441]}],action:"styleHONK","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to a colorful, clown inspired look."},f:["HONK"]}," ",{p:[108,9,11670],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==11?"selected":null'},p:[108,27,11688]}],action:"styleFruit","tooltip-side":"left",tooltip:"for when an orange is angry"},f:["Fruit~"]}," ",{p:[110,9,11851],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==12?"selected":null'},p:[110,27,11869]}],action:"styleInvisible","tooltip-side":"left",tooltip:'Makes the supplypod invisible! Useful for when you want to use this feature with a gateway or something. Combos well with the "Stealth" and "Quiet Landing" effects.'},f:["Invisible"]}," ",{p:[112,9,12175],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==13?"selected":null'},p:[112,27,12193]}],action:"styleGondola","tooltip-side":"left",tooltip:"this gondola can control when he wants to deliver his supplies if he has a smart enough mind, so offer up his body to ghosts for maximum enjoyment. (Make sure to turn off bluespace and set a arbitrarily high open-time if you do!)"},f:["Gondola (alive)"]}]}]}," ",{p:[117,1,12597],t:7,e:"ui-display",f:[{p:[118,5,12615],t:7,e:"ui-section",a:{label:[{t:2,r:"data.numObjects",p:[118,26,12636]}," turfs with launchable atoms found in Bay #",{t:2,r:"data.bay",p:[118,88,12698]}]},f:[{p:[119,9,12722],t:7,e:"ui-button",a:{action:"refresh","tooltip-side":"right",tooltip:"Manually refreshes the possible things to launch in the pod bay."},f:["Refresh Pod Bay"]}]}," ",{p:[123,5,12909],t:7,e:"ui-section",f:[{p:[124,9,12931],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.giveLauncher"],s:'_0?"selected":null'},p:[124,27,12949]}],action:"giveLauncher","tooltip-side":"right",tooltip:"THE CODEX ASTARTES CALLS THIS MANEUVER: STEEL RAIN!!"},f:["Enter Launch Mode"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],378:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:[6,1,206],t:7,e:"ui-display",a:{title:"Saved Recipes",button:0},f:[{p:[7,3,251],t:7,e:"ui-section",f:[{p:[8,5,269],t:7,e:"ui-button",a:{icon:"plus",action:"add_recipe"},f:["Add Recipe"]}," ",{p:[9,2,337],t:7,e:"ui-button",a:{icon:"minus",action:"clear_recipes"},f:["Clear Recipes"]}," ",{t:4,f:[{p:[11,7,445],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense_recipe",params:['{"recipe": "',{t:2,r:"contents",p:[11,80,518]},'"}']},f:[{t:2,r:"recipe_name",p:[11,96,534]}]}],n:52,r:"data.recipes",p:[10,5,415]}]}]}," ",{p:{button:[{t:4,f:[{p:[18,7,719],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[18,37,749]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[18,114,826]},"}"]},f:[{t:2,r:".",p:[18,122,834]}]}],n:52,r:"data.beakerTransferAmounts",p:[17,5,675]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[21,3,886],t:7,e:"ui-section",f:[{t:4,f:[{p:[23,7,936],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[23,74,1003]},'"}']},f:[{t:2,r:"title",p:[23,84,1013]}]}],n:52,r:"data.chemicals",p:[22,5,904]}]}]}," ",{p:{button:[{t:4,f:[{p:[30,7,1190],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[30,66,1249]},"}"]},f:[{t:2,r:".",p:[30,74,1257]}]}],n:52,r:"data.beakerTransferAmounts",p:[29,5,1146]}," ",{p:[32,5,1295],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[32,36,1326]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[34,3,1423],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[36,7,1493],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[36,13,1499]},"/",{t:2,r:"data.beakerMaxVolume",p:[36,55,1541]}," Units"]}," ",{p:[37,4,1583],t:7,e:"span",f:["pH: ",{t:2,x:{r:["adata.beakerCurrentpH"],s:"Math.round(_0*10)/10"},p:[37,14,1593]}]}," ",{p:[38,7,1651],t:7,e:"br"}," ",{t:4,f:[{p:[40,9,1704],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[40,52,1747]}," units of ",{t:2,r:"name",p:[40,87,1782]}]},{p:[40,102,1797],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[39,7,1664]},{t:4,n:51,f:[{p:[42,9,1828],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[35,5,1458]},{t:4,n:51,f:[{p:[45,7,1904],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],379:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,421]}," K"]}]}]}," ",{p:{button:[{p:[14,5,564],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,595]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,692],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,762],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,781]}," K"]}," ",{p:[19,4,828],t:7,e:"br"}," ",{p:[20,7,842],t:7,e:"span",f:["pH: ",{t:2,x:{r:["adata.currentpH"],s:"Math.round(_0*10)/10"},p:[20,17,852]}]}," ",{p:[21,7,904],t:7,e:"br"}," ",{t:4,f:[{p:[23,9,958],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[23,52,1001]}," units of ",{t:2,r:"name",p:[23,87,1036]}]},{p:[23,102,1051],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[22,7,918]},{t:4,n:51,f:[{p:[25,9,1082],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,727]},{t:4,n:51,f:[{p:[28,7,1158],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],380:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,32],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,87]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,143]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,199]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"No beaker"'},p:[7,5,268]}]}," ",{p:[10,3,340],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,426],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,445]}," units of ",{t:2,r:"name",p:[13,60,480]}],nowrap:0},f:[{p:[14,7,505],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,555],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,608]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,653],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,706]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,751],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,804]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,851],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,904]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,954],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1007]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1058],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[20,52,1102]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,390]},{t:4,n:51,f:[{p:[24,5,1184],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,357]},{t:4,n:51,f:[{p:[27,5,1255],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1343],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1374],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1412]}]},f:["Destroy"]}," ",{p:[34,3,1470],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1508]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1577],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1629],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1648]}," units of ",{t:2,r:"name",p:[37,59,1683]}],nowrap:0},f:[{p:[38,6,1707],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1756],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1811]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1855],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1910]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1954],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,2009]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2055],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2110]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2159],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2214]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2264],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[44,51,2308]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1594]}]}]}," ",{t:4,f:[{p:[52,3,2444],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2534],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[54,39,2568]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[54,88,2617]}]}," ",{p:[55,5,2698],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[55,27,2720]},"/",{t:2,r:"data.pillBotMaxContent",p:[55,51,2744]}]}],n:50,r:"data.isPillBottleLoaded",p:[53,4,2497]},{t:4,n:51,f:[{p:[57,5,2796],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[60,4,2860],t:7,e:"br"}," ",{p:[61,4,2870],t:7,e:"br"}," ",{p:[62,4,2880],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[62,63,2939]}]},f:["Create Pill (max 50µ)"]}," ",{p:[63,4,3023],t:7,e:"br"}," ",{p:[64,4,3033],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[64,63,3092]}]},f:["Create Multiple Pills"]}," ",{p:[65,4,3176],t:7,e:"br"}," ",{p:[66,4,3186],t:7,e:"br"}," ",{p:[67,4,3196],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[67,64,3256]}]},f:["Create Patch (max 40µ)"]}," ",{p:[68,4,3341],t:7,e:"br"}," ",{p:[69,4,3351],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[69,64,3411]}]},f:["Create Multiple Patches"]}," ",{p:[70,4,3497],t:7,e:"br"}," ",{p:[71,4,3507],t:7,e:"br"}," ",{p:[72,4,3517],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,65,3578]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[73,4,3664],t:7,e:"br"}," ",{p:[74,4,3674],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[74,65,3735]}]},f:["Dispense Buffer to Bottles"]}," ",{p:[75,4,3824],t:7,e:"br"}," ",{p:[76,4,3834],t:7,e:"br"}," ",{p:[77,4,3844],t:7,e:"ui-button",a:{action:"createVial",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[77,63,3903]}]},f:["Create Hypo Vial (max 30µ)"]}," ",{p:[78,4,3992],t:7,e:"br"}," ",{p:[79,4,4002],t:7,e:"ui-button",a:{action:"createVial",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"], -s:'_0?null:"disabled"'},p:[79,63,4061]}]},f:["Dispense Buffer to Hypo vials"]}," ",{p:[80,4,4154],t:7,e:"br"}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2421]},{t:4,n:51,f:[{p:[85,3,4197],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[86,4,4252],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[86,63,4311]}]},f:["Create Pack (max 10µ)"]}," ",{p:[87,4,4395],t:7,e:"br"}," ",{p:[88,4,4405],t:7,e:"br"}," ",{p:[89,4,4415],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[89,65,4476]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,1,0]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[93,2,4624],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[93,20,4642]}]},f:[{p:[94,3,4673],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[95,3,4721],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[95,46,4764]}]}," ",{p:[96,3,4807],t:7,e:"br"}," ",{p:[97,3,4816],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[98,3,4858],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[98,23,4878]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[98,69,4924]}]},f:[{t:2,r:"data.analyzeVars.color",p:[98,97,4952]}]}," ",{p:[99,3,4989],t:7,e:"br"}," ",{p:[100,3,4998],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[101,3,5040],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[101,25,5062]}]}," ",{p:[102,3,5099],t:7,e:"br"}," ",{p:[103,3,5108],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[104,3,5164],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[104,25,5186]},"µ/minute"]}," ",{p:[105,3,5234],t:7,e:"br"}," ",{p:[106,3,5243],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[107,3,5298],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[107,25,5320]}]}," ",{p:[108,3,5357],t:7,e:"br"}," ",{p:[109,3,5366],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[110,3,5422],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[110,25,5444]}]}," ",{p:[111,3,5482],t:7,e:"br"}," ",{p:[112,3,5491],t:7,e:"br"}," ",{p:[113,3,5500],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{341:341}],381:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Recipient Contents"},f:[{p:[2,2,42],t:7,e:"ui-section",f:[{p:[3,3,58],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[3,34,89]}],action:"ejectBeaker"},f:["Eject"]}," ",{p:[4,3,176],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[4,35,208]}],action:"input"},f:["Input"]}," ",{p:[5,3,289],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,35,321]}],action:"amount"},f:[{t:2,r:"data.amount",p:[5,96,382]},"U"]}," ",{p:[6,3,414],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"disabled":null'},p:[6,33,444]}],action:"makecup"},f:["Create Beaker"]}]}]}," ",{p:[9,1,564],t:7,e:"ui-display",a:{title:"Recipient"},f:[{p:[10,2,597],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[12,4,662],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[12,10,668]},"/",{t:2,r:"data.beakerMaxVolume",p:[12,52,710]}," Units"]}," ",{t:4,f:[{p:[14,5,788],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[14,48,831]}," units of ",{t:2,r:"name",p:[14,83,866]}]},{p:[14,98,881],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[13,4,752]},{t:4,n:51,f:[{p:[16,5,905],t:7,e:"span",a:{"class":"bad"},f:["Recipient Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,3,630]},{t:4,n:51,f:[{p:[19,4,976],t:7,e:"span",a:{"class":"average"},f:["No Recipient"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],382:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,43]}]}]}," ",{t:4,f:[{p:[5,3,149],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[6,3,165]}," ",{t:4,f:[{p:[8,4,231],t:7,e:"br"},{p:[8,8,235],t:7,e:"ui-button",a:{action:"rec_category",params:['{"category": "',{t:2,r:"name",p:[8,63,290]},'"}']},f:[{t:3,r:"name",p:[8,75,302]}," - ",{t:3,r:"desc",p:[8,88,315]}]}],n:52,r:"data.recollection_categories",p:[7,3,188]}," ",{t:3,r:"data.rec_section",p:[10,3,354]}," ",{t:3,r:"data.rec_binds",p:[11,3,380]}]}],n:50,r:"data.recollection",p:[4,1,120]},{t:4,n:51,f:[{p:[14,2,431],t:7,e:"ui-display",a:{title:"Power",button:0},f:[{p:[15,4,469],t:7,e:"ui-section",f:[{t:3,r:"data.power",p:[16,6,488]}]}]}," ",{p:[19,2,541],t:7,e:"ui-display",f:[{p:[20,3,557],t:7,e:"ui-section",f:[{p:[21,4,574],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[21,22,592]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[22,4,715],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[22,22,733]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[23,4,857],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[23,22,875]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[24,4,1014],t:7,e:"br"},{t:3,r:"data.tier_info",p:[24,8,1018]}]}," ",{p:[26,3,1059],t:7,e:"ui-section",f:[{t:3,r:"data.scripturecolors",p:[27,4,1076]}]},{p:[28,16,1119],t:7,e:"hr"}," ",{p:[29,3,1127],t:7,e:"ui-section",f:[{t:4,f:[{p:[31,4,1172],t:7,e:"div",f:[{p:[31,9,1177],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[31,29,1197]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[31,99,1267]},'"}']},f:["Recite ",{t:3,r:"required",p:[31,118,1286]}]}," ",{t:4,f:[{t:4,f:[{p:[34,6,1362],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[34,53,1409]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[34,72,1428]}]}],n:50,r:"bound",p:[33,5,1342]},{t:4,n:51,f:[{p:[36,6,1472],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[36,53,1519]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[32,6,1319]}," ",{t:3,r:"name",p:[39,6,1586]}," ",{t:3,r:"descname",p:[39,17,1597]}," ",{t:3,r:"invokers",p:[39,32,1612]}]}],n:52,r:"data.scripture",p:[30,3,1143]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{341:341}],383:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Codex Gigas"},f:[{p:[2,2,35],t:7,e:"ui-section",f:[{t:2,r:"data.name",p:[3,3,51]}]}," ",{p:[5,5,86],t:7,e:"ui-section",a:{label:"Prefix"},f:[{p:[6,3,117],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[6,22,136]}],action:"Dark "},f:["Dark"]}," ",{p:[7,3,221],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[7,22,240]}],action:"Hellish "},f:["Hellish"]}," ",{p:[8,3,331],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[8,22,350]}],action:"Fallen "},f:["Fallen"]}," ",{p:[9,3,439],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[9,22,458]}],action:"Fiery "},f:["Fiery"]}," ",{p:[10,3,545],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[10,22,564]}],action:"Sinful "},f:["Sinful"]}," ",{p:[11,3,653],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[11,22,672]}],action:"Blood "},f:["Blood"]}," ",{p:[12,3,759],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[12,22,778]}],action:"Fluffy "},f:["Fluffy"]}]}," ",{p:[14,5,888],t:7,e:"ui-section",a:{label:"Title"},f:[{p:[15,3,918],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[15,22,937]}],action:"Lord "},f:["Lord"]}," ",{p:[16,3,1022],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[16,22,1041]}],action:"Prelate "},f:["Prelate"]}," ",{p:[17,3,1132],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[17,22,1151]}],action:"Count "},f:["Count"]}," ",{p:[18,3,1238],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[18,22,1257]}],action:"Viscount "},f:["Viscount"]}," ",{p:[19,3,1350],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[19,22,1369]}],action:"Vizier "},f:["Vizier"]}," ",{p:[20,3,1458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[20,22,1477]}],action:"Elder "},f:["Elder"]}," ",{p:[21,3,1564],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[21,22,1583]}],action:"Adept "},f:["Adept"]}]}," ",{p:[23,5,1691],t:7,e:"ui-section",a:{label:"Name"},f:[{p:[24,3,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[24,22,1739]}],action:"hal"},f:["hal"]}," ",{p:[25,3,1821],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[25,22,1840]}],action:"ve"},f:["ve"]}," ",{p:[26,3,1920],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[26,22,1939]}],action:"odr"},f:["odr"]}," ",{p:[27,3,2021],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[27,22,2040]}],action:"neit"},f:["neit"]}," ",{p:[28,3,2124],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[28,22,2143]}],action:"ci"},f:["ci"]}," ",{p:[29,3,2223],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[29,22,2242]}],action:"quon"},f:["quon"]}," ",{p:[30,3,2326],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[30,22,2345]}],action:"mya"},f:["mya"]}," ",{p:[31,3,2427],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[31,22,2446]}],action:"folth"},f:["folth"]}," ",{p:[32,3,2532],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[32,22,2551]}],action:"wren"},f:["wren"]}," ",{p:[33,3,2635],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[33,22,2654]}],action:"geyr"},f:["geyr"]}," ",{p:[34,3,2738],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[34,22,2757]}],action:"hil"},f:["hil"]}," ",{p:[35,3,2839],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[35,22,2858]}],action:"niet"},f:["niet"]}," ",{p:[36,3,2942],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[36,22,2961]}],action:"twou"},f:["twou"]}," ",{p:[37,3,3045],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[37,22,3064]}],action:"phi"},f:["phi"]}," ",{p:[38,3,3146],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[38,22,3165]}],action:"coa"},f:["coa"]}]}," ",{p:[40,5,3268],t:7,e:"ui-section",a:{label:"suffix"},f:[{p:[41,3,3299],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[41,22,3318]}],action:" the Red"},f:["the Red"]}," ",{p:[42,3,3409],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[42,22,3428]}],action:" the Soulless"},f:["the Soulless"]}," ",{p:[43,3,3529],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[43,22,3548]}],action:" the Master"},f:["the Master"]}," ",{p:[44,3,3645],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[44,22,3664]}],action:", the Lord of all things"},f:["the Lord of all things"]}," ",{p:[45,3,3786],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[45,22,3805]}],action:", Jr."},f:["jr"]}]}," ",{p:[47,5,3909],t:7,e:"ui-section",a:{label:"submit"},f:[{p:[48,3,3941],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0>=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],384:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["Network Card"]}," allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["Processor Unit"]}," is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["Tesla Relay"]}," is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["Nano Printer"]}," is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["Card Reader"]}," adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{341:341}],385:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],386:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{isHead:function(t){return t%10==0},dept_class:function(t){return 0==t?"dept-cap":t>=10&&20>t?"dept-sec":t>=20&&30>t?"dept-med":t>=30&&40>t?"dept-sci":t>=40&&50>t?"dept-eng":t>=50&&60>t?"dept-cargo":t>=200&&230>t?"dept-cent":"dept-other"},health_state:function(t,e,n,a){var r=t+e+n+a;return 0>=r?"health-5":25>=r?"health-4":50>=r?"health-3":75>=r?"health-2":"health-0"}}}}(r),r.exports.css=" .health {\r\n width: 16px;\r\n height: 16px;\r\n background-color: #FFF;\r\n border: 1px solid #434343;\r\n position: relative;\r\n top: 2px;\r\n display: inline-block;\r\n }\r\n .health-5 { background-color: #17d568; }\r\n .health-4 { background-color: #2ecc71; }\r\n .health-3 { background-color: #e67e22; }\r\n .health-2 { background-color: #ed5100; }\r\n .health-1 { background-color: #e74c3c; }\r\n .health-0 { background-color: #ed2814; }\r\n\r\n .dept-cap {color : #C06616;}\r\n .dept-sec {color : #E74C3C;}\r\n .dept-med {color : #3498DB;}\r\n .dept-sci {color : #9B59B6;}\r\n .dept-eng {color : #F1C40F;}\r\n .dept-cargo {color : #F39C12;}\r\n .dept-cent {color : #00C100;}\r\n .dept-other {color: #C38312;}\r\n\r\n .oxy { color : #3498db; }\r\n .toxin { color : #2ecc71; }\r\n .burn { color : #e67e22; }\r\n .brute { color : #e74c3c; }\r\n\r\n table.crew{\r\n border-collapse: collapse;\r\n }\r\n\r\n table.crew td {\r\n padding : 0px 10px;\r\n }",r.exports.template={v:3,t:[" ",{p:[27,1,1030],t:7,e:"ui-display",f:[{p:[28,2,1045],t:7,e:"ui-section",f:[{p:[29,3,1061],t:7,e:"table",a:{"class":"crew"},f:[{p:[30,3,1085],t:7,e:"thead",f:[{p:[31,3,1096],t:7,e:"tr",f:[{p:[32,4,1105],t:7,e:"th",f:["Name"]}," ",{p:[33,4,1123],t:7,e:"th",f:["Status"]}," ",{p:[34,4,1143],t:7,e:"th",f:["Vitals"]}," ",{p:[35,4,1163],t:7,e:"th",f:["Position"]}," ",{t:4,f:[{p:[37,5,1216],t:7,e:"th",f:["Tracking"]}],n:50,r:"data.link_allowed",p:[36,4,1185]}]}]}," ",{p:[41,3,1270],t:7,e:"tbody",f:[{t:4,f:[{p:[43,4,1308],t:7,e:"tr",f:[{p:[44,5,1318],t:7,e:"td",f:[{p:[45,6,1329],t:7,e:"span",a:{"class":[{t:2,x:{r:["isHead","ijob"],s:'_0(_1)?"bold ":""'},p:[45,19,1342]},{t:2,x:{r:["dept_class","ijob"],s:"_0(_1)"},p:[45,49,1372]}]},f:[{t:2,r:"name",p:[46,7,1402]}," (",{t:2,r:"assignment",p:[46,17,1412]},") ",{p:[47,6,1434],t:7,e:"span",f:[]}]}]}," ",{p:[49,5,1457],t:7,e:"td",f:[{t:4,f:[{p:[51,7,1498],t:7,e:"span",a:{"class":["health ",{t:2,x:{r:["health_state","oxydam","toxdam","burndam","brutedam"],s:"_0(_1,_2,_3,_4)"},p:[51,27,1518]}]}}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[50,6,1468]},{t:4,n:51,f:[{t:4,f:[{p:[54,8,1626],t:7,e:"span",a:{"class":"health health-5"}}],n:50,r:"life_status",p:[53,7,1598]},{t:4,n:51,f:[{p:[56,8,1688],t:7,e:"span",a:{"class":"health health-0"}}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[60,5,1771],t:7,e:"td",f:[{t:4,f:[{p:[62,7,1812],t:7,e:"span",f:["( ",{p:[64,8,1836],t:7,e:"span",a:{"class":"oxy"},f:[{t:2,r:"oxydam",p:[64,26,1854]}]}," / ",{p:[66,8,1890],t:7,e:"span",a:{"class":"toxin"},f:[{t:2,r:"toxdam",p:[66,28,1910]}]}," / ",{p:[68,8,1946],t:7,e:"span",a:{"class":"burn"},f:[{t:2,r:"burndam",p:[68,27,1965]}]}," / ",{p:[70,8,2002],t:7,e:"span",a:{"class":"brute"},f:[{t:2,r:"brutedam",p:[70,28,2022]}]}," )"]}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[61,6,1782]},{t:4,n:51,f:[{t:4,f:[{p:[75,8,2116],t:7,e:"span",f:["Alive"]}],n:50,r:"life_status",p:[74,7,2088]},{t:4,n:51,f:[{p:[77,8,2159],t:7,e:"span",f:["Dead"]}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[81,5,2222],t:7,e:"td",f:[{t:4,f:[{p:[83,6,2260],t:7,e:"span",f:[{t:2,r:"area",p:[83,12,2266]}]}],n:50,x:{r:["pos_x"],s:"_0!=null"},p:[82,5,2232]},{t:4,n:51,f:[{p:[85,6,2302],t:7,e:"span",f:["N/A"]}],x:{r:["pos_x"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[89,6,2381],t:7,e:"td",f:[{p:[90,7,2393],t:7,e:"ui-button",a:{action:"select_person",state:[{t:2,x:{r:["can_track"],s:'_0?null:"disabled"'},p:[90,48,2434]}],params:['{"name":"',{t:2,r:"name",p:[90,100,2486]},'"}']},f:["Track"]}]}],n:50,r:"data.link_allowed",p:[88,5,2348]}]}],n:52,r:"data.sensors",p:[42,3,1281]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{341:341}],387:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,189],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,223],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,236]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,265]}]}]}," ",{p:[9,4,317],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[10,6,356],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.temperaturestatus",p:[10,19,369]}]},f:[{t:2,r:"data.occupant.bodyTemperature",p:[10,56,406]}," K"]}]}," ",{p:[12,5,472],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[13,7,507],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[13,20,520]}],max:[{t:2,r:"data.occupant.maxHealth",p:[13,54,554]}],value:[{t:2,r:"data.occupant.health",p:[13,90,590]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[14,16,632]}]},f:[{t:2,r:"data.occupant.health",p:[14,68,684]}]}]}," ",{t:4,f:[{p:[17,7,908],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[17,26,927]}]},f:[{p:[18,9,948],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[18,30,969]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,66,1005]}],state:"bad"},f:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,103,1042]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[16,5,742]}],n:50,r:"data.hasOccupant",p:[5,3,159]}]}," ",{p:[23,1,1138],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[24,3,1167],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[25,5,1199],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[25,22,1216]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[26,14,1276]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[27,14,1332]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[28,22,1391]}]}]}," ",{p:[30,3,1459],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,3,1495],t:7,e:"span",a:{"class":[{t:2,r:"data.temperaturestatus",p:[31,16,1508]}]},f:[{t:2,r:"data.cellTemperature",p:[31,44,1536]}," K"]}]}," ",{p:[33,2,1588],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[34,5,1619],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[34,22,1636]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[34,73,1687]}]}," ",{p:[35,5,1740],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[35,22,1757]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[35,86,1821]}]}]}]}," ",{p:{button:[{p:[40,5,1967],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[40,36,1998]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[42,3,2101],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[45,9,2211],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,r:"volume",p:[45,52,2254]}," units of ",{t:2,r:"name",p:[45,72,2274]}]},{p:[45,87,2289],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[44,7,2171]},{t:4,n:51,f:[{p:[47,9,2320],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[43,5,2136]},{t:4,n:51,f:[{p:[50,7,2396],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],388:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle" -},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],389:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{341:341}],390:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,183],t:7,e:"ui-section",a:{label:"Items in storage"},f:[{p:[7,4,225],t:7,e:"span",f:[{t:2,r:"data.items",p:[7,10,231]}]}]}],n:50,r:"data.items",p:[5,3,159]}," ",{t:4,f:[{p:[11,5,310],t:7,e:"ui-section",a:{label:"State"},f:[{p:[12,7,344],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[12,20,357]}]},f:[{t:2,r:"data.occupant.stat",p:[12,49,386]}]}]}," ",{p:[14,5,439],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[15,7,474],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[15,20,487]}],max:[{t:2,r:"data.occupant.maxHealth",p:[15,54,521]}],value:[{t:2,r:"data.occupant.health",p:[15,90,557]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[16,16,599]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[16,68,651]}]}]}," ",{t:4,f:[{p:[19,7,888],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[19,26,907]}]},f:[{p:[20,9,928],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[20,30,949]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[20,66,985]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[20,103,1022]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[18,5,722]}," ",{p:[23,5,1109],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[24,9,1145],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[24,22,1158]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[24,68,1204]}]}]}," ",{p:[26,5,1287],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[27,9,1323],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[27,22,1336]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[27,68,1382]}]}]}," ",{p:[29,5,1466],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[31,11,1553],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[31,54,1596]}," units of ",{t:2,r:"name",p:[31,89,1631]}]},{p:[31,104,1646],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[30,9,1508]},{t:4,n:51,f:[{p:[33,11,1681],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[10,3,283]}]}," ",{p:[38,1,1777],t:7,e:"ui-display",a:{title:"Operations"},f:[{p:[39,3,1812],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[41,7,1872],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied"],s:'_0?null:"disabled"'},p:[41,38,1903]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[41,111,1976]},'"}']},f:[{t:2,r:"name",p:[41,121,1986]}]},{p:[41,141,2006],t:7,e:"br"}],n:52,r:"data.chem",p:[40,5,1845]}]}," ",{p:[44,2,2046],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[45,6,2079],t:7,e:"ui-button",a:{icon:"sign-out",action:"eject"},f:["Eject Contents"]}]}," ",{p:[47,2,2166],t:7,e:"ui-section",a:{label:"Self Cleaning"},f:[{p:[48,3,2204],t:7,e:"ui-button",a:{icon:"recycle",action:"cleaning"},f:["Self-Clean Cycle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],391:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{341:341}],392:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{341:341}],393:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{341:341}],394:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{341:341}],395:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,20],t:7,e:"ui-notice",f:["Currently syncing with the database"]}],n:50,r:"data.sync",p:[1,1,0]},{t:4,n:51,f:[{p:{button:[{p:[8,4,163],t:7,e:"ui-button",a:{icon:"eject",action:"eject_all"},f:["Eject all"]}," ",{p:[9,4,232],t:7,e:"ui-button",a:{icon:["toggle-",{t:2,x:{r:["data.show_materials"],s:'_0?"off":"on"'},p:[9,28,256]}],action:"toggle_materials_visibility"},f:[{t:2,x:{r:["data.show_materials"],s:'_0?"Hide":"Show"'},p:[10,5,339]}]}]},t:7,e:"ui-display",a:{title:"Materials",button:0},f:[" ",{t:4,f:[{p:[14,4,449],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[15,5,484],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[16,6,520],t:7,e:"section",a:{"class":"cell"}}," ",{p:[17,6,559],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[20,6,620],t:7,e:"section",a:{"class":"cell"},f:["Amount"]}," ",{p:[23,6,680],t:7,e:"section",a:{"class":"cell"}}," ",{p:[24,6,719],t:7,e:"section",a:{"class":"cell"}}]}," ",{t:4,f:[{p:[27,6,808],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[28,7,845],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[29,8,876]}]}," ",{p:[31,7,910],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"amount",p:[32,8,941]}]}," ",{p:[34,7,977],t:7,e:"section",a:{"class":"cell"},f:[{p:[35,8,1008],t:7,e:"ui-button",a:{icon:"eject"},f:["Release amount"]}]}," ",{p:[37,7,1084],t:7,e:"section",a:{"class":"cell",style:"width: 40px;"},f:[{p:[38,8,1136],t:7,e:"ui-button",a:{icon:"eject"},f:["Release all"]}]}]}],n:52,r:"data.all_materials",p:[26,5,773]}]}],n:50,r:"data.show_materials",p:[13,3,417]}]}," ",{p:[45,2,1274],t:7,e:"ui-display",a:{title:"Categories"},f:[{t:4,f:[{p:[47,4,1334],t:7,e:"ui-button",f:[{t:2,r:".",p:[47,15,1345]}]}],r:"data.categories",p:[46,3,1309]}]}],r:"data.sync"}]},e.exports=a.extend(r.exports)},{341:341}],396:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,5,49],t:7,e:"ui-button",a:{action:"toggle_power",style:[{t:2,x:{r:["data.toggle"],s:'_0?"selected":null'},p:[5,18,111]}]},f:["Turn ",{t:2,x:{r:["data.toggle"],s:'_0?"off":"on"'},p:[6,16,166]}]}]}," ",{p:[9,3,235],t:7,e:"ui-display",a:{title:"Logging"},f:[{t:4,f:[{p:[11,3,292],t:7,e:"ui-section",a:{label:">"},f:[{t:2,r:".",p:[11,25,314]},{p:[11,30,319],t:7,e:"ui-section",f:[]}]}],n:52,r:"data.logs",p:[10,5,269]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],397:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{341:341}],398:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{341:341}],399:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],400:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=a.extend(r.exports)},{341:341}],401:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{341:341}],402:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],403:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{341:341}],404:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{341:341}],405:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],406:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{341:341}],407:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224],t:7,e:"b",f:[{t:2,r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["â†"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button",a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2,r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down" -},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{341:341}],408:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{341:341}],409:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{341:341}],410:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Chamber Console"},f:[{p:[2,1,45],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,2,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,63,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,3,200],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[6,36,233]}]}," ",{p:[7,3,268],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[7,35,300]}]}," ",{p:[8,3,335],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[8,41,373]}]}," ",{t:4,f:[{p:[10,4,477],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[10,41,514]}]}],n:50,r:"data.disk.activation_delay",p:[9,3,438]}," ",{t:4,f:[{p:[13,4,600],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[13,30,626]}]}," ",{p:[14,4,663],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[14,36,695]}]}],n:50,r:"data.disk.timer",p:[12,3,572]}," ",{t:4,f:[{p:[17,4,785],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[17,40,821]}]}],n:50,r:"data.disk.activation_code",p:[16,3,747]}," ",{t:4,f:[{p:[20,4,918],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[20,42,956]}]}],n:50,r:"data.disk.deactivation_code",p:[19,3,878]}," ",{t:4,f:[{p:[23,4,1047],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[23,34,1077]}]}],n:50,r:"data.disk.kill_code",p:[22,3,1015]}," ",{t:4,f:[{p:[26,4,1163],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[26,37,1196]}]}],n:50,r:"data.disk.trigger_code",p:[25,3,1128]}," ",{t:4,f:[{t:4,f:[{p:[30,6,1332],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[30,25,1351]}]},f:[{t:2,r:"value",p:[30,35,1361]}]}],n:52,r:"data.disk.extra_settings",p:[29,4,1291]}],n:50,r:"data.disk.has_extra_settings",p:[28,3,1250]}],n:50,r:"data.has_program",p:[5,2,172]},{t:4,n:51,f:[{p:[34,3,1423],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,1,80]},{t:4,n:51,f:[{p:[37,2,1489],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[40,1,1550],t:7,e:"br"}," ",{t:4,f:[{p:[42,2,1582],t:7,e:"ui-notice",f:[{t:2,r:"data.status_msg",p:[42,13,1593]}]}],n:50,r:"data.status_msg",p:[41,1,1556]},{t:4,n:51,f:[{p:[44,2,1637],t:7,e:"ui-display",a:{title:"Chamber"},f:[{p:[45,2,1668],t:7,e:"ui-section",f:[{p:[45,14,1680],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock-open":"lock"'},p:[45,30,1696]}],action:"toggle_lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[45,90,1756]}," Chamber"]},{p:[45,146,1812],t:7,e:"br"}]}," ",{p:[46,2,1832],t:7,e:"ui-section",f:[{p:[46,14,1844],t:7,e:"b",f:["Occupant:"]}," ",{t:2,r:"data.occupant_name",p:[46,31,1861]}]}," ",{t:4,f:[{p:[48,4,1929],t:7,e:"ui-section",f:[{p:[48,16,1941],t:7,e:"ui-notice",f:["No nanites detected."]}]}," ",{p:[49,4,2002],t:7,e:"ui-section",f:[{p:[49,16,2014],t:7,e:"ui-button",a:{icon:"syringe",action:"nanite_injection"},f:["Implant Nanites"]}]}],n:50,x:{r:["data.has_nanites"],s:"!_0"},p:[47,2,1899]},{t:4,n:51,f:[{p:[51,3,2121],t:7,e:"ui-display",a:{title:"Nanites"},f:[{t:4,f:[{p:[53,5,2181],t:7,e:"ui-button",a:{icon:"download",action:"add_program"},f:["Install Program From Disk"]},{p:[53,90,2266],t:7,e:"br"}," ",{p:[54,5,2276],t:7,e:"br"}],n:50,r:"data.has_disk",p:[52,4,2154]}," ",{p:[56,4,2297],t:7,e:"ui-section",f:[{p:[57,5,2315],t:7,e:"ui-section",a:{label:"Nanite Volume"},f:[{t:2,r:"data.nanite_volume",p:[57,39,2349]}]}," ",{p:[58,5,2390],t:7,e:"ui-section",a:{label:"Growth Rate"},f:[{t:2,r:"data.regen_rate",p:[58,37,2422]}]}," ",{p:[59,5,2460],t:7,e:"ui-section",a:{label:"Safety Threshold"},f:[{t:2,r:"data.safety_threshold",p:[59,42,2497]}," ",{p:[59,68,2523],t:7,e:"ui-button",a:{icon:"pencil",action:"set_safety"},f:["Set"]}]}," ",{p:[60,5,2603],t:7,e:"ui-section",a:{label:"Cloud ID"},f:[{t:2,x:{r:["data.cloud_id"],s:'_0?_0:"No Cloud"'},p:[60,34,2632]}," ",{p:[60,82,2680],t:7,e:"ui-button",a:{icon:"pencil",action:"set_cloud"},f:["Set"]}]}]}," ",{p:[62,4,2776],t:7,e:"ui-display",a:{title:"Programs"},f:[{t:4,f:[{p:[64,6,2845],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[64,25,2864]}],button:0},f:[{p:[65,6,2888],t:7,e:"ui-button",a:{icon:"minus",action:"remove_program",params:['{"program_id": "',{t:2,r:"id",p:[65,78,2960]},'"}']},f:["Uninstall"]}," ",{p:[66,6,2998],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[66,38,3030]}]}," ",{t:4,f:[{p:[68,7,3094],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[68,45,3132]}]}," ",{p:[69,7,3191],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[69,44,3228]},"/s"]}," ",{t:4,f:[{p:[71,8,3291],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[71,41,3324]}]}," ",{p:[72,8,3362],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[72,45,3399]}," seconds"]}],n:50,r:"can_trigger",p:[70,7,3263]}," ",{t:4,f:[{t:4,f:[{p:[76,9,3534],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,46,3571]}]}],n:50,r:"activation_delay",p:[75,8,3500]}," ",{t:4,f:[{p:[79,9,3652],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,35,3678]}]}," ",{p:[80,9,3710],t:7,e:"ui-section",a:{label:"Timer Type"},f:[{t:2,r:"timer_type",p:[80,40,3741]}]}],n:50,r:"timer",p:[78,8,3629]}," ",{t:4,f:[{t:4,f:[{p:[84,11,3865],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,30,3884]}]},f:[{t:2,r:"value",p:[84,40,3894]}]}],n:52,r:"extra_settings",p:[83,9,3829]}],n:50,r:"has_extra_settings",p:[82,8,3793]}," ",{t:4,f:[{t:4,f:[{p:[89,10,4032],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[89,46,4068]}]}],n:50,r:"activation_code",p:[88,9,3998]}," ",{t:4,f:[{p:[92,10,4163],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[92,48,4201]}]}],n:50,r:"deactivation_code",p:[91,9,4127]}," ",{t:4,f:[{p:[95,10,4290],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[95,40,4320]}]}],n:50,r:"kill_code",p:[94,9,4262]}," ",{t:4,f:[{p:[98,10,4404],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[98,43,4437]}]}],n:50,r:"trigger_code",p:[97,9,4373]}],n:50,x:{r:["data.scan_level"],s:"_0>=4"},p:[87,8,3960]}],n:50,x:{r:["data.scan_level"],s:"_0>=3"},p:[74,7,3463]}],n:50,x:{r:["data.scan_level"],s:"_0>=2"},p:[67,6,3058]}]}],n:52,r:"data.mob_programs",p:[63,5,2811]}]}]}],x:{r:["data.has_nanites"],s:"!_0"}}]}],r:"data.status_msg"}]}]},e.exports=a.extend(r.exports)},{341:341}],411:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Cloud Console"},f:[{p:[2,1,43],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,3,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,64,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,4,202],t:7,e:"ui-section",f:[{p:[7,5,220],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[7,38,253]}]}," ",{p:[8,5,290],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[8,37,322]}]}," ",{p:[9,5,359],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[9,43,397]}]}," ",{t:4,f:[{p:[11,6,505],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[11,43,542]}]}],n:50,r:"data.disk.activation_delay",p:[10,5,464]}," ",{t:4,f:[{p:[14,6,634],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[14,32,660]}]}," ",{p:[15,6,699],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[15,38,731]}]}],n:50,r:"data.disk.timer",p:[13,5,604]}," ",{t:4,f:[{p:[18,6,827],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[18,42,863]}]}],n:50,r:"data.disk.activation_code",p:[17,5,787]}," ",{t:4,f:[{p:[21,6,966],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[21,44,1004]}]}],n:50,r:"data.disk.deactivation_code",p:[20,5,924]}," ",{t:4,f:[{p:[24,6,1101],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[24,36,1131]}]}],n:50,r:"data.disk.kill_code",p:[23,5,1067]}," ",{t:4,f:[{p:[27,6,1223],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[27,39,1256]}]}],n:50,r:"data.disk.trigger_code",p:[26,5,1186]}," ",{t:4,f:[{t:4,f:[{p:[31,8,1400],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[31,27,1419]}]},f:[{t:2,r:"value",p:[31,37,1429]}]}],n:52,r:"data.disk.extra_settings",p:[30,6,1357]}],n:50,r:"data.disk.has_extra_settings",p:[29,5,1314]}]}],n:50,r:"data.has_program",p:[5,3,173]},{t:4,n:51,f:[{p:[36,4,1515],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,2,79]},{t:4,n:51,f:[{p:[39,3,1584],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[42,1,1646],t:7,e:"ui-display",a:{title:"Cloud Storage"},f:[{t:4,f:[{p:[44,3,1713],t:7,e:"ui-button",a:{icon:"plus-circle",action:"create_backup"},f:["Create New Backup"]}," ",{p:[45,3,1799],t:7,e:"ui-display",a:{title:"Active Backups"},f:[{t:4,f:[{p:[47,5,1873],t:7,e:"ui-button",a:{action:"set_view",params:['{"view": "',{t:2,r:"cloud_id",p:[47,52,1920]},'"}']},f:["Backup #",{t:2,r:"cloud_id",p:[47,76,1944]}]}],n:52,r:"data.cloud_backups",p:[46,4,1839]}]}],n:50,x:{r:["data.current_view"],s:"!_0"},p:[43,2,1683]},{t:4,n:51,f:[{p:[51,3,2014],t:7,e:"ui-button",a:{icon:"undo",action:"set_view",params:'{"view": "0"}'},f:["Return"]}," ",{t:4,f:[{p:[53,4,2131],t:7,e:"ui-notice",f:["ERROR: Backup not found."]}],n:50,x:{r:["data.cloud_backup"],s:"!_0"},p:[52,3,2100]},{t:4,n:51,f:[{p:[55,4,2195],t:7,e:"ui-display",a:{title:["Backup #",{t:2,r:"data.current_view",p:[55,31,2222]}]},f:[{t:4,f:[{p:[57,6,2282],t:7,e:"ui-button",a:{icon:"upload",action:"upload_program",style:"selected"},f:["Upload Program From Disk"]},{p:[57,108,2384],t:7,e:"br"}],n:50,r:"data.has_program",p:[56,5,2251]}," ",{t:4,f:[{p:[60,6,2443],t:7,e:"hr"}," ",{p:[61,6,2454],t:7,e:"ui-section",f:[{p:[62,7,2474],t:7,e:"h3",f:[{t:2,r:"name",p:[62,11,2478]}]}," ",{p:[63,7,2499],t:7,e:"div",a:{style:"float:right"},f:[{p:[64,8,2533],t:7,e:"ui-button",a:{icon:"minus-circle",action:"remove_program",style:"danger",params:['{"program_id": "',{t:2,r:"id",p:[64,102,2627]},'"}']},f:["Uninstall"]}]}]}," ",{p:[67,6,2699],t:7,e:"ui-section",f:[{p:[68,7,2719],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[68,39,2751]}]}," ",{p:[69,7,2780],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[69,45,2818]}]}," ",{p:[70,7,2877],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[70,44,2914]},"/s"]}," ",{t:4,f:[{p:[72,8,2977],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[72,41,3010]},"/s"]}," ",{p:[73,8,3050],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[73,45,3087]},"/s"]}],n:50,r:"can_trigger",p:[71,7,2949]}," ",{t:4,f:[{p:[76,8,3178],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,45,3215]}]}],n:50,r:"activation_delay",p:[75,7,3145]}," ",{t:4,f:[{p:[79,8,3293],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,34,3319]}]}," ",{p:[80,8,3350],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"timer_type",p:[80,40,3382]}]}],n:50,r:"timer",p:[78,7,3271]}," ",{t:4,f:[{p:[83,8,3464],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[83,44,3500]}]}],n:50,r:"activation_code",p:[82,7,3432]}," ",{t:4,f:[{p:[86,8,3589],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[86,46,3627]}]}],n:50,r:"deactivation_code",p:[85,7,3555]}," ",{t:4,f:[{p:[89,8,3710],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[89,38,3740]}]}],n:50,r:"kill_code",p:[88,7,3684]}," ",{t:4,f:[{p:[92,8,3818],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[92,41,3851]}]}],n:50,r:"trigger_code",p:[91,7,3789]}," ",{t:4,f:[{t:4,f:[{p:[96,10,3973],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[96,29,3992]}]},f:[{t:2,r:"value",p:[96,39,4002]}]}],n:52,r:"extra_settings",p:[95,8,3938]}],n:50,r:"has_extra_settings",p:[94,7,3903]}]}],n:52,r:"data.cloud_programs",p:[59,5,2407]}]}],x:{r:["data.cloud_backup"],s:"!_0"}}],x:{r:["data.current_view"],s:"!_0"}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],412:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Program Hub"},f:[{t:4,f:[{p:[3,2,65],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{p:[4,3,102],t:7,e:"ui-section",f:[{p:[5,4,119],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{p:[6,4,185],t:7,e:"ui-button",a:{icon:"minus-circle",action:"clear"},f:["Delete Program"]}]}," ",{t:4,f:[{p:[9,4,307],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[9,37,340]}]}," ",{p:[10,4,376],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[10,36,408]}]}],n:50,r:"data.has_program",p:[8,3,278]},{t:4,n:51,f:[{p:[12,4,456],t:7,e:"ui-notice",f:["No program installed."]}],r:"data.has_program"}]}],n:50,r:"data.has_disk",p:[2,1,41]},{t:4,n:51,f:[{p:[16,2,540],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"},{p:[18,1,586],t:7,e:"br"}," ",{p:[19,1,592],t:7,e:"ui-display",a:{title:"Programs"},f:[{p:[20,2,624],t:7,e:"ui-section",f:[{p:[21,3,640],t:7,e:"ui-button",a:{icon:"undo",action:"set_category",params:'{"category": "Main"}'},f:["Return"]}," ",{p:[22,3,737],t:7,e:"ui-button",a:{icon:"align-justify ",action:"toggle_details"},f:[{t:2,x:{r:["data.detail_view"],s:'_0?"Compact View":"Detailed View"'},p:[22,60,794]}]}]}," ",{t:4,f:[{p:[25,3,916],t:7,e:"ui-display",f:[{t:4,f:[{p:[27,5,964],t:7,e:"ui-section",f:[{p:[27,17,976],t:7,e:"ui-button",a:{action:"set_category",params:['{"category": "',{t:2,r:"name",p:[27,72,1031]},'"}']},f:[{t:2,r:"name",p:[27,84,1043]}]}]}],n:52,r:"data.categories",p:[26,4,933]}]}],n:50,x:{r:["data.category"],s:'_0=="Main"'},p:[24,2,881]},{t:4,n:51,f:[{p:[31,3,1122],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[31,22,1141]}]},f:[{t:4,f:[{t:4,f:[{p:[34,6,1229],t:7,e:"ui-display",f:[{p:[35,7,1249],t:7,e:"ui-section",f:[{p:[35,19,1261],t:7,e:"b",f:[{t:2,r:"name",p:[35,22,1264]}]}]}," ",{p:[36,7,1297],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[36,19,1309]}]}," ",{p:[37,7,1338],t:7,e:"ui-section",f:[{p:[38,8,1359],t:7,e:"ui-button",a:{icon:"download",action:"download",params:['{"program_id": "',{t:2,r:"id",p:[38,77,1428]},'"}'],state:[{t:2,x:{r:["data.has_disk"],s:'_0?null:"disabled"'},p:[38,94,1445]}]},f:["Download"]}]}]}],n:50,r:"data.detail_view",p:[33,5,1198]},{t:4,n:51,f:[{p:[44,6,1585],t:7,e:"ui-section",f:[{p:[44,18,1597],t:7,e:"ui-button",a:{action:"download",params:['{"program_id": "',{t:2,r:"id",p:[44,71,1650]},'"}']},f:[{t:2,r:"name",p:[44,81,1660]}]}]}],r:"data.detail_view"}],n:52,r:"data.program_list",p:[32,4,1165]}]}],x:{r:["data.category"],s:'_0=="Main"'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],413:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Programming"},f:[{t:4,f:[{p:[3,3,67],t:7,e:"ui-notice",f:["Insert a nanite program disk."]}],n:50,x:{r:["data.has_disk"],s:"!_0"},p:[2,1,41]},{t:4,n:51,f:[{p:[5,3,133],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{t:4,f:[{p:[7,5,229],t:7,e:"ui-notice",f:["No program detected."]}],n:50,x:{r:["data.has_program"],s:"!_0"},p:[6,3,198]},{t:4,n:51,f:[{p:[9,5,290],t:7,e:"ui-section",f:[{p:[10,7,310],t:7,e:"ui-display",a:{title:[{t:2,r:"data.name",p:[10,26,329]}]},f:[{t:2,r:"data.desc",p:[11,9,354]}]}]}," ",{p:[14,5,413],t:7,e:"ui-section",f:[{p:[15,7,433],t:7,e:"ui-section",a:{label:"Program Info"},f:["Nanites Consumed: ",{t:2,r:"data.use_rate",p:[16,26,493]},{p:[16,43,510],t:7,e:"br"}," ",{t:4,f:["Trigger Cost: ",{t:2,r:"data.trigger_cost",p:[18,25,574]},"u",{p:[18,47,596],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[17,9,524]}]}," ",{p:[22,7,648],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[23,9,685],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.activated"],s:'_0?"toggle-on":"toggle-off"'},p:[24,17,713]}],action:"toggle_active"},f:[{t:2,x:{r:["data.activated"],s:'_0?"Active":"Inactive"'},p:[26,11,809]}]}]}," ",{p:[30,7,905],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[31,9,944],t:7,e:"ui-button",a:{icon:"pencil",action:"set_activation_delay"}}," Activation Delay: ",{t:2,r:"data.activation_delay",p:[31,95,1030]}," ",{p:[31,121,1056],t:7,e:"br"}," ",{p:[32,9,1070],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer"}}," Timer: ",{t:2,r:"data.timer",p:[32,73,1134]}," ",{p:[32,88,1149],t:7,e:"br"}," ",{p:[33,9,1163],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer_type"}}," Timer Type: ",{t:2,r:"data.timer_type",p:[33,83,1237]}," ",{p:[33,103,1257],t:7,e:"br"}]}," ",{p:[36,7,1292],t:7,e:"ui-section",a:{label:"Codes"},f:[{p:[37,9,1328],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "activation"}'}}," Activation Code: ",{t:2,r:"data.activation_code",p:[37,121,1440]}," ",{p:[37,146,1465],t:7,e:"br"}," ",{p:[38,9,1479],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "deactivation"}'}}," Deactivation Code: ",{t:2,r:"data.deactivation_code",p:[38,125,1595]}," ",{p:[38,152,1622],t:7,e:"br"}," ",{p:[39,9,1636],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "kill"}'}}," Kill Code: ",{t:2,r:"data.kill_code",p:[39,109,1736]}," ",{p:[39,128,1755],t:7,e:"br"}," ",{t:4,f:[{p:[41,11,1805],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "trigger"}'}}," Trigger Code: ",{t:2,r:"data.trigger_code",p:[41,117,1911]}," ",{p:[41,139,1933],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[40,9,1769]}]}," ",{t:4,f:[{p:[46,9,2026],t:7,e:"ui-section",a:{label:"Special"},f:[{t:4,f:[{p:[48,13,2109],t:7,e:"ui-button",a:{icon:"pencil",action:"set_extra_setting",params:['{"target_setting": "',{t:2,r:"name",p:[48,93,2189]},'"}']}}," ",{t:2,r:"name",p:[48,118,2214]},": ",{t:2,r:"value",p:[48,128,2224]}," ",{p:[48,138,2234],t:7,e:"br"}],n:52,r:"data.extra_settings",p:[47,11,2066]}]}],n:50,r:"data.has_extra_settings",p:[45,7,1985]}]}],x:{r:["data.has_program"],s:"!_0"}}],x:{r:["data.has_disk"],s:"!_0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],414:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Control"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-notice",f:["The interface is locked."]}],n:50,r:"data.locked",p:[2,1,37]},{t:4,n:51,f:[{p:[5,3,121],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock Interface"]}," ",{p:[6,3,188],t:7,e:"ui-button",a:{icon:"save",action:"save"},f:["Save Current Setting"]}," ",{p:[7,3,261],t:7,e:"ui-section",a:{label:"Signal Code"},f:[{p:[8,5,299],t:7,e:"span",f:[{t:2,r:"data.code",p:[8,11,305]}]}," ",{p:[9,4,330],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code"},f:["Set"]}]}," ",{t:4,f:[{p:[12,5,443],t:7,e:"ui-section",a:{label:"Relay Code"},f:[{p:[13,7,482],t:7,e:"span",f:[{t:2,r:"data.relay_code",p:[13,13,488]}]}," ",{p:[14,5,520],t:7,e:"ui-button",a:{icon:"pencil",action:"set_relay_code"},f:["Set"]}]}],n:50,x:{r:["data.mode"],s:'_0=="Relay"'},p:[11,3,409]}," ",{p:[17,3,618],t:7,e:"ui-section",a:{label:"Signal Mode"},f:[{p:[18,5,656],t:7,e:"span",f:[{t:2,r:"data.mode",p:[18,11,662]}]}," ",{p:[19,5,688],t:7,e:"br"}," ",{p:[20,4,697],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Off"}'},f:["Off"]}," ",{p:[21,5,775],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Local"}'},f:["Local"]}," ",{p:[22,5,857],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Targeted"}'},f:["Targeted"]}," ",{p:[23,5,945],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Area"}'},f:["Area"]}," ",{p:[24,5,1025],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Relay"}'},f:["Relay"]}]}],r:"data.locked"}]}," ",{p:[28,1,1144],t:7,e:"ui-display",a:{title:"Saved Settings"},f:[{t:4,f:[{p:[30,3,1215],t:7,e:"ui-button",a:{icon:"load",action:"load",params:['{"save_id": "',{t:2,r:"id",p:[30,61,1273]},'"}']},f:[{t:2,r:"name",p:[30,71,1283]}]}," ",{t:4,f:[{p:[32,4,1332],t:7,e:"ui-button",a:{icon:"remove",action:"remove_save",params:['{"save_id": "',{t:2,r:"id",p:[32,71,1399]},'"}']},f:["Remove"]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[31,3,1307]}," ",{p:[34,3,1442],t:7,e:"br"}],n:52,r:"data.saved_settings",p:[29,2,1182]}]}]},e.exports=a.extend(r.exports)},{341:341}],415:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ghost roles"},f:[{p:[2,2,35],t:7,e:"ui-section",a:{label:"Ignored roles"},f:[{t:4,f:[{p:[4,4,99],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[4,21,116]}],style:[{t:2,x:{r:["enabled"],s:'_0?"danger":null'},p:[4,73,168]}],action:"toggle_ignore",params:['{"key": "',{t:2,r:"key",p:[4,144,239]},'"}']},f:[{t:2,r:"desc",p:[4,155,250]}]}],n:52,r:"data.ignore",p:[3,3,73]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],416:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{341:341}],417:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236]}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table",f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582], -t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],418:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';"},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],419:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],420:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],421:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:["   "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],422:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],423:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],424:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],425:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}' -},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],426:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],427:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}]}]}," ",{p:[55,5,1528],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1563],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1569]}]}]}],r:"config.fancy"}]}," ",{p:[60,1,1638],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1668],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1693],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1730],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1769],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1806],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1845],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1887],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1928],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2013],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2032]}],nowrap:0},f:[{p:[72,7,2057],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2078]}," %"]}," ",{p:[73,7,2136],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[73,28,2157]}]}," ",{p:[74,7,2199],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2220],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2233]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2262]}]}]}," ",{p:[75,7,2309],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2330],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2343]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2366]}," [",{p:[75,87,2389],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2395]}]},"]"]}]}," ",{p:[76,7,2444],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2465],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2478]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2501]}," [",{p:[76,87,2524],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2530]}]},"]"]}]}," ",{p:[77,7,2579],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2600],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2613]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2636]}," [",{p:[77,87,2659],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2665]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1987]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],428:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],429:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],430:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],431:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{341:341}],432:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],433:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,25],t:7,e:"ui-button",a:{icon:"undo",action:"change_menu",params:'{"menu": "1"}'},f:["Return"]}," ",{p:[3,2,113],t:7,e:"ui-display",a:{title:"Advanced Surgery Procedures"},f:[{p:[4,3,165],t:7,e:"ui-button",a:{icon:"download",action:"sync"},f:["Sync with research database"]}," ",{t:4,f:[{p:[6,4,278],t:7,e:"ui-display",f:[{p:[7,6,297],t:7,e:"ui-section",f:[{p:[7,18,309],t:7,e:"b",f:[{t:2,r:"name",p:[7,21,312]}]}]}," ",{p:[8,6,344],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[8,18,356]}]}]}],n:52,r:"data.surgeries",p:[5,3,249]}]}],n:50,x:{r:["data.menu"],s:"_0==2"},p:[1,1,0]},{t:4,n:51,f:[{p:[13,2,437],t:7,e:"ui-button",a:{action:"change_menu",params:'{"menu": "2"}'},f:["View Surgery Procedures"]}," ",{t:4,f:[{p:[15,3,556],t:7,e:"ui-notice",f:["No table detected!"]}],n:51,r:"data.table",p:[14,2,530]}," ",{p:[19,2,623],t:7,e:"ui-display",f:[{p:[20,3,639],t:7,e:"ui-display",a:{title:"Patient State"},f:[{t:4,f:[{p:[22,5,704],t:7,e:"ui-section",a:{label:"State"},f:[{p:[23,6,737],t:7,e:"span",a:{"class":[{t:2,r:"data.patient.statstate",p:[23,19,750]}]},f:[{t:2,r:"data.patient.stat",p:[23,47,778]}]}]}," ",{p:[25,5,831],t:7,e:"ui-section",a:{label:"Blood Type"},f:[{p:[26,6,869],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.patient.blood_type",p:[26,28,891]}]}]}," ",{p:[28,5,950],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,6,984],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.patient.minHealth",p:[29,19,997]}],max:[{t:2,r:"data.patient.maxHealth",p:[29,52,1030]}],value:[{t:2,r:"data.patient.health",p:[29,87,1065]}],state:[{t:2,x:{r:["data.patient.health"],s:'_0>=0?"good":"average"'},p:[30,13,1103]}]},f:[{t:2,x:{r:["adata.patient.health"],s:"Math.round(_0)"},p:[30,64,1154]}]}]}," ",{t:4,f:[{p:[33,6,1389],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[33,25,1408]}]},f:[{p:[34,7,1427],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.patient.maxHealth",p:[34,28,1448]}],value:[{t:2,rx:{r:"data.patient",m:[{t:30,n:"type"}]},p:[34,63,1483]}],state:"bad"},f:[{t:2,x:{r:["type","adata.patient"],s:"Math.round(_1[_0])"},p:[34,99,1519]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}]'},p:[32,5,1224]}],n:50,r:"data.patient",p:[21,4,678]},{t:4,n:51,f:["No patient detected."],r:"data.patient"}]}," ",{p:[41,3,1670],t:7,e:"ui-display",a:{title:"Initiated Procedures"},f:[{t:4,f:[{t:4,f:[{p:[44,6,1777],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[44,28,1799]}]},f:[{p:[45,7,1817],t:7,e:"ui-section",a:{label:"Next Step"},f:[{p:[46,8,1856],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"next_step",p:[46,30,1878]}]}," ",{t:4,f:[{p:[48,9,1937],t:7,e:"span",a:{"class":"content"},f:[{p:[48,31,1959],t:7,e:"b",f:["Required chemicals:"]},{p:[48,57,1985],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[48,62,1990]}]}],n:50,r:"chems_needed",p:[47,8,1907]}]}," ",{t:4,f:[{p:[52,8,2091],t:7,e:"ui-section",a:{label:"Alternative Step"},f:[{p:[53,9,2138],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"alternative_step",p:[53,31,2160]}]}," ",{t:4,f:[{p:[55,10,2232],t:7,e:"span",a:{"class":"content"},f:[{p:[55,32,2254],t:7,e:"b",f:["Required chemicals:"]},{p:[55,58,2280],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[55,63,2285]}]}],n:50,r:"alt_chems_needed",p:[54,9,2197]}]}],n:50,r:"alternative_step",p:[51,7,2058]}]}],n:52,r:"data.procedures",p:[43,5,1745]}],n:50,r:"data.procedures",p:[42,4,1716]},{t:4,n:51,f:["No active procedures."],r:"data.procedures"}]}]}],x:{r:["data.menu"],s:"_0==2"}}]},e.exports=a.extend(r.exports)},{341:341}],434:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed points: ",{t:2,r:"data.unclaimedPoints",p:[6,29,159]}," ",{t:4,f:[{p:[8,4,220],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim Points"]}],n:50,r:"data.unclaimedPoints",p:[7,3,187]}]}," ",{p:[13,2,311],t:7,e:"ui-section",f:[{t:4,f:[{p:[15,4,350],t:7,e:"ui-button",a:{action:"Eject"},f:["Eject ID"]}," You have ",{t:2,r:"data.claimedPoints",p:[18,13,421]}," mining points collected."],n:50,r:"data.hasID",p:[14,3,327]},{t:4,n:51,f:[{p:[20,4,485],t:7,e:"ui-button",a:{action:"Insert"},f:["Insert ID"]}],r:"data.hasID"}]}]}," ",{p:[26,1,588],t:7,e:"ui-display",f:[{t:4,f:[{p:[28,3,627],t:7,e:"ui-section",f:[{p:[29,4,644],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[34,4,772],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[35,5,808],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[35,42,845]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[35,129,932]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[38,10,988]},": ",{t:2,r:"name",p:[38,21,999]}]}],n:52,r:"data.diskDesigns",p:[33,3,741]}],n:50,r:"data.hasDisk",p:[27,2,603]},{t:4,n:51,f:[{p:[42,3,1053],t:7,e:"ui-section",f:[{p:[43,4,1070],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{t:4,f:[{p:[50,2,1223],t:7,e:"ui-display",f:[{p:[51,3,1239],t:7,e:"ui-section",f:[{p:[52,4,1256],t:7,e:"b",f:["Warning"]},": ",{t:2,r:"data.disconnected",p:[52,20,1272]},". Please contact the quartermaster."]}]}],n:50,r:"data.disconnected",p:[49,1,1195]},{t:4,f:[{p:[57,2,1412],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[58,3,1445],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[59,5,1480],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[62,5,1538],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[65,5,1595],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[67,5,1639],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[69,5,1683],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[74,4,1785],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[75,5,1820],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[76,6,1849]}]}," ",{p:[78,5,1879],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[79,6,1922]}]}," ",{p:[81,5,1954],t:7,e:"section",a:{"class":"cell"},f:[{p:[82,6,1983],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[82,19,1996]}],placeholder:"###","class":"number"}}]}," ",{p:[84,5,2063],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[85,6,2106],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[85,60,2160]}],params:['{ "id" : ',{t:2,r:"id",p:[85,115,2215]},', "sheets" : ',{t:2,r:"sheets",p:[85,134,2234]}," }"]},f:["Release"]}]}," ",{p:[89,5,2305],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[90,6,2348]}]}]}],n:52,r:"data.materials",p:[73,3,1756]}," ",{t:4,f:[{p:[95,4,2431],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[96,5,2466],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[97,6,2495]}]}," ",{p:[99,5,2525],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[100,6,2568]}]}," ",{p:[102,5,2600],t:7,e:"section",a:{"class":"cell"},f:[{p:[103,6,2629],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[103,19,2642]}],placeholder:"###","class":"number"}}]}," ",{p:[105,5,2709],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[106,6,2752],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[106,58,2804]}],params:['{ "id" : ',{t:2,r:"id",p:[106,114,2860]},', "sheets" : ',{t:2,r:"sheets",p:[106,133,2879]}," }"]},f:["Smelt"]}]}," ",{p:[110,5,2947],t:7,e:"section",a:{"class":"cell",align:"right"},f:[]}]}],n:52,r:"data.alloys",p:[94,3,2405]}]}],n:50,x:{r:["data.materials","data.alloys"],s:"_0||_1"},p:[56,1,1372]}]},e.exports=a.extend(r.exports)},{341:341}],435:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,4,87],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[4,36,119]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[7,4,231],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[7,35,262]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[10,4,358], -t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[10,35,389]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[15,4,528],t:7,e:"ui-section",f:[{t:4,f:[{p:[17,6,578],t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[16,5,546]},{t:4,n:51,f:[{p:[19,6,644],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[21,8,712],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[21,38,742]}]}," ",{p:[22,8,782],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[22,39,813]}]}],n:50,r:"data.has_blood",p:[20,7,681]},{t:4,n:51,f:[{p:[24,8,870],t:7,e:"ui-section",f:[{p:[25,9,892],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[14,3,500]},{t:4,n:51,f:[{p:[32,4,1054],t:7,e:"ui-section",f:[{p:[33,5,1072],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[38,3,1188],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[43,8,1343],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[43,64,1399]}],params:['{"index": ',{t:2,r:"index",p:[43,116,1451]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[42,7,1320]}," ",{p:[47,7,1538],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[47,69,1600]}],params:['{"index": ',{t:2,r:"index",p:[47,124,1655]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,24,1269]}],button:0},f:[" ",{p:[51,6,1749],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[51,40,1783]}]}," ",{p:[52,6,1812],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[52,38,1844]}]}," ",{p:[53,6,1879],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[53,33,1906]}]}," ",{p:[54,6,1936],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[54,40,1970]}]}," ",{t:4,f:[{p:[56,7,2021],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[58,9,2087],t:7,e:"ui-button",a:{action:"symptom_details",state:"",params:['{"picked_symptom": ',{t:2,r:"sym_index",p:[58,81,2159]},', "index": ',{t:2,r:"index",p:[58,105,2183]},"}"]},f:[{t:2,r:"name",p:[59,10,2206]}," "]},{p:[60,21,2236],t:7,e:"br"}],n:52,r:"symptoms",p:[57,8,2059]}]}," ",{p:[63,7,2289],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[63,38,2320]}]}," ",{p:[64,7,2355],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[64,35,2383]}]}," ",{p:[65,7,2415],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[65,39,2447]}]}," ",{p:[66,7,2483],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[66,44,2520]}]}],n:50,r:"is_adv",p:[55,6,1999]}]}],n:52,r:"data.viruses",p:[39,4,1222]},{t:4,n:51,f:[{p:[70,5,2601],t:7,e:"ui-section",f:[{p:[71,6,2620],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[75,3,2743],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[77,5,2811],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[77,24,2830]}]},f:[{p:[78,7,2848],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[78,43,2884]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[78,129,2970]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[76,4,2779]},{t:4,n:51,f:[{p:[83,5,3067],t:7,e:"ui-section",f:[{p:[84,6,3086],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[37,2,1162]}],n:50,x:{r:["data.mode"],s:"_0==1"},p:[1,1,0]},{t:4,n:51,f:[{p:[90,2,3231],t:7,e:"ui-button",a:{icon:"undo",state:"",action:"back"},f:["Back"]}," ",{t:4,f:[{p:[94,4,3330],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[94,23,3349]}]},f:[{p:[95,4,3364],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[96,5,3382]}," ",{t:4,f:[{p:[98,5,3417],t:7,e:"br"}," ",{p:[99,5,3428],t:7,e:"b",f:["This symptom has been neutered, and has no effect. It will still affect the virus' statistics."]}],n:50,r:"neutered",p:[97,4,3395]}]}," ",{p:[102,4,3564],t:7,e:"ui-section",f:[{p:[103,5,3582],t:7,e:"ui-section",a:{label:"Level"},f:[{t:2,r:"level",p:[103,31,3608]}]}," ",{p:[104,5,3636],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[104,36,3667]}]}," ",{p:[105,5,3700],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[105,33,3728]}]}," ",{p:[106,5,3758],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[106,37,3790]}]}," ",{p:[107,5,3824],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[107,42,3861]}]}]}," ",{p:[109,4,3913],t:7,e:"ui-subdisplay",a:{title:"Effect Thresholds"},f:[{p:[110,5,3960],t:7,e:"ui-section",f:[{t:3,r:"threshold_desc",p:[110,17,3972]}]}]}]}],n:53,r:"data.symptom",p:[93,2,3303]}],x:{r:["data.mode"],s:"_0==1"}}]},e.exports=a.extend(r.exports)},{341:341}],436:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(484);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{341:341,484:484}],437:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{341:341}],438:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[3,1,69],t:7,e:"ui-notice",f:[{p:[4,3,84],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[4,23,104]}," connected to a tank."]}]}," ",{p:[6,1,182],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[7,3,220],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[8,5,255],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[8,11,261]}," kPa"]}]}," ",{p:[10,3,323],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[11,5,354],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[11,18,367]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[11,59,408]}]}]}]}," ",{p:[14,1,499],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[15,3,530],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,579]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[17,14,630]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,687]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[24,7,856],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[24,38,887]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[23,5,828]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[28,3,1007],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[29,4,1038]}]}," ",{p:[31,3,1080],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[32,4,1114]}," kPa"]}],n:50,r:"data.holding",p:[27,3,983]},{t:4,n:51,f:[{p:[35,3,1188],t:7,e:"ui-section",f:[{p:[36,4,1205],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}," ",{p:[40,1,1293],t:7,e:"ui-display",a:{title:"Filters"},f:[{t:4,f:[{p:[42,5,1345],t:7,e:"filters"}],n:53,r:"data",p:[41,3,1325]}]}]},r.exports.components=r.exports.components||{};var i={filters:t(457)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,457:457}],439:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}]}]}," ",{p:[52,5,1464],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1499],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1505]}]}]}],r:"config.fancy"}]}," ",{p:[57,1,1574],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1604],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1629],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1666],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1705],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1742],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1781],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1823],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1864],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1949],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1968]}],nowrap:0},f:[{p:[69,7,1993],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2014]}," %"]}," ",{p:[70,7,2072],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[70,28,2093]}]}," ",{p:[71,7,2135],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2156],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2169]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2198]}]}]}," ",{p:[72,7,2245],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2266],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2279]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2302]}," [",{p:[72,87,2325],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2331]}]},"]"]}]}," ",{p:[73,7,2380],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2401],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2414]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2437]}," [",{p:[73,87,2460],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2466]}]},"]"]}]}," ",{p:[74,7,2515],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2536],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2549]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2572]}," [",{p:[74,87,2595],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2601]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1923]}]}]},e.exports=a.extend(r.exports)},{341:341}],440:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=a.extend(r.exports)},{341:341}],441:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," "," "," "," "," "," ",{p:[11,1,560],t:7,e:"rdheader"}," ",{t:4,f:[{p:[13,2,595],t:7,e:"ui-display",a:{title:"CONSOLE LOCKED"},f:[{p:[14,3,634],t:7,e:"ui-button",a:{action:"Unlock"},f:["Unlock"]}]}],n:50,r:"data.locked",p:[12,1,573]},{t:4,f:[{p:[18,2,729],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[18,17,744]}]},f:[{p:[19,3,763],t:7,e:"tab",a:{name:"Technology"},f:[{p:[20,4,791],t:7,e:"techweb"}]}," ",{p:[22,3,815],t:7,e:"tab",a:{name:"View Node"},f:[{p:[23,4,842],t:7,e:"nodeview"}]}," ",{p:[25,3,867],t:7,e:"tab",a:{name:"View Design"},f:[{p:[26,4,896],t:7,e:"designview"}]}," ",{p:[28,3,923],t:7,e:"tab",a:{name:"Disk Operations - Design"},f:[{p:[29,4,965],t:7,e:"diskopsdesign"}]}," ",{p:[31,3,995],t:7,e:"tab",a:{name:"Disk Operations - Technology"},f:[{p:[32,4,1041],t:7,e:"diskopstech"}]}," ",{p:[34,3,1069],t:7,e:"tab",a:{name:"Deconstructive Analyzer"},f:[{p:[35,4,1110],t:7,e:"destruct"}]}," ",{p:[37,3,1135],t:7,e:"tab",a:{name:"Protolathe"},f:[{p:[38,4,1163],t:7,e:"protolathe"}]}," ",{p:[40,3,1190],t:7,e:"tab",a:{name:"Circuit Imprinter"},f:[{p:[41,4,1225],t:7,e:"circuit"}]}," ",{p:[43,3,1249],t:7,e:"tab",a:{name:"Settings"},f:[{p:[44,4,1275],t:7,e:"settings"}]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[17,1,706]}]},r.exports.components=r.exports.components||{};var i={settings:t(450),circuit:t(442),protolathe:t(448),destruct:t(444),diskopsdesign:t(445),diskopstech:t(446),designview:t(443),nodeview:t(447),techweb:t(451),rdheader:t(449)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451}],442:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,58],t:7,e:"ui-display",a:{title:"Circuit Imprinter Busy!"}}],n:50,r:"data.circuitbusy",p:[2,2,30]},{t:4,n:51,f:[{p:[5,3,130],t:7,e:"ui-display",f:[{p:[6,4,147],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,189],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,202]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,261],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "circuit", "inputText" : ',{t:2,r:"textsearch",p:[8,84,340]},"}"]},f:["Search"]}]}," ",{p:[10,4,398],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.circuitmats",p:[10,27,421]}," / ",{t:2,r:"data.circuitmaxmats",p:[10,50,444]}]}," ",{p:[11,4,485],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.circuitchems",p:[11,26,507]}," / ",{t:2,r:"data.circuitmaxchems",p:[11,50,531]}]}," ",{p:[12,3,572],t:7,e:"ui-display",f:[{p:[14,3,590],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,605]}]},f:[{p:[15,4,631],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,696],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.circuitcat"],s:'_0=="{{name}}"?"selected":null'},p:[17,43,733]}],params:['{"type" : "circuit", "cat" : "',{t:2,r:"name",p:[17,135,825]},'"}']},f:[{t:2,r:"name",p:[17,147,837]}]}],n:52,r:"data.circuitcats",p:[16,5,663]}]}," ",{p:[20,4,888],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,956],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,968]},{t:2,r:"matstring",p:[22,26,976]}," ",{p:[23,7,997],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[23,40,1030]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[23,119,1109]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitdes",p:[21,5,924]}]}," ",{p:[27,4,1187],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[29,6,1254],t:7,e:"ui-section",f:[{t:2,r:"name",p:[29,18,1266]},{t:2,r:"matstring",p:[29,26,1274]}," ",{p:[30,7,1295],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[30,40,1328]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[30,119,1407]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitmatch",p:[28,5,1220]}]}," ",{p:[34,4,1485],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[36,6,1550],t:7,e:"ui-section",f:[{t:2,r:"name",p:[36,18,1562]}," : ",{t:2,r:"amount",p:[36,29,1573]}," cm3 - ",{t:4,f:[{p:[38,7,1623],t:7,e:"input",a:{value:[{t:2,r:"number",p:[38,20,1636]}],placeholder:["1-",{t:2,r:"sheets",p:[38,46,1662]}],"class":"number"}}," ",{p:[39,7,1698],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "circuit", "mat_id" : ',{t:2,r:"mat_id",p:[39,84,1775]},', "sheets" : ',{t:2,r:"number",p:[39,107,1798]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[37,6,1597]}]}],n:52,r:"data.circuitmat_list",p:[35,5,1513]}]}," ",{p:[44,4,1895],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[46,6,1961],t:7,e:"ui-section",f:[{t:2,r:"name",p:[46,18,1973]}," : ",{t:2,r:"amount",p:[46,29,1984]}," - ",{p:[47,7,2005],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "circuit", "name" : ',{t:2,r:"name",p:[47,80,2078]},', "id" : ',{t:2,r:"reagentid",p:[47,97,2095]},"}"]},f:["Purge"]}]}],n:52,r:"data.circuitchem_list",p:[45,5,1923]}]}]}]}]}],r:"data.circuitbusy"}],n:50,r:"data.circuit_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[55,2,2216],t:7,e:"ui-display",a:{title:"No Linked Circuit Imprinter"}}],r:"data.circuit_linked"}]},e.exports=a.extend(r.exports)},{341:341}],443:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:[{t:2,r:"data.sdesign_name",p:[2,21,50]}]},f:[{p:[3,3,77],t:7,e:"ui-section",a:{title:"Description"},f:[{t:2,r:"data.sdesign_desc",p:[3,35,109]}]}]}," ",{p:[5,2,162],t:7,e:"ui-display",a:{title:"Lathe Types"},f:[{t:4,f:[{p:[7,4,239],t:7,e:"ui-section",a:{title:"Circuit Imprinter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&1"},p:[6,3,198]}," ",{t:4,f:[{p:[10,4,346],t:7,e:"ui-section",a:{title:"Protolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&2"},p:[9,3,305]}," ",{t:4,f:[{p:[13,4,446],t:7,e:"ui-section",a:{title:"Autolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&4"},p:[12,3,405]}," ",{t:4,f:[{p:[16,4,545],t:7,e:"ui-section",a:{title:"Crafting Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&8"},p:[15,3,504]}," ",{t:4,f:[{p:[19,4,655],t:7,e:"ui-section",a:{title:"Exosuit Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&16"},p:[18,3,613]}," ",{t:4,f:[{p:[22,4,764],t:7,e:"ui-section",a:{title:"Biogenerator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&32"},p:[21,3,722]}," ",{t:4,f:[{p:[25,4,867],t:7,e:"ui-section",a:{title:"Limb Grower"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&64"},p:[24,3,825]}," ",{t:4,f:[{p:[28,4,970],t:7,e:"ui-section",a:{title:"Ore Smelter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&128"},p:[27,3,927]}]}," ",{p:[31,2,1045],t:7,e:"ui-display",a:{title:"Materials"},f:[{t:4,f:[{p:[33,4,1116],t:7,e:"ui-section",a:{title:[{t:2,r:"matname",p:[33,23,1135]}]},f:[{t:2,r:"matamt",p:[33,36,1148]}," cm^3"]}],n:52,r:"data.sdesign_materials",p:[32,3,1079]}]}],n:50,r:"data.design_selected",p:[1,1,0]},{t:4,f:[{p:[38,2,1248],t:7,e:"ui-display",a:{title:"No Design Selected."}}],n:50,x:{r:["data.design_selected"],s:"!_0"},p:[37,1,1216]}]},e.exports=a.extend(r.exports)},{341:341}],444:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[4,3,60],t:7,e:"ui-display",a:{title:"Destructive Analyzer Busy!"}}],n:50,r:"data.destroybusy",p:[3,2,32]},{t:4,n:51,f:[{t:4,f:[{p:[7,4,168],t:7,e:"ui-display",a:{title:"Destructive Analyzer Unloaded"}}],n:50,x:{r:["data.destroy_loaded"],s:"!_0"},p:[6,3,135]},{t:4,n:51,f:[{p:[9,4,248],t:7,e:"ui-display",a:{title:"Loaded Item"},f:[{p:[10,4,285],t:7,e:"ui-section",a:{title:"Name"},f:[{t:2,r:"data.destroy_name",p:[10,29,310]}]}]}," ",{p:[12,4,367],t:7,e:"ui-display",a:{title:"Boost Nodes"},f:[{t:4,f:[{p:[14,6,438],t:7,e:"ui-section",a:{title:[{t:2,r:"name",p:[14,25,457]}," | ",{t:2,r:"value",p:[14,36,468]}]},f:[{p:[15,7,487],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["allow"],s:'_0?null:"disabled"'},p:[15,25,505]}],action:"deconstruct",params:['{"id":',{t:2,r:"id",p:[15,90,570]},"}"]},f:["Deconstruct and Boost"]}]}],n:52,r:"data.boost_paths",p:[13,5,405]}]}," ",{p:[19,4,670],t:7,e:"ui-button",a:{action:"eject_da"},f:["Eject Item"]}],x:{r:["data.destroy_loaded"],s:"!_0"}}],r:"data.destroybusy"}],n:50,r:"data.destroy_linked",p:[2,1,2]},{t:4,n:51,f:[{p:[23,2,755],t:7,e:"ui-display",a:{title:"No Linked Destructive Analyzer"}}],r:"data.destroy_linked"}]},e.exports=a.extend(r.exports)},{341:341}],445:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={ -v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Design Disk Loaded"}}],n:50,x:{r:["data.ddisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,121],t:7,e:"ui-display",a:{title:"Design Disk Updating"}}],n:50,r:"data.ddisk_update",p:[5,2,92]},{t:4,n:51,f:[{t:4,f:[{p:[9,4,221],t:7,e:"ui-display",a:{title:"Design Disk"},f:[{p:[10,5,259],t:7,e:"ui-section",a:{title:"Disk Space"},f:["Disk Capacity: ",{t:2,r:"data.ddisk_size",p:[10,51,305]}," blueprints."]}," ",{p:[11,5,355],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[11,33,383],t:7,e:"ui-button",a:{action:"ddisk_upall"},f:["Upload all designs"]}]}," ",{p:[12,5,464],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[12,36,495],t:7,e:"ui-button",a:{action:"clear_designdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[13,5,591],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[13,36,622],t:7,e:"ui-button",a:{action:"eject_designdisk"},f:["Eject Disk"]}]}]}," ",{p:[15,4,717],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[17,6,792],t:7,e:"ui-section",a:{title:"Number"},f:["#",{t:2,r:"pos",p:[17,34,820]},": ",{t:4,f:[{p:[19,8,866],t:7,e:"ui-button",a:{action:"upload_empty_ddisk_slot",params:['{"slot": "',{t:2,r:"pos",p:[19,70,928]},'"}']},f:["Upload to Empty Slot"]}],n:50,x:{r:["id"],s:'_0=="null"'},p:[18,7,837]},{t:4,n:51,f:[{p:[21,8,996],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[21,58,1046]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[21,75,1063]}]},f:[{t:2,r:"name",p:[21,122,1110]}]}," ",{p:[22,8,1139],t:7,e:"ui-button",a:{action:"ddisk_erasepos",style:"danger",params:['{"id": "',{t:2,r:"id",p:[22,74,1205]},'"}'],state:[{t:2,x:{r:["id"],s:'_0=="null"?"disabled":null'},p:[22,91,1222]}]},f:["Delete Slot"]}],x:{r:["id"],s:'_0=="null"'}}]}],n:52,r:"data.ddisk_designs",p:[16,5,757]}]}],n:50,x:{r:["data.ddisk_upload"],s:"!_0"},p:[8,3,190]},{t:4,n:51,f:[{p:[28,4,1367],t:7,e:"ui-display",a:{title:"Upload Design to Disk"},f:[{p:[28,46,1409],t:7,e:"ui-section",f:["Available Designs:"]}]}," ",{t:4,f:[{p:[30,5,1513],t:7,e:"ui-section",f:[{p:[30,17,1525],t:7,e:"ui-button",a:{action:"ddisk_uploaddesign",params:['{"id": "',{t:2,r:"id",p:[30,72,1580]},'"}']},f:[{t:2,r:"name",p:[30,82,1590]}]}]}],n:52,r:"data.ddisk_possible_designs",p:[29,4,1470]}],x:{r:["data.ddisk_upload"],s:"!_0"}}],r:"data.ddisk_update"}],x:{r:["data.ddisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],446:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Technology Disk Loaded"}}],n:50,x:{r:["data.tdisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,125],t:7,e:"ui-display",a:{title:"Technology Disk Updating"}}],n:50,r:"data.tdisk_update",p:[5,2,96]},{t:4,n:51,f:[{p:[8,3,198],t:7,e:"ui-display",a:{title:"Technology Disk"},f:[{p:[9,4,239],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[9,32,267],t:7,e:"ui-button",a:{action:"tdisk_down"},f:["Download Research to Disk"]},{p:[9,100,335],t:7,e:"ui-button",a:{action:"tdisk_up"},f:["Upload Research from Disk"]}," ",{p:[10,4,406],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[10,35,437],t:7,e:"ui-button",a:{action:"clear_techdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[11,4,530],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[11,35,561],t:7,e:"ui-button",a:{action:"eject_techdisk"},f:["Eject Disk"]}]}]}]}," ",{p:[13,3,652],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[15,5,723],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,53,771]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,70,788]}]},f:[{t:2,r:"display_name",p:[15,115,833]}]}],n:52,r:"data.tdisk_nodes",p:[14,4,691]}]}],r:"data.tdisk_update"}],x:{r:["data.tdisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],447:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,29],t:7,e:"ui-display",a:{title:[{t:2,r:"data.snode_name",p:[2,21,48]}]},f:[{p:[3,3,73],t:7,e:"ui-section",a:{title:"Description"},f:["Description: ",{t:2,r:"data.snode_desc",p:[3,48,118]}]}," ",{p:[4,3,154],t:7,e:"ui-section",a:{title:"Point Cost"},f:["Point Cost: ",{t:2,r:"data.snode_cost",p:[4,46,197]}]}," ",{p:[5,3,233],t:7,e:"ui-section",a:{title:"Export Price"},f:["Export Price: ",{t:2,r:"data.snode_export",p:[5,50,280]}]}," ",{p:[6,3,318],t:7,e:"ui-button",a:{action:"research_node",params:['{"id"="',{t:2,r:"id",p:[6,52,367]},'"}'],state:[{t:2,x:{r:["data.snode_researched"],s:'_0?"disabled":null'},p:[6,69,384]}]},f:[{t:2,x:{r:["data.snode_researched"],s:'_0?"Researched":"Research Node"'},p:[6,115,430]}]}]}," ",{p:[8,2,518],t:7,e:"ui-display",a:{title:"Prerequisites"},f:[{t:4,f:[{p:[10,4,588],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[10,52,636]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[10,69,653]}]},f:[{t:2,r:"display_name",p:[10,114,698]}]}],n:52,r:"data.node_prereqs",p:[9,3,556]}]}," ",{p:[13,2,759],t:7,e:"ui-display",a:{title:"Unlocks"},f:[{t:4,f:[{p:[15,4,823],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,52,871]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,69,888]}]},f:[{t:2,r:"display_name",p:[15,114,933]}]}],n:52,r:"data.node_unlocks",p:[14,3,791]}]}," ",{p:[18,2,994],t:7,e:"ui-display",a:{title:"Designs"},f:[{t:4,f:[{p:[20,4,1058],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[20,54,1108]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[20,71,1125]}]},f:[{t:2,r:"name",p:[20,118,1172]}]}],n:52,r:"data.node_designs",p:[19,3,1026]}]}],n:50,r:"data.node_selected",p:[1,1,0]},{t:4,f:[{p:[25,2,1263],t:7,e:"ui-display",a:{title:"No Node Selected."}}],n:50,x:{r:["data.node_selected"],s:"!_0"},p:[24,1,1233]}]},e.exports=a.extend(r.exports)},{341:341}],448:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,59],t:7,e:"ui-display",a:{title:"Protolathe Busy!"}}],n:50,r:"data.protobusy",p:[2,2,33]},{t:4,n:51,f:[{p:[5,3,124],t:7,e:"ui-display",f:[{p:[6,4,141],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,183],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,196]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,255],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "proto", "inputText" : ',{t:2,r:"textsearch",p:[8,82,332]},"}"]},f:["Search"]}]}," ",{p:[10,4,390],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.protomats",p:[10,27,413]}," / ",{t:2,r:"data.protomaxmats",p:[10,48,434]}]}," ",{p:[11,4,473],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.protochems",p:[11,26,495]}," / ",{t:2,r:"data.protomaxchems",p:[11,48,517]}]}," ",{p:[12,3,556],t:7,e:"ui-display",f:[{p:[14,3,574],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,589]}]},f:[{p:[15,4,615],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,678],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.protocat","name"],s:'_0==_1?"selected":null'},p:[17,43,715]}],params:['{"type" : "proto", "cat" : "',{t:2,r:"name",p:[17,125,797]},'"}']},f:[{t:2,r:"name",p:[17,137,809]}]}],n:52,r:"data.protocats",p:[16,5,647]}]}," ",{p:[20,4,860],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,926],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,938]},{t:2,r:"matstring",p:[22,26,946]}," ",{t:4,f:[{p:[24,8,996],t:7,e:"input",a:{value:[{t:2,r:"number",p:[24,21,1009]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[24,47,1035]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[23,7,967]}," ",{p:[26,7,1108],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[26,40,1141]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[26,117,1218]},'", "amount" : "',{t:2,r:"number",p:[26,138,1239]},'"}']},f:["Print"]}]}],n:52,r:"data.protodes",p:[21,5,896]}]}," ",{p:[30,4,1321],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[32,6,1386],t:7,e:"ui-section",f:[{t:2,r:"name",p:[32,18,1398]},{t:2,r:"matstring",p:[32,26,1406]}," ",{t:4,f:[{p:[34,8,1456],t:7,e:"input",a:{value:[{t:2,r:"number",p:[34,21,1469]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[34,47,1495]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[33,7,1427]}," ",{p:[36,7,1568],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[36,40,1601]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[36,117,1678]},'", "amount" : "',{t:2,r:"number",p:[36,138,1699]},'"}']},f:["Print"]}]}],n:52,r:"data.protomatch",p:[31,5,1354]}]}," ",{p:[40,4,1781],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[42,6,1844],t:7,e:"ui-section",f:[{t:2,r:"name",p:[42,18,1856]}," : ",{t:2,r:"amount",p:[42,29,1867]}," cm3 - ",{t:4,f:[{p:[44,7,1917],t:7,e:"input",a:{value:[{t:2,r:"number",p:[44,20,1930]}],placeholder:["1-",{t:2,r:"sheets",p:[44,46,1956]}],"class":"number"}}," ",{p:[45,7,1992],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "proto", "mat_id" : ',{t:2,r:"mat_id",p:[45,82,2067]},', "sheets" : ',{t:2,r:"number",p:[45,105,2090]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[43,6,1891]}]}],n:52,r:"data.protomat_list",p:[41,5,1809]}]}," ",{p:[50,4,2187],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[52,6,2251],t:7,e:"ui-section",f:[{t:2,r:"name",p:[52,18,2263]}," : ",{t:2,r:"amount",p:[52,29,2274]}," - ",{p:[53,7,2295],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "proto", "name" : ',{t:2,r:"name",p:[53,78,2366]},', "id" : ',{t:2,r:"reagentid",p:[53,95,2383]},"}"]},f:["Purge"]}]}],n:52,r:"data.protochem_list",p:[51,5,2215]}]}]}]}]}],r:"data.protobusy"}],n:50,r:"data.protolathe_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[61,2,2504],t:7,e:"ui-display",a:{title:"No Linked Protolathe"}}],r:"data.protolathe_linked"}]},e.exports=a.extend(r.exports)},{341:341}],449:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,1,14],t:7,e:"span",a:{"class":"memoedit"},f:["Nanotrasen R&D Console"]},{p:[2,53,66],t:7,e:"br"}," Available Points: ",{p:[3,19,91],t:7,e:"ui-section",a:{title:"Research Points"},f:[{t:2,r:"data.research_points_stored",p:[3,55,127]}]}," ",{p:[4,1,173],t:7,e:"ui-section",a:{title:["Page Selection - ",{t:2,r:"page",p:[4,37,209]}]},f:[{p:[4,47,219],t:7,e:"input",a:{value:[{t:2,r:"pageselect",p:[4,60,232]}],placeholder:"1","class":"number"}}," Select Page: ",{p:[5,14,294],t:7,e:"ui-button",a:{action:"page",params:['{"num" : "',{t:2,r:"pageselect",p:[5,57,337]},'"}']},f:["[Go]"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],450:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"span",a:{"class":"bad"},f:["Settings"]},{p:[1,34,33],t:7,e:"br"},{p:[1,39,38],t:7,e:"br"}," ",{p:[2,1,45],t:7,e:"ui-button",a:{action:"Resync"},f:["RESYNC MACHINERY"]},{p:[2,56,100],t:7,e:"br"}," ",{p:[3,1,107],t:7,e:"ui-button",a:{action:"Lock"},f:["LOCK"]}," ",{p:[4,1,150],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "destroy"}',state:[{t:2,x:{r:["data.destroy_linked"],s:'_0?null:"disabled"'},p:[4,71,220]}]},f:["Disconnect Destructive Analyzer"]}," ",{p:[5,1,309],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "lathe"}',state:[{t:2,x:{r:["data.protolathe_linked"],s:'_0?null:"disabled"'},p:[5,69,377]}]},f:["Disconnect Protolathe"]}," ",{p:[6,1,459],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "imprinter"}',state:[{t:2,x:{r:["data.circuit_linked"],s:'_0?null:"disabled"'},p:[6,73,531]}]},f:["Disconnect Circuit Imprinter"]}]},e.exports=a.extend(r.exports)},{341:341}],451:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Available for Research"},f:[{t:4,f:[{p:[3,3,78],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[3,51,126]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[3,68,143]}]},f:[{t:2,r:"display_name",p:[3,113,188]}]}],n:52,r:"data.techweb_avail",p:[2,2,46]}]}," ",{p:[6,1,245],t:7,e:"ui-display",a:{title:"Locked Nodes"},f:[{t:4,f:[{p:[8,3,314],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[8,51,362]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[8,68,379]}]},f:[{t:2,r:"display_name",p:[8,113,424]}]}],n:52,r:"data.techweb_locked",p:[7,2,281]}]}," ",{p:[11,1,482],t:7,e:"ui-display",a:{title:"Researched Nodes"},f:[{t:4,f:[{p:[13,3,559],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[13,51,607]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[13,68,624]}]},f:[{t:2,r:"display_name",p:[13,113,669]}]}],n:52,r:"data.techweb_researched",p:[12,2,522]}]}]},e.exports=a.extend(r.exports)},{341:341}],452:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,25],t:7,e:"ui-notice",f:[{p:[3,3,40],t:7,e:"span",f:["The grinder is currently processing and cannot be used."]}]}],n:50,r:"data.processing",p:[1,1,0]},{p:{button:[{p:[8,5,208],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[8,36,239]}],action:"eject"},f:["Eject Contents"]}]},t:7,e:"ui-display",a:{title:"Processing Chamber",button:0},f:[" ",{p:[10,3,364],t:7,e:"ui-section",a:{label:"Grinding"},f:[{p:[11,5,399],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.operating"],s:'_0?"average":"good"'},p:[11,18,412]}]},f:[{t:2,x:{r:["data.operating"],s:'_0?"Busy":"Ready"'},p:[11,59,453]}]}," ",{p:[12,2,500],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[12,35,533]}],action:"grind"},f:["Activate"]}]}," ",{p:[14,3,653],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[17,9,755],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["The ",{t:2,r:"name",p:[17,56,802]}]},{p:[17,71,817],t:7,e:"br"}],n:52,r:"adata.contentslist",p:[16,7,717]},{t:4,n:51,f:[{p:[19,9,848],t:7,e:"span",f:["No Contents"]}],r:"adata.contentslist"}],n:50,r:"data.contents",p:[15,5,688]},{t:4,n:51,f:[{p:[22,7,911],t:7,e:"span",f:["No Contents"]}],r:"data.contents"}]}]}," ",{p:{button:[{p:[28,5,1047],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.isBeakerLoaded"],s:'(_0==0)&&_1?null:"disabled"'},p:[28,36,1078]}],action:"detach"},f:["Detach"]}]},t:7,e:"ui-display",a:{title:"Container",button:0},f:[" ",{p:[30,3,1202],t:7,e:"ui-section",a:{label:"Reagents"},f:[{t:4,f:[{p:[32,7,1272],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[32,13,1278]},"/",{t:2,r:"data.beakerMaxVolume",p:[32,55,1320]}," Units"]}," ",{p:[33,7,1365],t:7,e:"br"}," ",{t:4,f:[{p:[35,9,1418],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[35,52,1461]}," units of ",{t:2,r:"name",p:[35,87,1496]}]},{p:[35,102,1511],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[34,7,1378]},{t:4,n:51,f:[{p:[37,9,1542],t:7,e:"span",a:{"class":"bad"},f:["Container Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[31,5,1237]},{t:4,n:51,f:[{p:[40,7,1621],t:7,e:"span",a:{"class":"average"},f:["No Container"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],453:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"span",a:{"class":["pipes32x32 ",{t:2,r:"dir",p:[6,80,253]},"-",{t:2,r:"icon_state",p:[6,88,261]}],title:[{t:2,r:"dir_name",p:[6,111,284]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}," ",{t:4,f:[{p:[12,2,406],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[14,4,468],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["@key","data.selected_color"],s:'_0==_1?"selected":null'},p:[14,22,486]}],action:"color",params:['{"paint_color": ',{t:2,r:"@key",p:[15,44,583]},"}"]},f:[{t:2,r:"@key",p:[15,55,594]}]}],n:52,r:"data.paint_colors",p:[13,3,436]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[11,1,377]},{p:[19,1,654],t:7,e:"ui-display",a:{title:"Utilities"},f:[{p:[20,2,687],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&1?"check-square-o":"square-o"'},p:[20,19,704]}],action:"mode",params:'{"mode": 1}'},f:["Build"]}," ",{p:[22,2,813],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&2?"check-square-o":"square-o"'},p:[22,19,830]}],action:"mode",params:'{"mode": 2}'},f:["Wrench"]}," ",{p:[24,2,940],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&4?"check-square-o":"square-o"'},p:[24,19,957]}],action:"mode",params:'{"mode": 4}'},f:["Destroy"]}," ",{t:4,f:[{p:[27,3,1098],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&8?"check-square-o":"square-o"'},p:[27,20,1115]}],action:"mode",params:'{"mode": 8}'},f:["Paint"]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[26,2,1068]}]}," ",{p:[31,1,1249],t:7,e:"ui-display",a:{title:"Category"},f:[{p:[32,2,1281],t:7,e:"ui-section",f:[{p:[33,3,1297],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==0?"check-square-o":"square-o"'},p:[33,20,1314]}],state:[{t:2,x:{r:["data.category"],s:'_0<=0?"selected":null'},p:[33,83,1377]}],action:"category",params:'{"category": 0}'},f:["Atmospherics"]}," ",{p:[35,3,1496],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==1?"check-square-o":"square-o"'},p:[35,20,1513]}],state:[{t:2,x:{r:["data.category"],s:'_0==1?"selected":null'},p:[35,83,1576]}],action:"category",params:'{"category": 1}'},f:["Disposals"]}," ",{p:[37,3,1692],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==2?"check-square-o":"square-o"'},p:[37,20,1709]}],state:[{t:2,x:{r:["data.category"],s:'_0==2?"selected":null'},p:[37,83,1772]}],action:"category",params:'{"category": 2}'},f:["Transit Tubes"]}]}," ",{t:4,f:[{p:[41,3,1937],t:7,e:"ui-section",a:{label:"Piping Layer"},f:[{p:[42,4,1975],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==1?"selected":null'},p:[42,22,1993]}],action:"piping_layer",params:'{"piping_layer": 1}'},f:["1"]}," ",{p:[44,4,2115],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==2?"selected":null'},p:[44,22,2133]}],action:"piping_layer",params:'{"piping_layer": 2}'},f:["2"]}," ",{p:[46,4,2255],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==3?"selected":null'},p:[46,22,2273]}],action:"piping_layer",params:'{"piping_layer": 3}'},f:["3"]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[40,2,1907]}]}," ",{t:4,f:[{p:[52,2,2462],t:7,e:"ui-display",a:{title:[{t:2,r:"cat_name",p:[52,21,2481]}]},f:[{t:4,f:[{p:[54,4,2521],t:7,e:"ui-section",f:[{p:[55,5,2539],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[55,23,2557]}],action:"pipe_type",params:['{"pipe_type": ',{t:2,r:"pipe_index",p:[56,28,2638]},', "category": ',{t:2,r:"cat_name",p:[56,56,2666]},"}"]},f:[{t:2,r:"pipe_name",p:[56,71,2681]}]}]}],n:52,r:"recipes",p:[53,3,2499]}]}],n:52,r:"data.categories",p:[51,1,2434]}]},e.exports=a.extend(r.exports)},{341:341}],454:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[3,21,78]}],action:"color",params:['{"paint_color": ',{t:2,r:"color_name",p:[4,28,155]},"}"]},f:[{t:2,r:"color_name",p:[4,45,172]}]}],n:52,r:"data.paint_colors",p:[2,2,29]}]}]},e.exports=a.extend(r.exports)},{341:341}],455:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"img",a:{src:["pipe.",{t:2,r:"dir",p:[6,71,244]},".",{t:2,r:"icon_state",p:[6,79,252]},".png"],title:[{t:2,r:"dir_name",p:[6,106,279]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}]},e.exports=a.extend(r.exports)},{341:341}],456:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{341:341}],457:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,26],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[2,20,43]}],style:[{t:2,x:{r:["enabled"],s:'_0?"selected":null'},p:[2,72,95]}],action:"toggle_filter",params:['{"id_tag": "',{t:2,r:"id_tag",p:[3,48,176]},'", "val": ',{t:2,r:"gas_id",p:[3,68,196]},"}"]},f:[{t:2,r:"gas_name",p:[3,81,209]}]}],n:52,r:"filter_types",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],458:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(459),templates:t(461),status:t(460)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,459:459,460:460,461:461}],459:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=a.extend(r.exports)},{341:341}],460:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"table",a:{width:"100%"},f:[{t:4,f:[{p:[3,3,49],t:7,e:"tr",f:[{p:[4,5,59],t:7,e:"td",f:[{p:[5,7,71],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[5,69,133]},'"}']},f:["JMP"]}]}," ",{p:[9,5,193],t:7,e:"td",f:[{p:[10,7,205],t:7,e:"ui-button",a:{action:"fly",params:['{"id": "',{t:2,r:"id",p:[10,47,245]},'"}'],state:[{t:2,x:{r:["can_fly"],s:'_0?null:"disabled"'},p:[10,64,262]}]},f:["Fly"]}]}," ",{p:[14,5,345],t:7,e:"td",f:[{t:2,r:"name",p:[15,7,357]}," (",{p:[15,17,367],t:7,e:"code",f:[{t:2,r:"id",p:[15,23,373]}]},")"]}," ",{p:[17,5,404],t:7,e:"td",f:[{t:2,r:"status",p:[18,7,416]}]}," ",{p:[20,5,443],t:7,e:"td",f:[{t:4,f:[{t:2,r:"mode",p:[22,9,477]}],n:50,r:"mode",p:[21,7,455]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[25,10,532]},") ",{p:[26,9,555],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[26,57,603]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[26,74,620]}]},f:["Fast Travel"]}],n:50,r:"timer",p:[24,7,508]}]}]}],n:52,r:"data.shuttles",p:[2,1,22]}]}]},e.exports=a.extend(r.exports)},{341:341}],461:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=a.extend(r.exports)},{341:341}],462:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,186],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,220],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,233]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,262]}]}]}," ",{p:[9,5,315],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[10,7,350],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[10,20,363]}],max:[{t:2,r:"data.occupant.maxHealth",p:[10,54,397]}],value:[{t:2,r:"data.occupant.health",p:[10,90,433]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[11,16,475]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[11,68,527]}]}]}," ",{t:4,f:[{p:[14,7,764],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[14,26,783]}]},f:[{p:[15,9,804],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[15,30,825]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[15,66,861]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[15,103,898]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[13,5,598]}," ",{t:4,f:[{p:[19,7,1020],t:7,e:"ui-section",a:{label:"Blood"},f:[{p:[20,9,1056],t:7,e:"ui-section",a:{label:"Volume"},f:[{p:[21,11,1095],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.blood.maxBloodVolume",p:[21,32,1116]}],value:[{t:2,r:"data.occupant.blood.currentBloodVolume",p:[21,79,1163]}],state:[{t:2,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"bad":"good"'},p:[21,130,1214]}]},f:[{t:3,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"LOW":"OK"'},p:[21,232,1316]}," - ",{t:2,x:{r:["data.occupant.blood.currentBloodVolume"],s:"Math.round(_0)"},p:[21,342,1426]}," cl"]}]}," ",{p:[23,9,1525],t:7,e:"ui-section",a:{label:"Type"},f:[{p:[24,11,1562],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:"data.occupant.blood.bloodType",p:[24,35,1586]}]}]}]}],n:50,r:"data.occupant.blood",p:[18,5,985]}," ",{p:[28,5,1689],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[29,9,1725],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[29,22,1738]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[29,68,1784]}]}]}," ",{p:[31,5,1867],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[32,9,1903],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[32,22,1916]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[32,68,1962]}]}]}," ",{p:[34,5,2046],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[36,11,2133],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[36,54,2176]}," units of ",{t:2,r:"name",p:[36,89,2211]}]},{p:[36,104,2226],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[35,9,2088]},{t:4,n:51,f:[{p:[38,11,2261],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[5,3,159]}]}," ",{p:[43,1,2357],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[44,2,2389],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[45,5,2420],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[45,22,2437]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[45,71,2486]}]}]}," ",{p:[47,3,2551],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[49,7,2612],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[49,38,2643]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[49,122,2727]},'"}']},f:[{t:2,r:"name",p:[49,132,2737]}]},{p:[49,152,2757],t:7,e:"br"}],n:52,r:"data.chems",p:[48,5,2584]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],463:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:4,f:["You Are Here"],n:50,x:{r:["occupied"],s:'_0=="owner"'},p:[10,7,491]},{t:4,n:51,f:[{t:4,f:["Occupied"],n:50,x:{ -r:["occupied"],s:'_0=="stranger"'},p:[13,9,566]},{t:4,n:51,f:["Swap"],x:{r:["occupied"],s:'_0=="stranger"'}}],x:{r:["occupied"],s:'_0=="owner"'}}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],464:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,23,82],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.drying"],s:'_0?"stop":"tint"'},p:[4,40,99]}],action:"Dry"},f:[{t:2,x:{r:["data.drying"],s:'_0?"Stop drying":"Dry"'},p:[4,88,147]}]}],n:50,r:"data.isdryer",p:[4,3,62]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[7,3,258],t:7,e:"ui-notice",f:[{p:[8,5,275],t:7,e:"span",f:["Unfortunately, this ",{t:2,r:"data.name",p:[8,31,301]}," is empty."]}]}],n:50,x:{r:["data.contents.length"],s:"_0==0"},p:[6,1,221]},{t:4,n:51,f:[{p:[11,1,359],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[12,2,391],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[13,4,425],t:7,e:"section",a:{"class":"cell bold"},f:["Item"]}," ",{p:[16,4,482],t:7,e:"section",a:{"class":"cell bold"},f:["Quantity"]}," ",{p:[19,4,543],t:7,e:"section",a:{"class":"cell bold",align:"center"},f:[{t:4,f:[{t:2,r:"data.verb",p:[20,22,608]}],n:50,r:"data.verb",p:[20,5,591]},{t:4,n:51,f:["Dispense"],r:"data.verb"}]}]}," ",{t:4,f:[{p:[24,3,703],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[25,4,737],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[26,5,765]}]}," ",{p:[28,4,793],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[29,5,835]}]}," ",{p:[31,4,865],t:7,e:"section",a:{"class":"table",alight:"right"},f:[{p:[32,5,909],t:7,e:"section",a:{"class":"cell"}}," ",{p:[33,5,947],t:7,e:"section",a:{"class":"cell"},f:[{p:[34,6,976],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[34,45,1015]}],params:['{ "name" : ',{t:2,r:"name",p:[34,102,1072]},', "amount" : 1 }']},f:["One"]}]}," ",{p:[38,5,1151],t:7,e:"section",a:{"class":"cell"},f:[{p:[39,6,1180],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>1)?null:"disabled"'},p:[39,45,1219]}],params:['{ "name" : ',{t:2,r:"name",p:[39,101,1275]}," }"]},f:["Many"]}]}]}]}],n:52,r:"data.contents",p:[23,2,676]}]}],x:{r:["data.contents.length"],s:"_0==0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],465:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]},"   [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,r:"adata.inputLevel_text",p:[37,78,1447]}]}]}," ",{p:[39,3,1501],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1540],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1579]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1674],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1708]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1804],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1894],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1927]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2039],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2077]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2204],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2238],t:7,e:"span",f:[{t:2,r:"adata.inputAvailable",p:[47,9,2244]}]}]}]}," ",{p:[50,1,2308],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2339],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2377],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2394]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2449]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2519]}]},"   [",{p:[55,6,2587],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2600]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2617]}]},"]"]}," ",{p:[57,3,2724],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2764],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2785]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2817]}]},f:[{t:2,r:"adata.outputLevel_text",p:[58,80,2839]}]}]}," ",{p:[60,3,2894],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2934],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2973]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3070],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3104]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3202],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3293],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3326]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3441],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3479]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3609],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3644],t:7,e:"span",f:[{t:2,r:"adata.outputUsed",p:[68,9,3650]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],466:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:["\ufeff",{t:4,f:[" ",{p:[2,2,33],t:7,e:"ui-display",a:{title:"Dispersal Tank"},f:[{p:[3,3,73],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[4,4,104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.active"],s:'_0?"power-off":"close"'},p:[4,21,121]}],style:[{t:2,x:{r:["data.active"],s:'_0?"selected":null'},p:[5,12,174]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[6,12,223]}],action:"power"},f:[{t:2,x:{r:["data.active"],s:'_0?"On":"Off"'},p:[7,20,286]}]}]}," ",{p:[10,3,354],t:7,e:"ui-section",a:{label:"Smoke Radius Setting"},f:[{p:[11,5,401],t:7,e:"div",a:{"class":"content",style:"float:left"},f:[{p:[12,6,448],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=1?null:"disabled"'},p:[12,36,478]}],style:[{t:2,x:{r:["data.setting"],s:'_0==1?"selected":null'},p:[12,89,531]}],action:"setting",params:'{"amount": 1}'},f:["3"]}," ",{p:[13,6,634],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=2?null:"disabled"'},p:[13,36,664]}],style:[{t:2,x:{r:["data.setting"],s:'_0==2?"selected":null'},p:[13,89,717]}],action:"setting",params:'{"amount": 2}'},f:["6"]}," ",{p:[14,6,820],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=3?null:"disabled"'},p:[14,36,850]}],style:[{t:2,x:{r:["data.setting"],s:'_0==3?"selected":null'},p:[14,89,903]}],action:"setting",params:'{"amount": 3}'},f:["9"]}," ",{p:[15,6,1006],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=4?null:"disabled"'},p:[15,36,1036]}],style:[{t:2,x:{r:["data.setting"],s:'_0==4?"selected":null'},p:[15,89,1089]}],action:"setting",params:'{"amount": 4}'},f:["12"]}," ",{p:[16,6,1193],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=5?null:"disabled"'},p:[16,36,1223]}],style:[{t:2,x:{r:["data.setting"],s:'_0==5?"selected":null'},p:[16,89,1276]}],action:"setting",params:'{"amount": 5}'},f:["15"]}]}]}," ",{p:[19,3,1410],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[21,6,1476],t:7,e:"span",f:[{t:2,x:{r:["adata.TankCurrentVolume"],s:"Math.round(_0)"},p:[21,12,1482]},"/",{t:2,r:"data.TankMaxVolume",p:[21,52,1522]}," Units"]}," ",{p:[22,6,1564],t:7,e:"br"}," ",{p:[23,5,1575],t:7,e:"br"}," ",{t:4,f:[{p:[25,7,1623],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[25,50,1666]}," units of ",{t:2,r:"name",p:[25,85,1701]}]},{p:[25,100,1716],t:7,e:"br"}],n:52,r:"adata.TankContents",p:[24,6,1587]}],n:50,r:"data.isTankLoaded",p:[20,4,1444]},{t:4,n:51,f:[{p:[28,6,1757],t:7,e:"span",a:{"class":"bad"},f:["Tank Empty"]}],r:"data.isTankLoaded"}," ",{p:[30,4,1809],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Eject":"Close"'},p:[30,21,1826]}],style:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"selected":null'},p:[31,12,1881]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[32,12,1936]}],action:"purge"},f:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Purge Contents":"No chemicals detected"'},p:[33,20,1999]}]}]}]}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,2,1]}]},e.exports=a.extend(r.exports)},{341:341}],467:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],468:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],469:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,8,97],t:7,e:"ui-button",a:{action:"jump",params:['{"name" : ',{t:2,r:"name",p:[4,51,140]},"}"]},f:["Jump"]}," ",{p:[7,9,195],t:7,e:"ui-button",a:{action:"spawn",params:['{"name" : ',{t:2,r:"name",p:[7,53,239]},"}"]},f:["Spawn"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[2,22,46]}],button:0},f:[" ",{p:[11,3,308],t:7,e:"ui-section",a:{label:"Description"},f:[{p:[12,5,346],t:7,e:"span",f:[{t:3,r:"desc",p:[12,11,352]}]}]}," ",{p:[14,3,390],t:7,e:"ui-section",a:{label:"Spawners left"},f:[{p:[15,5,430],t:7,e:"span",f:[{t:2,r:"amount_left",p:[15,11,436]}]}]}]}],n:52,r:"data.spawners",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],470:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],471:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=a.extend(r.exports)},{341:341}],472:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],473:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],474:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],475:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 1:return"good";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,173],t:7,e:"ui-notice",f:[{p:[14,2,187],t:7,e:"ui-section",a:{label:"Reconnect"},f:[{p:[15,3,221],t:7,e:"div",a:{style:"float:right"},f:[{p:[16,4,251],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]}]}]}," ",{p:[20,1,359],t:7,e:"ui-display",a:{title:"Turbine Controller"},f:[{p:[21,2,401],t:7,e:"ui-section",a:{label:"Status"},f:[{t:4,f:[{p:[23,4,456],t:7,e:"span",a:{"class":"bad"},f:["Broken"]}],n:50,r:"data.broken",p:[22,3,432]},{t:4,n:51,f:[{p:[25,4,504],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.online"],s:"_0(_1)"},p:[25,17,517]}]},f:[{t:2,x:{r:["data.online","data.compressor_broke","data.turbine_broke"],s:'_0&&!(_1||_2)?"Online":"Offline"'},p:[25,46,546]}]}],r:"data.broken"}," ",{p:[27,3,656],t:7,e:"div",a:{style:"float:right"},f:[{p:[28,4,686],t:7,e:"ui-button",a:{icon:"power-off",action:"power-on",state:[{t:2,r:"data.broken",p:[28,57,739]}],style:[{t:2,x:{r:["data.online"],s:'_0?"selected":""'},p:[28,81,763]}]},f:["On"]}," ",{p:[29,4,817],t:7,e:"ui-button",a:{icon:"close",action:"power-off",state:[{t:2,r:"data.broken",p:[29,54,867]}],style:[{t:2,x:{r:["data.online"],s:'_0?"":"selected"'},p:[29,78,891]}]},f:["Off"]}]}," ",{t:4,f:[{p:[32,4,989],t:7,e:"br"}," [ ",{p:[33,6,1e3],t:7,e:"span",a:{"class":"bad"},f:["Compressor is inoperable"]}," ]"],n:50,r:"data.compressor_broke",p:[31,3,955]}," ",{t:4,f:[{p:[36,4,1097],t:7,e:"br"}," [ ",{p:[37,6,1108],t:7,e:"span",a:{"class":"bad"},f:["Turbine is inoperable"]}," ]"],n:50,r:"data.turbine_broke",p:[35,3,1066]}]}]}," ",{p:[41,1,1200],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[42,2,1230],t:7,e:"ui-section",a:{label:"Turbine Speed"},f:[{p:[43,3,1268],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.rpm"],s:'_0?"--":_1'},p:[43,9,1274]}," RPM"]}]}," ",{p:[45,2,1337],t:7,e:"ui-section",a:{label:"Internal Temp"},f:[{p:[46,3,1375],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.temp"],s:'_0?"--":_1'},p:[46,9,1381]}," K"]}]}," ",{p:[48,2,1443],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{p:[49,3,1483],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.power"],s:'_0?"--":_1'},p:[49,9,1489]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],476:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{341:341}],477:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,331],t:7,e:"ui-notice",f:[{p:[17,4,347],t:7,e:"span",f:["Safety restraints disabled."]}]}],n:50,r:"data.emagged",p:[15,2,307]}," ",{t:4,f:[{p:[21,3,442],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[22,4,482],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[23,5,513]}]}," ",{p:[25,4,559],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[26,5,592]}]}," ",{p:[28,4,640],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,5,673],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[29,26,694]}],value:[{t:2,r:"adata.vr_avatar.health",p:[29,64,732]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[29,99,767]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[29,140,808]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[29,179,847]}]}]}]}],n:50,r:"data.vr_avatar",p:[20,2,416]},{t:4,n:51,f:[{p:[33,3,935],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[37,2,1031],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[38,3,1067],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[38,20,1084]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[39,4,1151]}," the VR Sleeper"]}," ",{t:4,f:[{p:[42,4,1253],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[41,3,1225]}," ",{t:4,f:[{p:[47,4,1376],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar"},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[46,3,1349]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],478:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section", -a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=a.extend(r.exports)},{341:341}],479:[function(t,e,n){(function(e){"use strict";var n=t(341),a=e.interopRequireDefault(n);t(331),t(1),t(327),t(330);var r=t(480),i=e.interopRequireDefault(r),o=t(481),s=t(328),p=t(329),u=e.interopRequireDefault(p);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(485)),window.initialize=function(e){window.tgui=window.tgui||new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(482),text:t(486),config:n.config,data:n.data,adata:n.data}}})};var c=document.getElementById("data"),l=c.textContent,d=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(d,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var f=new u["default"]("FontAwesome");f.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,327:327,328:328,329:329,330:330,331:331,341:341,480:480,481:481,482:482,485:485,486:486,"babel/external-helpers":"babel/external-helpers"}],480:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(481),a=t(483);e.exports={components:{"ui-bar":t(342),"ui-button":t(343),"ui-display":t(344),"ui-input":t(345),"ui-linegraph":t(346),"ui-notice":t(347),"ui-section":t(349),"ui-subdisplay":t(350),"ui-tabs":t(351)},events:{enter:t(339).enter,space:t(339).space},transitions:{fade:t(340)},onconfig:function(){var e=this.get("config.interface"),n={ai_airlock:t(355),airalarm:t(356),"airalarm/back":t(357),"airalarm/modes":t(358),"airalarm/scrubbers":t(359),"airalarm/status":t(360),"airalarm/thresholds":t(361),"airalarm/vents":t(362),airlock_electronics:t(363),apc:t(364),atmos_alert:t(365),atmos_control:t(366),atmos_filter:t(367),atmos_mixer:t(368),atmos_pump:t(369),borgopanel:t(370),brig_timer:t(371),bsa:t(372),canister:t(373),cargo:t(374),cargo_express:t(375),cellular_emporium:t(376),centcom_podlauncher:t(377),chem_dispenser:t(378),chem_heater:t(379),chem_master:t(380),chem_synthesizer:t(381),clockwork_slab:t(382),codex_gigas:t(383),computer_fabricator:t(384),crayon:t(385),crew:t(386),cryo:t(387),disposal_unit:t(388),dna_vault:t(389),dogborg_sleeper:t(390),eightball:t(391),emergency_shuttle_console:t(392),engraved_message:t(393),error:t(394),"exofab - Copia":t(395),exonet_node:t(396),firealarm:t(397),gps:t(398),gulag_console:t(399),gulag_item_reclaimer:t(400),holodeck:t(401),implantchair:t(402),intellicard:t(403),keycard_auth:t(404),labor_claim_console:t(405),language_menu:t(406),launchpad_remote:t(407),mech_bay_power_console:t(408),mulebot:t(409),nanite_chamber_control:t(410),nanite_cloud_control:t(411),nanite_program_hub:t(412),nanite_programmer:t(413),nanite_remote:t(414),notificationpanel:t(415),ntnet_relay:t(416),ntos_ai_restorer:t(417),ntos_card:t(418),ntos_configuration:t(419),ntos_file_manager:t(420),ntos_main:t(421),ntos_net_chat:t(422),ntos_net_dos:t(423),ntos_net_downloader:t(424),ntos_net_monitor:t(425),ntos_net_transfer:t(426),ntos_power_monitor:t(427),ntos_revelation:t(428),ntos_station_alert:t(429),ntos_supermatter_monitor:t(430),ntosheader:t(431),nuclear_bomb:t(432),operating_computer:t(433),ore_redemption_machine:t(434),pandemic:t(435),personal_crafting:t(436),portable_pump:t(437),portable_scrubber:t(438),power_monitor:t(439),radio:t(440),rdconsole:t(441),"rdconsole/circuit":t(442),"rdconsole/designview":t(443),"rdconsole/destruct":t(444),"rdconsole/diskopsdesign":t(445),"rdconsole/diskopstech":t(446),"rdconsole/nodeview":t(447),"rdconsole/protolathe":t(448),"rdconsole/rdheader":t(449),"rdconsole/settings":t(450),"rdconsole/techweb":t(451),reagentgrinder:t(452),rpd:t(453),"rpd/colorsel":t(454),"rpd/dirsel":t(455),sat_control:t(456),scrubbing_types:t(457),shuttle_manipulator:t(458),"shuttle_manipulator/modification":t(459),"shuttle_manipulator/status":t(460),"shuttle_manipulator/templates":t(461),sleeper:t(462),slime_swap_body:t(463),smartvend:t(464),smes:t(465),smoke_machine:t(466),solar_control:t(467),space_heater:t(468),spawners_menu:t(469),station_alert:t(470),suit_storage_unit:t(471),tank_dispenser:t(472),tanks:t(473),thermomachine:t(474),turbine_computer:t(475),uplink:t(476),vr_sleeper:t(477),wires:t(478)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(354),titlebar:t(353),resize:t(348)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{339:339,340:340,341:341,342:342,343:343,344:344,345:345,346:346,347:347,348:348,349:349,350:350,351:351,353:353,354:354,355:355,356:356,357:357,358:358,359:359,360:360,361:361,362:362,363:363,364:364,365:365,366:366,367:367,368:368,369:369,370:370,371:371,372:372,373:373,374:374,375:375,376:376,377:377,378:378,379:379,380:380,381:381,382:382,383:383,384:384,385:385,386:386,387:387,388:388,389:389,390:390,391:391,392:392,393:393,394:394,395:395,396:396,397:397,398:398,399:399,400:400,401:401,402:402,403:403,404:404,405:405,406:406,407:407,408:408,409:409,410:410,411:411,412:412,413:413,414:414,415:415,416:416,417:417,418:418,419:419,420:420,421:421,422:422,423:423,424:424,425:425,426:426,427:427,428:428,429:429,430:430,431:431,432:432,433:433,434:434,435:435,436:436,437:437,438:438,439:439,440:440,441:441,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451,452:452,453:453,454:454,455:455,456:456,457:457,458:458,459:459,460:460,461:461,462:462,463:463,464:464,465:465,466:466,467:467,468:468,469:469,470:470,471:471,472:472,473:473,474:474,475:475,476:476,477:477,478:478,481:481,483:483}],481:[function(t,e,n){"use strict";function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],482:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],483:[function(t,e,n){"use strict";function a(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function r(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(481)},{481:481}],484:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;a||p.textContent.toLowerCase().includes(e)?p.style.display="":p.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],485:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],486:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var p=Array(o),u=0;o>u;u++)p[u]=arguments[u+3];n.children=p}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(p){r("throw",p)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(p){return void n(p)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],384:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["Network Card"]}," allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["Processor Unit"]}," is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["Tesla Relay"]}," is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["Nano Printer"]}," is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["Card Reader"]}," adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{341:341}],385:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],386:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{isHead:function(t){return t%10==0},dept_class:function(t){return 0==t?"dept-cap":t>=10&&20>t?"dept-sec":t>=20&&30>t?"dept-med":t>=30&&40>t?"dept-sci":t>=40&&50>t?"dept-eng":t>=50&&60>t?"dept-cargo":t>=200&&230>t?"dept-cent":"dept-other"},health_state:function(t,e,n,a){var r=t+e+n+a;return 0>=r?"health-5":25>=r?"health-4":50>=r?"health-3":75>=r?"health-2":"health-0"}}}}(r),r.exports.css=" .health {\r\n width: 16px;\r\n height: 16px;\r\n background-color: #FFF;\r\n border: 1px solid #434343;\r\n position: relative;\r\n top: 2px;\r\n display: inline-block;\r\n }\r\n .health-5 { background-color: #17d568; }\r\n .health-4 { background-color: #2ecc71; }\r\n .health-3 { background-color: #e67e22; }\r\n .health-2 { background-color: #ed5100; }\r\n .health-1 { background-color: #e74c3c; }\r\n .health-0 { background-color: #ed2814; }\r\n\r\n .dept-cap {color : #C06616;}\r\n .dept-sec {color : #E74C3C;}\r\n .dept-med {color : #3498DB;}\r\n .dept-sci {color : #9B59B6;}\r\n .dept-eng {color : #F1C40F;}\r\n .dept-cargo {color : #F39C12;}\r\n .dept-cent {color : #00C100;}\r\n .dept-other {color: #C38312;}\r\n\r\n .oxy { color : #3498db; }\r\n .toxin { color : #2ecc71; }\r\n .burn { color : #e67e22; }\r\n .brute { color : #e74c3c; }\r\n\r\n table.crew{\r\n border-collapse: collapse;\r\n }\r\n\r\n table.crew td {\r\n padding : 0px 10px;\r\n }",r.exports.template={v:3,t:[" ",{p:[27,1,1030],t:7,e:"ui-display",f:[{p:[28,2,1045],t:7,e:"ui-section",f:[{p:[29,3,1061],t:7,e:"table",a:{"class":"crew"},f:[{p:[30,3,1085],t:7,e:"thead",f:[{p:[31,3,1096],t:7,e:"tr",f:[{p:[32,4,1105],t:7,e:"th",f:["Name"]}," ",{p:[33,4,1123],t:7,e:"th",f:["Status"]}," ",{p:[34,4,1143],t:7,e:"th",f:["Vitals"]}," ",{p:[35,4,1163],t:7,e:"th",f:["Position"]}," ",{t:4,f:[{p:[37,5,1216],t:7,e:"th",f:["Tracking"]}],n:50,r:"data.link_allowed",p:[36,4,1185]}]}]}," ",{p:[41,3,1270],t:7,e:"tbody",f:[{t:4,f:[{p:[43,4,1308],t:7,e:"tr",f:[{p:[44,5,1318],t:7,e:"td",f:[{p:[45,6,1329],t:7,e:"span",a:{"class":[{t:2,x:{r:["isHead","ijob"],s:'_0(_1)?"bold ":""'},p:[45,19,1342]},{t:2,x:{r:["dept_class","ijob"],s:"_0(_1)"},p:[45,49,1372]}]},f:[{t:2,r:"name",p:[46,7,1402]}," (",{t:2,r:"assignment",p:[46,17,1412]},") ",{p:[47,6,1434],t:7,e:"span",f:[]}]}]}," ",{p:[49,5,1457],t:7,e:"td",f:[{t:4,f:[{p:[51,7,1498],t:7,e:"span",a:{"class":["health ",{t:2,x:{r:["health_state","oxydam","toxdam","burndam","brutedam"],s:"_0(_1,_2,_3,_4)"},p:[51,27,1518]}]}}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[50,6,1468]},{t:4,n:51,f:[{t:4,f:[{p:[54,8,1626],t:7,e:"span",a:{"class":"health health-5"}}],n:50,r:"life_status",p:[53,7,1598]},{t:4,n:51,f:[{p:[56,8,1688],t:7,e:"span",a:{"class":"health health-0"}}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[60,5,1771],t:7,e:"td",f:[{t:4,f:[{p:[62,7,1812],t:7,e:"span",f:["( ",{p:[64,8,1836],t:7,e:"span",a:{"class":"oxy"},f:[{t:2,r:"oxydam",p:[64,26,1854]}]}," / ",{p:[66,8,1890],t:7,e:"span",a:{"class":"toxin"},f:[{t:2,r:"toxdam",p:[66,28,1910]}]}," / ",{p:[68,8,1946],t:7,e:"span",a:{"class":"burn"},f:[{t:2,r:"burndam",p:[68,27,1965]}]}," / ",{p:[70,8,2002],t:7,e:"span",a:{"class":"brute"},f:[{t:2,r:"brutedam",p:[70,28,2022]}]}," )"]}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[61,6,1782]},{t:4,n:51,f:[{t:4,f:[{p:[75,8,2116],t:7,e:"span",f:["Alive"]}],n:50,r:"life_status",p:[74,7,2088]},{t:4,n:51,f:[{p:[77,8,2159],t:7,e:"span",f:["Dead"]}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[81,5,2222],t:7,e:"td",f:[{t:4,f:[{p:[83,6,2260],t:7,e:"span",f:[{t:2,r:"area",p:[83,12,2266]}]}],n:50,x:{r:["pos_x"],s:"_0!=null"},p:[82,5,2232]},{t:4,n:51,f:[{p:[85,6,2302],t:7,e:"span",f:["N/A"]}],x:{r:["pos_x"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[89,6,2381],t:7,e:"td",f:[{p:[90,7,2393],t:7,e:"ui-button",a:{action:"select_person",state:[{t:2,x:{r:["can_track"],s:'_0?null:"disabled"'},p:[90,48,2434]}],params:['{"name":"',{t:2,r:"name",p:[90,100,2486]},'"}']},f:["Track"]}]}],n:50,r:"data.link_allowed",p:[88,5,2348]}]}],n:52,r:"data.sensors",p:[42,3,1281]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{341:341}],387:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,189],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,223],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,236]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,265]}]}]}," ",{p:[9,4,317],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[10,6,356],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.temperaturestatus",p:[10,19,369]}]},f:[{t:2,r:"data.occupant.bodyTemperature",p:[10,56,406]}," K"]}]}," ",{p:[12,5,472],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[13,7,507],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[13,20,520]}],max:[{t:2,r:"data.occupant.maxHealth",p:[13,54,554]}],value:[{t:2,r:"data.occupant.health",p:[13,90,590]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[14,16,632]}]},f:[{t:2,r:"data.occupant.health",p:[14,68,684]}]}]}," ",{t:4,f:[{p:[17,7,908],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[17,26,927]}]},f:[{p:[18,9,948],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[18,30,969]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,66,1005]}],state:"bad"},f:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,103,1042]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[16,5,742]}],n:50,r:"data.hasOccupant",p:[5,3,159]}]}," ",{p:[23,1,1138],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[24,3,1167],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[25,5,1199],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[25,22,1216]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[26,14,1276]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[27,14,1332]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[28,22,1391]}]}]}," ",{p:[30,3,1459],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,3,1495],t:7,e:"span",a:{"class":[{t:2,r:"data.temperaturestatus",p:[31,16,1508]}]},f:[{t:2,r:"data.cellTemperature",p:[31,44,1536]}," K"]}]}," ",{p:[33,2,1588],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[34,5,1619],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[34,22,1636]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[34,73,1687]}]}," ",{p:[35,5,1740],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[35,22,1757]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[35,86,1821]}]}]}]}," ",{p:{button:[{p:[40,5,1967],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[40,36,1998]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[42,3,2101],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[45,9,2211],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,r:"volume",p:[45,52,2254]}," units of ",{t:2,r:"name",p:[45,72,2274]}]},{p:[45,87,2289],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[44,7,2171]},{t:4,n:51,f:[{p:[47,9,2320],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[43,5,2136]},{t:4,n:51,f:[{p:[50,7,2396],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],388:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{ +p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle"},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],389:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{341:341}],390:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,183],t:7,e:"ui-section",a:{label:"Items in storage"},f:[{p:[7,4,225],t:7,e:"span",f:[{t:2,r:"data.items",p:[7,10,231]}]}]}],n:50,r:"data.items",p:[5,3,159]}," ",{t:4,f:[{p:[11,5,310],t:7,e:"ui-section",a:{label:"State"},f:[{p:[12,7,344],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[12,20,357]}]},f:[{t:2,r:"data.occupant.stat",p:[12,49,386]}]}]}," ",{p:[14,5,439],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[15,7,474],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[15,20,487]}],max:[{t:2,r:"data.occupant.maxHealth",p:[15,54,521]}],value:[{t:2,r:"data.occupant.health",p:[15,90,557]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[16,16,599]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[16,68,651]}]}]}," ",{t:4,f:[{p:[19,7,888],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[19,26,907]}]},f:[{p:[20,9,928],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[20,30,949]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[20,66,985]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[20,103,1022]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[18,5,722]}," ",{p:[23,5,1109],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[24,9,1145],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[24,22,1158]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[24,68,1204]}]}]}," ",{p:[26,5,1287],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[27,9,1323],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[27,22,1336]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[27,68,1382]}]}]}," ",{p:[29,5,1466],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[31,11,1553],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[31,54,1596]}," units of ",{t:2,r:"name",p:[31,89,1631]}]},{p:[31,104,1646],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[30,9,1508]},{t:4,n:51,f:[{p:[33,11,1681],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[10,3,283]}]}," ",{p:[38,1,1777],t:7,e:"ui-display",a:{title:"Operations"},f:[{p:[39,3,1812],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[41,7,1872],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied"],s:'_0?null:"disabled"'},p:[41,38,1903]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[41,111,1976]},'"}']},f:[{t:2,r:"name",p:[41,121,1986]}]},{p:[41,141,2006],t:7,e:"br"}],n:52,r:"data.chem",p:[40,5,1845]}]}," ",{p:[44,2,2046],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[45,6,2079],t:7,e:"ui-button",a:{icon:"sign-out",action:"eject"},f:["Eject Contents"]}]}," ",{p:[47,2,2166],t:7,e:"ui-section",a:{label:"Self Cleaning"},f:[{p:[48,3,2204],t:7,e:"ui-button",a:{icon:"recycle",action:"cleaning"},f:["Self-Clean Cycle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],391:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{341:341}],392:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{341:341}],393:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{341:341}],394:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{341:341}],395:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,20],t:7,e:"ui-notice",f:["Currently syncing with the database"]}],n:50,r:"data.sync",p:[1,1,0]},{t:4,n:51,f:[{p:{button:[{p:[8,4,163],t:7,e:"ui-button",a:{icon:"eject",action:"eject_all"},f:["Eject all"]}," ",{p:[9,4,232],t:7,e:"ui-button",a:{icon:["toggle-",{t:2,x:{r:["data.show_materials"],s:'_0?"off":"on"'},p:[9,28,256]}],action:"toggle_materials_visibility"},f:[{t:2,x:{r:["data.show_materials"],s:'_0?"Hide":"Show"'},p:[10,5,339]}]}]},t:7,e:"ui-display",a:{title:"Materials",button:0},f:[" ",{t:4,f:[{p:[14,4,449],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[15,5,484],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[16,6,520],t:7,e:"section",a:{"class":"cell"}}," ",{p:[17,6,559],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[20,6,620],t:7,e:"section",a:{"class":"cell"},f:["Amount"]}," ",{p:[23,6,680],t:7,e:"section",a:{"class":"cell"}}," ",{p:[24,6,719],t:7,e:"section",a:{"class":"cell"}}]}," ",{t:4,f:[{p:[27,6,808],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[28,7,845],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[29,8,876]}]}," ",{p:[31,7,910],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"amount",p:[32,8,941]}]}," ",{p:[34,7,977],t:7,e:"section",a:{"class":"cell"},f:[{p:[35,8,1008],t:7,e:"ui-button",a:{icon:"eject"},f:["Release amount"]}]}," ",{p:[37,7,1084],t:7,e:"section",a:{"class":"cell",style:"width: 40px;"},f:[{p:[38,8,1136],t:7,e:"ui-button",a:{icon:"eject"},f:["Release all"]}]}]}],n:52,r:"data.all_materials",p:[26,5,773]}]}],n:50,r:"data.show_materials",p:[13,3,417]}]}," ",{p:[45,2,1274],t:7,e:"ui-display",a:{title:"Categories"},f:[{t:4,f:[{p:[47,4,1334],t:7,e:"ui-button",f:[{t:2,r:".",p:[47,15,1345]}]}],r:"data.categories",p:[46,3,1309]}]}],r:"data.sync"}]},e.exports=a.extend(r.exports)},{341:341}],396:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,5,49],t:7,e:"ui-button",a:{action:"toggle_power",style:[{t:2,x:{r:["data.toggle"],s:'_0?"selected":null'},p:[5,18,111]}]},f:["Turn ",{t:2,x:{r:["data.toggle"],s:'_0?"off":"on"'},p:[6,16,166]}]}]}," ",{p:[9,3,235],t:7,e:"ui-display",a:{title:"Logging"},f:[{t:4,f:[{p:[11,3,292],t:7,e:"ui-section",a:{label:">"},f:[{t:2,r:".",p:[11,25,314]},{p:[11,30,319],t:7,e:"ui-section",f:[]}]}],n:52,r:"data.logs",p:[10,5,269]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],397:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{341:341}],398:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{341:341}],399:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],400:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=a.extend(r.exports)},{341:341}],401:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{341:341}],402:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],403:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{341:341}],404:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{341:341}],405:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],406:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{341:341}],407:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224],t:7,e:"b",f:[{t:2,r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["â†"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button",a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2, +r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down"},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{341:341}],408:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{341:341}],409:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{341:341}],410:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Chamber Console"},f:[{p:[2,1,45],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,2,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,63,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,3,200],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[6,36,233]}]}," ",{p:[7,3,268],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[7,35,300]}]}," ",{p:[8,3,335],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[8,41,373]}]}," ",{t:4,f:[{p:[10,4,477],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[10,41,514]}]}],n:50,r:"data.disk.activation_delay",p:[9,3,438]}," ",{t:4,f:[{p:[13,4,600],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[13,30,626]}]}," ",{p:[14,4,663],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[14,36,695]}]}],n:50,r:"data.disk.timer",p:[12,3,572]}," ",{t:4,f:[{p:[17,4,785],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[17,40,821]}]}],n:50,r:"data.disk.activation_code",p:[16,3,747]}," ",{t:4,f:[{p:[20,4,918],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[20,42,956]}]}],n:50,r:"data.disk.deactivation_code",p:[19,3,878]}," ",{t:4,f:[{p:[23,4,1047],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[23,34,1077]}]}],n:50,r:"data.disk.kill_code",p:[22,3,1015]}," ",{t:4,f:[{p:[26,4,1163],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[26,37,1196]}]}],n:50,r:"data.disk.trigger_code",p:[25,3,1128]}," ",{t:4,f:[{t:4,f:[{p:[30,6,1332],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[30,25,1351]}]},f:[{t:2,r:"value",p:[30,35,1361]}]}],n:52,r:"data.disk.extra_settings",p:[29,4,1291]}],n:50,r:"data.disk.has_extra_settings",p:[28,3,1250]}],n:50,r:"data.has_program",p:[5,2,172]},{t:4,n:51,f:[{p:[34,3,1423],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,1,80]},{t:4,n:51,f:[{p:[37,2,1489],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[40,1,1550],t:7,e:"br"}," ",{t:4,f:[{p:[42,2,1582],t:7,e:"ui-notice",f:[{t:2,r:"data.status_msg",p:[42,13,1593]}]}],n:50,r:"data.status_msg",p:[41,1,1556]},{t:4,n:51,f:[{p:[44,2,1637],t:7,e:"ui-display",a:{title:"Chamber"},f:[{p:[45,2,1668],t:7,e:"ui-section",f:[{p:[45,14,1680],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock-open":"lock"'},p:[45,30,1696]}],action:"toggle_lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[45,90,1756]}," Chamber"]},{p:[45,146,1812],t:7,e:"br"}]}," ",{p:[46,2,1832],t:7,e:"ui-section",f:[{p:[46,14,1844],t:7,e:"b",f:["Occupant:"]}," ",{t:2,r:"data.occupant_name",p:[46,31,1861]}]}," ",{t:4,f:[{p:[48,4,1929],t:7,e:"ui-section",f:[{p:[48,16,1941],t:7,e:"ui-notice",f:["No nanites detected."]}]}," ",{p:[49,4,2002],t:7,e:"ui-section",f:[{p:[49,16,2014],t:7,e:"ui-button",a:{icon:"syringe",action:"nanite_injection"},f:["Implant Nanites"]}]}],n:50,x:{r:["data.has_nanites"],s:"!_0"},p:[47,2,1899]},{t:4,n:51,f:[{p:[51,3,2121],t:7,e:"ui-display",a:{title:"Nanites"},f:[{t:4,f:[{p:[53,5,2181],t:7,e:"ui-button",a:{icon:"download",action:"add_program"},f:["Install Program From Disk"]},{p:[53,90,2266],t:7,e:"br"}," ",{p:[54,5,2276],t:7,e:"br"}],n:50,r:"data.has_disk",p:[52,4,2154]}," ",{p:[56,4,2297],t:7,e:"ui-section",f:[{p:[57,5,2315],t:7,e:"ui-section",a:{label:"Nanite Volume"},f:[{t:2,r:"data.nanite_volume",p:[57,39,2349]}]}," ",{p:[58,5,2390],t:7,e:"ui-section",a:{label:"Growth Rate"},f:[{t:2,r:"data.regen_rate",p:[58,37,2422]}]}," ",{p:[59,5,2460],t:7,e:"ui-section",a:{label:"Safety Threshold"},f:[{t:2,r:"data.safety_threshold",p:[59,42,2497]}," ",{p:[59,68,2523],t:7,e:"ui-button",a:{icon:"pencil",action:"set_safety"},f:["Set"]}]}," ",{p:[60,5,2603],t:7,e:"ui-section",a:{label:"Cloud ID"},f:[{t:2,x:{r:["data.cloud_id"],s:'_0?_0:"No Cloud"'},p:[60,34,2632]}," ",{p:[60,82,2680],t:7,e:"ui-button",a:{icon:"pencil",action:"set_cloud"},f:["Set"]}]}]}," ",{p:[62,4,2776],t:7,e:"ui-display",a:{title:"Programs"},f:[{t:4,f:[{p:[64,6,2845],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[64,25,2864]}],button:0},f:[{p:[65,6,2888],t:7,e:"ui-button",a:{icon:"minus",action:"remove_program",params:['{"program_id": "',{t:2,r:"id",p:[65,78,2960]},'"}']},f:["Uninstall"]}," ",{p:[66,6,2998],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[66,38,3030]}]}," ",{t:4,f:[{p:[68,7,3094],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[68,45,3132]}]}," ",{p:[69,7,3191],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[69,44,3228]},"/s"]}," ",{t:4,f:[{p:[71,8,3291],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[71,41,3324]}]}," ",{p:[72,8,3362],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[72,45,3399]}," seconds"]}],n:50,r:"can_trigger",p:[70,7,3263]}," ",{t:4,f:[{t:4,f:[{p:[76,9,3534],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,46,3571]}]}],n:50,r:"activation_delay",p:[75,8,3500]}," ",{t:4,f:[{p:[79,9,3652],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,35,3678]}]}," ",{p:[80,9,3710],t:7,e:"ui-section",a:{label:"Timer Type"},f:[{t:2,r:"timer_type",p:[80,40,3741]}]}],n:50,r:"timer",p:[78,8,3629]}," ",{t:4,f:[{t:4,f:[{p:[84,11,3865],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,30,3884]}]},f:[{t:2,r:"value",p:[84,40,3894]}]}],n:52,r:"extra_settings",p:[83,9,3829]}],n:50,r:"has_extra_settings",p:[82,8,3793]}," ",{t:4,f:[{t:4,f:[{p:[89,10,4032],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[89,46,4068]}]}],n:50,r:"activation_code",p:[88,9,3998]}," ",{t:4,f:[{p:[92,10,4163],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[92,48,4201]}]}],n:50,r:"deactivation_code",p:[91,9,4127]}," ",{t:4,f:[{p:[95,10,4290],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[95,40,4320]}]}],n:50,r:"kill_code",p:[94,9,4262]}," ",{t:4,f:[{p:[98,10,4404],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[98,43,4437]}]}],n:50,r:"trigger_code",p:[97,9,4373]}],n:50,x:{r:["data.scan_level"],s:"_0>=4"},p:[87,8,3960]}],n:50,x:{r:["data.scan_level"],s:"_0>=3"},p:[74,7,3463]}],n:50,x:{r:["data.scan_level"],s:"_0>=2"},p:[67,6,3058]}]}],n:52,r:"data.mob_programs",p:[63,5,2811]}]}]}],x:{r:["data.has_nanites"],s:"!_0"}}]}],r:"data.status_msg"}]}]},e.exports=a.extend(r.exports)},{341:341}],411:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Cloud Console"},f:[{p:[2,1,43],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,3,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,64,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,4,202],t:7,e:"ui-section",f:[{p:[7,5,220],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[7,38,253]}]}," ",{p:[8,5,290],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[8,37,322]}]}," ",{p:[9,5,359],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[9,43,397]}]}," ",{t:4,f:[{p:[11,6,505],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[11,43,542]}]}],n:50,r:"data.disk.activation_delay",p:[10,5,464]}," ",{t:4,f:[{p:[14,6,634],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[14,32,660]}]}," ",{p:[15,6,699],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[15,38,731]}]}],n:50,r:"data.disk.timer",p:[13,5,604]}," ",{t:4,f:[{p:[18,6,827],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[18,42,863]}]}],n:50,r:"data.disk.activation_code",p:[17,5,787]}," ",{t:4,f:[{p:[21,6,966],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[21,44,1004]}]}],n:50,r:"data.disk.deactivation_code",p:[20,5,924]}," ",{t:4,f:[{p:[24,6,1101],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[24,36,1131]}]}],n:50,r:"data.disk.kill_code",p:[23,5,1067]}," ",{t:4,f:[{p:[27,6,1223],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[27,39,1256]}]}],n:50,r:"data.disk.trigger_code",p:[26,5,1186]}," ",{t:4,f:[{t:4,f:[{p:[31,8,1400],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[31,27,1419]}]},f:[{t:2,r:"value",p:[31,37,1429]}]}],n:52,r:"data.disk.extra_settings",p:[30,6,1357]}],n:50,r:"data.disk.has_extra_settings",p:[29,5,1314]}]}],n:50,r:"data.has_program",p:[5,3,173]},{t:4,n:51,f:[{p:[36,4,1515],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,2,79]},{t:4,n:51,f:[{p:[39,3,1584],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[42,1,1646],t:7,e:"ui-display",a:{title:"Cloud Storage"},f:[{t:4,f:[{p:[44,3,1713],t:7,e:"ui-button",a:{icon:"plus-circle",action:"create_backup"},f:["Create New Backup"]}," ",{p:[45,3,1799],t:7,e:"ui-display",a:{title:"Active Backups"},f:[{t:4,f:[{p:[47,5,1873],t:7,e:"ui-button",a:{action:"set_view",params:['{"view": "',{t:2,r:"cloud_id",p:[47,52,1920]},'"}']},f:["Backup #",{t:2,r:"cloud_id",p:[47,76,1944]}]}],n:52,r:"data.cloud_backups",p:[46,4,1839]}]}],n:50,x:{r:["data.current_view"],s:"!_0"},p:[43,2,1683]},{t:4,n:51,f:[{p:[51,3,2014],t:7,e:"ui-button",a:{icon:"undo",action:"set_view",params:'{"view": "0"}'},f:["Return"]}," ",{t:4,f:[{p:[53,4,2131],t:7,e:"ui-notice",f:["ERROR: Backup not found."]}],n:50,x:{r:["data.cloud_backup"],s:"!_0"},p:[52,3,2100]},{t:4,n:51,f:[{p:[55,4,2195],t:7,e:"ui-display",a:{title:["Backup #",{t:2,r:"data.current_view",p:[55,31,2222]}]},f:[{t:4,f:[{p:[57,6,2282],t:7,e:"ui-button",a:{icon:"upload",action:"upload_program",style:"selected"},f:["Upload Program From Disk"]},{p:[57,108,2384],t:7,e:"br"}],n:50,r:"data.has_program",p:[56,5,2251]}," ",{t:4,f:[{p:[60,6,2443],t:7,e:"hr"}," ",{p:[61,6,2454],t:7,e:"ui-section",f:[{p:[62,7,2474],t:7,e:"h3",f:[{t:2,r:"name",p:[62,11,2478]}]}," ",{p:[63,7,2499],t:7,e:"div",a:{style:"float:right"},f:[{p:[64,8,2533],t:7,e:"ui-button",a:{icon:"minus-circle",action:"remove_program",style:"danger",params:['{"program_id": "',{t:2,r:"id",p:[64,102,2627]},'"}']},f:["Uninstall"]}]}]}," ",{p:[67,6,2699],t:7,e:"ui-section",f:[{p:[68,7,2719],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[68,39,2751]}]}," ",{p:[69,7,2780],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[69,45,2818]}]}," ",{p:[70,7,2877],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[70,44,2914]},"/s"]}," ",{t:4,f:[{p:[72,8,2977],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[72,41,3010]},"/s"]}," ",{p:[73,8,3050],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[73,45,3087]},"/s"]}],n:50,r:"can_trigger",p:[71,7,2949]}," ",{t:4,f:[{p:[76,8,3178],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,45,3215]}]}],n:50,r:"activation_delay",p:[75,7,3145]}," ",{t:4,f:[{p:[79,8,3293],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,34,3319]}]}," ",{p:[80,8,3350],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"timer_type",p:[80,40,3382]}]}],n:50,r:"timer",p:[78,7,3271]}," ",{t:4,f:[{p:[83,8,3464],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[83,44,3500]}]}],n:50,r:"activation_code",p:[82,7,3432]}," ",{t:4,f:[{p:[86,8,3589],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[86,46,3627]}]}],n:50,r:"deactivation_code",p:[85,7,3555]}," ",{t:4,f:[{p:[89,8,3710],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[89,38,3740]}]}],n:50,r:"kill_code",p:[88,7,3684]}," ",{t:4,f:[{p:[92,8,3818],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[92,41,3851]}]}],n:50,r:"trigger_code",p:[91,7,3789]}," ",{t:4,f:[{t:4,f:[{p:[96,10,3973],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[96,29,3992]}]},f:[{t:2,r:"value",p:[96,39,4002]}]}],n:52,r:"extra_settings",p:[95,8,3938]}],n:50,r:"has_extra_settings",p:[94,7,3903]}]}],n:52,r:"data.cloud_programs",p:[59,5,2407]}]}],x:{r:["data.cloud_backup"],s:"!_0"}}],x:{r:["data.current_view"],s:"!_0"}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],412:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Program Hub"},f:[{t:4,f:[{p:[3,2,65],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{p:[4,3,102],t:7,e:"ui-section",f:[{p:[5,4,119],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{p:[6,4,185],t:7,e:"ui-button",a:{icon:"minus-circle",action:"clear"},f:["Delete Program"]}]}," ",{t:4,f:[{p:[9,4,307],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[9,37,340]}]}," ",{p:[10,4,376],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[10,36,408]}]}],n:50,r:"data.has_program",p:[8,3,278]},{t:4,n:51,f:[{p:[12,4,456],t:7,e:"ui-notice",f:["No program installed."]}],r:"data.has_program"}]}],n:50,r:"data.has_disk",p:[2,1,41]},{t:4,n:51,f:[{p:[16,2,540],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"},{p:[18,1,586],t:7,e:"br"}," ",{p:[19,1,592],t:7,e:"ui-display",a:{title:"Programs"},f:[{p:[20,2,624],t:7,e:"ui-section",f:[{p:[21,3,640],t:7,e:"ui-button",a:{icon:"undo",action:"set_category",params:'{"category": "Main"}'},f:["Return"]}," ",{p:[22,3,737],t:7,e:"ui-button",a:{icon:"align-justify ",action:"toggle_details"},f:[{t:2,x:{r:["data.detail_view"],s:'_0?"Compact View":"Detailed View"'},p:[22,60,794]}]}]}," ",{t:4,f:[{p:[25,3,916],t:7,e:"ui-display",f:[{t:4,f:[{p:[27,5,964],t:7,e:"ui-section",f:[{p:[27,17,976],t:7,e:"ui-button",a:{action:"set_category",params:['{"category": "',{t:2,r:"name",p:[27,72,1031]},'"}']},f:[{t:2,r:"name",p:[27,84,1043]}]}]}],n:52,r:"data.categories",p:[26,4,933]}]}],n:50,x:{r:["data.category"],s:'_0=="Main"'},p:[24,2,881]},{t:4,n:51,f:[{p:[31,3,1122],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[31,22,1141]}]},f:[{t:4,f:[{t:4,f:[{p:[34,6,1229],t:7,e:"ui-display",f:[{p:[35,7,1249],t:7,e:"ui-section",f:[{p:[35,19,1261],t:7,e:"b",f:[{t:2,r:"name",p:[35,22,1264]}]}]}," ",{p:[36,7,1297],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[36,19,1309]}]}," ",{p:[37,7,1338],t:7,e:"ui-section",f:[{p:[38,8,1359],t:7,e:"ui-button",a:{icon:"download",action:"download",params:['{"program_id": "',{t:2,r:"id",p:[38,77,1428]},'"}'],state:[{t:2,x:{r:["data.has_disk"],s:'_0?null:"disabled"'},p:[38,94,1445]}]},f:["Download"]}]}]}],n:50,r:"data.detail_view",p:[33,5,1198]},{t:4,n:51,f:[{p:[44,6,1585],t:7,e:"ui-section",f:[{p:[44,18,1597],t:7,e:"ui-button",a:{action:"download",params:['{"program_id": "',{t:2,r:"id",p:[44,71,1650]},'"}']},f:[{t:2,r:"name",p:[44,81,1660]}]}]}],r:"data.detail_view"}],n:52,r:"data.program_list",p:[32,4,1165]}]}],x:{r:["data.category"],s:'_0=="Main"'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],413:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Programming"},f:[{t:4,f:[{p:[3,3,67],t:7,e:"ui-notice",f:["Insert a nanite program disk."]}],n:50,x:{r:["data.has_disk"],s:"!_0"},p:[2,1,41]},{t:4,n:51,f:[{p:[5,3,133],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{t:4,f:[{p:[7,5,229],t:7,e:"ui-notice",f:["No program detected."]}],n:50,x:{r:["data.has_program"],s:"!_0"},p:[6,3,198]},{t:4,n:51,f:[{p:[9,5,290],t:7,e:"ui-section",f:[{p:[10,7,310],t:7,e:"ui-display",a:{title:[{t:2,r:"data.name",p:[10,26,329]}]},f:[{t:2,r:"data.desc",p:[11,9,354]}]}]}," ",{p:[14,5,413],t:7,e:"ui-section",f:[{p:[15,7,433],t:7,e:"ui-section",a:{label:"Program Info"},f:["Nanites Consumed: ",{t:2,r:"data.use_rate",p:[16,26,493]},{p:[16,43,510],t:7,e:"br"}," ",{t:4,f:["Trigger Cost: ",{t:2,r:"data.trigger_cost",p:[18,25,574]},"u",{p:[18,47,596],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[17,9,524]}]}," ",{p:[22,7,648],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[23,9,685],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.activated"],s:'_0?"toggle-on":"toggle-off"'},p:[24,17,713]}],action:"toggle_active"},f:[{t:2,x:{r:["data.activated"],s:'_0?"Active":"Inactive"'},p:[26,11,809]}]}]}," ",{p:[30,7,905],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[31,9,944],t:7,e:"ui-button",a:{icon:"pencil",action:"set_activation_delay"}}," Activation Delay: ",{t:2,r:"data.activation_delay",p:[31,95,1030]}," ",{p:[31,121,1056],t:7,e:"br"}," ",{p:[32,9,1070],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer"}}," Timer: ",{t:2,r:"data.timer",p:[32,73,1134]}," ",{p:[32,88,1149],t:7,e:"br"}," ",{p:[33,9,1163],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer_type"}}," Timer Type: ",{t:2,r:"data.timer_type",p:[33,83,1237]}," ",{p:[33,103,1257],t:7,e:"br"}]}," ",{p:[36,7,1292],t:7,e:"ui-section",a:{label:"Codes"},f:[{p:[37,9,1328],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "activation"}'}}," Activation Code: ",{t:2,r:"data.activation_code",p:[37,121,1440]}," ",{p:[37,146,1465],t:7,e:"br"}," ",{p:[38,9,1479],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "deactivation"}'}}," Deactivation Code: ",{t:2,r:"data.deactivation_code",p:[38,125,1595]}," ",{p:[38,152,1622],t:7,e:"br"}," ",{p:[39,9,1636],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "kill"}'}}," Kill Code: ",{t:2,r:"data.kill_code",p:[39,109,1736]}," ",{p:[39,128,1755],t:7,e:"br"}," ",{t:4,f:[{p:[41,11,1805],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "trigger"}'}}," Trigger Code: ",{t:2,r:"data.trigger_code",p:[41,117,1911]}," ",{p:[41,139,1933],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[40,9,1769]}]}," ",{t:4,f:[{p:[46,9,2026],t:7,e:"ui-section",a:{label:"Special"},f:[{t:4,f:[{p:[48,13,2109],t:7,e:"ui-button",a:{icon:"pencil",action:"set_extra_setting",params:['{"target_setting": "',{t:2,r:"name",p:[48,93,2189]},'"}']}}," ",{t:2,r:"name",p:[48,118,2214]},": ",{t:2,r:"value",p:[48,128,2224]}," ",{p:[48,138,2234],t:7,e:"br"}],n:52,r:"data.extra_settings",p:[47,11,2066]}]}],n:50,r:"data.has_extra_settings",p:[45,7,1985]}]}],x:{r:["data.has_program"],s:"!_0"}}],x:{r:["data.has_disk"],s:"!_0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],414:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Control"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-notice",f:["The interface is locked."]}],n:50,r:"data.locked",p:[2,1,37]},{t:4,n:51,f:[{p:[5,3,121],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock Interface"]}," ",{p:[6,3,188],t:7,e:"ui-button",a:{icon:"save",action:"save"},f:["Save Current Setting"]}," ",{p:[7,3,261],t:7,e:"ui-section",a:{label:"Signal Code"},f:[{p:[8,5,299],t:7,e:"span",f:[{t:2,r:"data.code",p:[8,11,305]}]}," ",{p:[9,4,330],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code"},f:["Set"]}]}," ",{t:4,f:[{p:[12,5,443],t:7,e:"ui-section",a:{label:"Relay Code"},f:[{p:[13,7,482],t:7,e:"span",f:[{t:2,r:"data.relay_code",p:[13,13,488]}]}," ",{p:[14,5,520],t:7,e:"ui-button",a:{icon:"pencil",action:"set_relay_code"},f:["Set"]}]}],n:50,x:{r:["data.mode"],s:'_0=="Relay"'},p:[11,3,409]}," ",{p:[17,3,618],t:7,e:"ui-section",a:{label:"Signal Mode"},f:[{p:[18,5,656],t:7,e:"span",f:[{t:2,r:"data.mode",p:[18,11,662]}]}," ",{p:[19,5,688],t:7,e:"br"}," ",{p:[20,4,697],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Off"}'},f:["Off"]}," ",{p:[21,5,775],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Local"}'},f:["Local"]}," ",{p:[22,5,857],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Targeted"}'},f:["Targeted"]}," ",{p:[23,5,945],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Area"}'},f:["Area"]}," ",{p:[24,5,1025],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Relay"}'},f:["Relay"]}]}],r:"data.locked"}]}," ",{p:[28,1,1144],t:7,e:"ui-display",a:{title:"Saved Settings"},f:[{t:4,f:[{p:[30,3,1215],t:7,e:"ui-button",a:{icon:"load",action:"load",params:['{"save_id": "',{t:2,r:"id",p:[30,61,1273]},'"}']},f:[{t:2,r:"name",p:[30,71,1283]}]}," ",{t:4,f:[{p:[32,4,1332],t:7,e:"ui-button",a:{icon:"remove",action:"remove_save",params:['{"save_id": "',{t:2,r:"id",p:[32,71,1399]},'"}']},f:["Remove"]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[31,3,1307]}," ",{p:[34,3,1442],t:7,e:"br"}],n:52,r:"data.saved_settings",p:[29,2,1182]}]}]},e.exports=a.extend(r.exports)},{341:341}],415:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ghost roles"},f:[{p:[2,2,35],t:7,e:"ui-section",a:{label:"Ignored roles"},f:[{t:4,f:[{p:[4,4,99],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[4,21,116]}],style:[{t:2,x:{r:["enabled"],s:'_0?"danger":null'},p:[4,73,168]}],action:"toggle_ignore",params:['{"key": "',{t:2,r:"key",p:[4,144,239]},'"}']},f:[{t:2,r:"desc",p:[4,155,250]}]}],n:52,r:"data.ignore",p:[3,3,73]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],416:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{341:341}],417:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236]}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table", +f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582],t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],418:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';"},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],419:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],420:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],421:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:["   "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],422:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],423:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],424:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],425:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr", +f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],426:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],427:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}]}]}," ",{p:[55,5,1528],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1563],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1569]}]}]}],r:"config.fancy"}]}," ",{p:[60,1,1638],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1668],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1693],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1730],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1769],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1806],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1845],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1887],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1928],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2013],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2032]}],nowrap:0},f:[{p:[72,7,2057],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2078]}," %"]}," ",{p:[73,7,2136],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[73,28,2157]}]}," ",{p:[74,7,2199],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2220],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2233]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2262]}]}]}," ",{p:[75,7,2309],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2330],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2343]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2366]}," [",{p:[75,87,2389],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2395]}]},"]"]}]}," ",{p:[76,7,2444],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2465],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2478]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2501]}," [",{p:[76,87,2524],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2530]}]},"]"]}]}," ",{p:[77,7,2579],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2600],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2613]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2636]}," [",{p:[77,87,2659],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2665]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1987]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],428:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],429:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],430:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],431:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{341:341}],432:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],433:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,25],t:7,e:"ui-button",a:{icon:"undo",action:"change_menu",params:'{"menu": "1"}'},f:["Return"]}," ",{p:[3,2,113],t:7,e:"ui-display",a:{title:"Advanced Surgery Procedures"},f:[{p:[4,3,165],t:7,e:"ui-button",a:{icon:"download",action:"sync"},f:["Sync with research database"]}," ",{t:4,f:[{p:[6,4,278],t:7,e:"ui-display",f:[{p:[7,6,297],t:7,e:"ui-section",f:[{p:[7,18,309],t:7,e:"b",f:[{t:2,r:"name",p:[7,21,312]}]}]}," ",{p:[8,6,344],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[8,18,356]}]}]}],n:52,r:"data.surgeries",p:[5,3,249]}]}],n:50,x:{r:["data.menu"],s:"_0==2"},p:[1,1,0]},{t:4,n:51,f:[{p:[13,2,437],t:7,e:"ui-button",a:{action:"change_menu",params:'{"menu": "2"}'},f:["View Surgery Procedures"]}," ",{t:4,f:[{p:[15,3,556],t:7,e:"ui-notice",f:["No table detected!"]}],n:51,r:"data.table",p:[14,2,530]}," ",{p:[19,2,623],t:7,e:"ui-display",f:[{p:[20,3,639],t:7,e:"ui-display",a:{title:"Patient State"},f:[{t:4,f:[{p:[22,5,704],t:7,e:"ui-section",a:{label:"State"},f:[{p:[23,6,737],t:7,e:"span",a:{"class":[{t:2,r:"data.patient.statstate",p:[23,19,750]}]},f:[{t:2,r:"data.patient.stat",p:[23,47,778]}]}]}," ",{p:[25,5,831],t:7,e:"ui-section",a:{label:"Blood Type"},f:[{p:[26,6,869],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.patient.blood_type",p:[26,28,891]}]}]}," ",{p:[28,5,950],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,6,984],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.patient.minHealth",p:[29,19,997]}],max:[{t:2,r:"data.patient.maxHealth",p:[29,52,1030]}],value:[{t:2,r:"data.patient.health",p:[29,87,1065]}],state:[{t:2,x:{r:["data.patient.health"],s:'_0>=0?"good":"average"'},p:[30,13,1103]}]},f:[{t:2,x:{r:["adata.patient.health"],s:"Math.round(_0)"},p:[30,64,1154]}]}]}," ",{t:4,f:[{p:[33,6,1389],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[33,25,1408]}]},f:[{p:[34,7,1427],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.patient.maxHealth",p:[34,28,1448]}],value:[{t:2,rx:{r:"data.patient",m:[{t:30,n:"type"}]},p:[34,63,1483]}],state:"bad"},f:[{t:2,x:{r:["type","adata.patient"],s:"Math.round(_1[_0])"},p:[34,99,1519]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}]'},p:[32,5,1224]}],n:50,r:"data.patient",p:[21,4,678]},{t:4,n:51,f:["No patient detected."],r:"data.patient"}]}," ",{p:[41,3,1670],t:7,e:"ui-display",a:{title:"Initiated Procedures"},f:[{t:4,f:[{t:4,f:[{p:[44,6,1777],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[44,28,1799]}]},f:[{p:[45,7,1817],t:7,e:"ui-section",a:{label:"Next Step"},f:[{p:[46,8,1856],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"next_step",p:[46,30,1878]}]}," ",{t:4,f:[{p:[48,9,1937],t:7,e:"span",a:{"class":"content"},f:[{p:[48,31,1959],t:7,e:"b",f:["Required chemicals:"]},{p:[48,57,1985],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[48,62,1990]}]}],n:50,r:"chems_needed",p:[47,8,1907]}]}," ",{t:4,f:[{p:[52,8,2091],t:7,e:"ui-section",a:{label:"Alternative Step"},f:[{p:[53,9,2138],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"alternative_step",p:[53,31,2160]}]}," ",{t:4,f:[{p:[55,10,2232],t:7,e:"span",a:{"class":"content"},f:[{p:[55,32,2254],t:7,e:"b",f:["Required chemicals:"]},{p:[55,58,2280],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[55,63,2285]}]}],n:50,r:"alt_chems_needed",p:[54,9,2197]}]}],n:50,r:"alternative_step",p:[51,7,2058]}]}],n:52,r:"data.procedures",p:[43,5,1745]}],n:50,r:"data.procedures",p:[42,4,1716]},{t:4,n:51,f:["No active procedures."],r:"data.procedures"}]}]}],x:{r:["data.menu"],s:"_0==2"}}]},e.exports=a.extend(r.exports)},{341:341}],434:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed points: ",{t:2,r:"data.unclaimedPoints",p:[6,29,159]}," ",{t:4,f:[{p:[8,4,220],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim Points"]}],n:50,r:"data.unclaimedPoints",p:[7,3,187]}]}," ",{p:[13,2,311],t:7,e:"ui-section",f:[{t:4,f:[{p:[15,4,350],t:7,e:"ui-button",a:{action:"Eject"},f:["Eject ID"]}," You have ",{t:2,r:"data.claimedPoints",p:[18,13,421]}," mining points collected."],n:50,r:"data.hasID",p:[14,3,327]},{t:4,n:51,f:[{p:[20,4,485],t:7,e:"ui-button",a:{action:"Insert"},f:["Insert ID"]}],r:"data.hasID"}]}]}," ",{p:[26,1,588],t:7,e:"ui-display",f:[{t:4,f:[{p:[28,3,627],t:7,e:"ui-section",f:[{p:[29,4,644],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[34,4,772],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[35,5,808],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[35,42,845]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[35,129,932]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[38,10,988]},": ",{t:2,r:"name",p:[38,21,999]}]}],n:52,r:"data.diskDesigns",p:[33,3,741]}],n:50,r:"data.hasDisk",p:[27,2,603]},{t:4,n:51,f:[{p:[42,3,1053],t:7,e:"ui-section",f:[{p:[43,4,1070],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{t:4,f:[{p:[50,2,1223],t:7,e:"ui-display",f:[{p:[51,3,1239],t:7,e:"ui-section",f:[{p:[52,4,1256],t:7,e:"b",f:["Warning"]},": ",{t:2,r:"data.disconnected",p:[52,20,1272]},". Please contact the quartermaster."]}]}],n:50,r:"data.disconnected",p:[49,1,1195]},{t:4,f:[{p:[57,2,1412],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[58,3,1445],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[59,5,1480],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[62,5,1538],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[65,5,1595],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[67,5,1639],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[69,5,1683],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[74,4,1785],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[75,5,1820],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[76,6,1849]}]}," ",{p:[78,5,1879],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[79,6,1922]}]}," ",{p:[81,5,1954],t:7,e:"section",a:{"class":"cell"},f:[{p:[82,6,1983],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[82,19,1996]}],placeholder:"###","class":"number"}}]}," ",{p:[84,5,2063],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[85,6,2106],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[85,60,2160]}],params:['{ "id" : ',{t:2,r:"id",p:[85,115,2215]},', "sheets" : ',{t:2,r:"sheets",p:[85,134,2234]}," }"]},f:["Release"]}]}," ",{p:[89,5,2305],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[90,6,2348]}]}]}],n:52,r:"data.materials",p:[73,3,1756]}," ",{t:4,f:[{p:[95,4,2431],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[96,5,2466],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[97,6,2495]}]}," ",{p:[99,5,2525],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[100,6,2568]}]}," ",{p:[102,5,2600],t:7,e:"section",a:{"class":"cell"},f:[{p:[103,6,2629],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[103,19,2642]}],placeholder:"###","class":"number"}}]}," ",{p:[105,5,2709],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[106,6,2752],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[106,58,2804]}],params:['{ "id" : ',{t:2,r:"id",p:[106,114,2860]},', "sheets" : ',{t:2,r:"sheets",p:[106,133,2879]}," }"]},f:["Smelt"]}]}," ",{p:[110,5,2947],t:7,e:"section",a:{"class":"cell",align:"right"},f:[]}]}],n:52,r:"data.alloys",p:[94,3,2405]}]}],n:50,x:{r:["data.materials","data.alloys"],s:"_0||_1"},p:[56,1,1372]}]},e.exports=a.extend(r.exports)},{341:341}],435:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,4,87],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"], +s:'_0?null:"disabled"'},p:[4,36,119]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[7,4,231],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[7,35,262]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[10,4,358],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[10,35,389]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[15,4,528],t:7,e:"ui-section",f:[{t:4,f:[{p:[17,6,578],t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[16,5,546]},{t:4,n:51,f:[{p:[19,6,644],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[21,8,712],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[21,38,742]}]}," ",{p:[22,8,782],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[22,39,813]}]}],n:50,r:"data.has_blood",p:[20,7,681]},{t:4,n:51,f:[{p:[24,8,870],t:7,e:"ui-section",f:[{p:[25,9,892],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[14,3,500]},{t:4,n:51,f:[{p:[32,4,1054],t:7,e:"ui-section",f:[{p:[33,5,1072],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[38,3,1188],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[43,8,1343],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[43,64,1399]}],params:['{"index": ',{t:2,r:"index",p:[43,116,1451]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[42,7,1320]}," ",{p:[47,7,1538],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[47,69,1600]}],params:['{"index": ',{t:2,r:"index",p:[47,124,1655]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,24,1269]}],button:0},f:[" ",{p:[51,6,1749],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[51,40,1783]}]}," ",{p:[52,6,1812],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[52,38,1844]}]}," ",{p:[53,6,1879],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[53,33,1906]}]}," ",{p:[54,6,1936],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[54,40,1970]}]}," ",{t:4,f:[{p:[56,7,2021],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[58,9,2087],t:7,e:"ui-button",a:{action:"symptom_details",state:"",params:['{"picked_symptom": ',{t:2,r:"sym_index",p:[58,81,2159]},', "index": ',{t:2,r:"index",p:[58,105,2183]},"}"]},f:[{t:2,r:"name",p:[59,10,2206]}," "]},{p:[60,21,2236],t:7,e:"br"}],n:52,r:"symptoms",p:[57,8,2059]}]}," ",{p:[63,7,2289],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[63,38,2320]}]}," ",{p:[64,7,2355],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[64,35,2383]}]}," ",{p:[65,7,2415],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[65,39,2447]}]}," ",{p:[66,7,2483],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[66,44,2520]}]}],n:50,r:"is_adv",p:[55,6,1999]}]}],n:52,r:"data.viruses",p:[39,4,1222]},{t:4,n:51,f:[{p:[70,5,2601],t:7,e:"ui-section",f:[{p:[71,6,2620],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[75,3,2743],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[77,5,2811],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[77,24,2830]}]},f:[{p:[78,7,2848],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[78,43,2884]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[78,129,2970]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[76,4,2779]},{t:4,n:51,f:[{p:[83,5,3067],t:7,e:"ui-section",f:[{p:[84,6,3086],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[37,2,1162]}],n:50,x:{r:["data.mode"],s:"_0==1"},p:[1,1,0]},{t:4,n:51,f:[{p:[90,2,3231],t:7,e:"ui-button",a:{icon:"undo",state:"",action:"back"},f:["Back"]}," ",{t:4,f:[{p:[94,4,3330],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[94,23,3349]}]},f:[{p:[95,4,3364],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[96,5,3382]}," ",{t:4,f:[{p:[98,5,3417],t:7,e:"br"}," ",{p:[99,5,3428],t:7,e:"b",f:["This symptom has been neutered, and has no effect. It will still affect the virus' statistics."]}],n:50,r:"neutered",p:[97,4,3395]}]}," ",{p:[102,4,3564],t:7,e:"ui-section",f:[{p:[103,5,3582],t:7,e:"ui-section",a:{label:"Level"},f:[{t:2,r:"level",p:[103,31,3608]}]}," ",{p:[104,5,3636],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[104,36,3667]}]}," ",{p:[105,5,3700],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[105,33,3728]}]}," ",{p:[106,5,3758],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[106,37,3790]}]}," ",{p:[107,5,3824],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[107,42,3861]}]}]}," ",{p:[109,4,3913],t:7,e:"ui-subdisplay",a:{title:"Effect Thresholds"},f:[{p:[110,5,3960],t:7,e:"ui-section",f:[{t:3,r:"threshold_desc",p:[110,17,3972]}]}]}]}],n:53,r:"data.symptom",p:[93,2,3303]}],x:{r:["data.mode"],s:"_0==1"}}]},e.exports=a.extend(r.exports)},{341:341}],436:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(484);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{341:341,484:484}],437:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{341:341}],438:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[3,1,69],t:7,e:"ui-notice",f:[{p:[4,3,84],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[4,23,104]}," connected to a tank."]}]}," ",{p:[6,1,182],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[7,3,220],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[8,5,255],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[8,11,261]}," kPa"]}]}," ",{p:[10,3,323],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[11,5,354],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[11,18,367]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[11,59,408]}]}]}]}," ",{p:[14,1,499],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[15,3,530],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,579]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[17,14,630]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,687]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[24,7,856],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[24,38,887]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[23,5,828]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[28,3,1007],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[29,4,1038]}]}," ",{p:[31,3,1080],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[32,4,1114]}," kPa"]}],n:50,r:"data.holding",p:[27,3,983]},{t:4,n:51,f:[{p:[35,3,1188],t:7,e:"ui-section",f:[{p:[36,4,1205],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}," ",{p:[40,1,1293],t:7,e:"ui-display",a:{title:"Filters"},f:[{t:4,f:[{p:[42,5,1345],t:7,e:"filters"}],n:53,r:"data",p:[41,3,1325]}]}]},r.exports.components=r.exports.components||{};var i={filters:t(457)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,457:457}],439:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}]}]}," ",{p:[52,5,1464],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1499],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1505]}]}]}],r:"config.fancy"}]}," ",{p:[57,1,1574],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1604],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1629],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1666],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1705],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1742],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1781],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1823],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1864],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1949],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1968]}],nowrap:0},f:[{p:[69,7,1993],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2014]}," %"]}," ",{p:[70,7,2072],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[70,28,2093]}]}," ",{p:[71,7,2135],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2156],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2169]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2198]}]}]}," ",{p:[72,7,2245],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2266],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2279]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2302]}," [",{p:[72,87,2325],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2331]}]},"]"]}]}," ",{p:[73,7,2380],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2401],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2414]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2437]}," [",{p:[73,87,2460],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2466]}]},"]"]}]}," ",{p:[74,7,2515],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2536],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2549]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2572]}," [",{p:[74,87,2595],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2601]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1923]}]}]},e.exports=a.extend(r.exports)},{341:341}],440:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=a.extend(r.exports)},{341:341}],441:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," "," "," "," "," "," ",{p:[11,1,560],t:7,e:"rdheader"}," ",{t:4,f:[{p:[13,2,595],t:7,e:"ui-display",a:{title:"CONSOLE LOCKED"},f:[{p:[14,3,634],t:7,e:"ui-button",a:{action:"Unlock"},f:["Unlock"]}]}],n:50,r:"data.locked",p:[12,1,573]},{t:4,f:[{p:[18,2,729],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[18,17,744]}]},f:[{p:[19,3,763],t:7,e:"tab",a:{name:"Technology"},f:[{p:[20,4,791],t:7,e:"techweb"}]}," ",{p:[22,3,815],t:7,e:"tab",a:{name:"View Node"},f:[{p:[23,4,842],t:7,e:"nodeview"}]}," ",{p:[25,3,867],t:7,e:"tab",a:{name:"View Design"},f:[{p:[26,4,896],t:7,e:"designview"}]}," ",{p:[28,3,923],t:7,e:"tab",a:{name:"Disk Operations - Design"},f:[{p:[29,4,965],t:7,e:"diskopsdesign"}]}," ",{p:[31,3,995],t:7,e:"tab",a:{name:"Disk Operations - Technology"},f:[{p:[32,4,1041],t:7,e:"diskopstech"}]}," ",{p:[34,3,1069],t:7,e:"tab",a:{name:"Deconstructive Analyzer"},f:[{p:[35,4,1110],t:7,e:"destruct"}]}," ",{p:[37,3,1135],t:7,e:"tab",a:{name:"Protolathe"},f:[{p:[38,4,1163],t:7,e:"protolathe"}]}," ",{p:[40,3,1190],t:7,e:"tab",a:{name:"Circuit Imprinter"},f:[{p:[41,4,1225],t:7,e:"circuit"}]}," ",{p:[43,3,1249],t:7,e:"tab",a:{name:"Settings"},f:[{p:[44,4,1275],t:7,e:"settings"}]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[17,1,706]}]},r.exports.components=r.exports.components||{};var i={settings:t(450),circuit:t(442),protolathe:t(448),destruct:t(444),diskopsdesign:t(445),diskopstech:t(446),designview:t(443),nodeview:t(447),techweb:t(451),rdheader:t(449)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451}],442:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,58],t:7,e:"ui-display",a:{title:"Circuit Imprinter Busy!"}}],n:50,r:"data.circuitbusy",p:[2,2,30]},{t:4,n:51,f:[{p:[5,3,130],t:7,e:"ui-display",f:[{p:[6,4,147],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,189],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,202]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,261],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "circuit", "inputText" : ',{t:2,r:"textsearch",p:[8,84,340]},"}"]},f:["Search"]}]}," ",{p:[10,4,398],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.circuitmats",p:[10,27,421]}," / ",{t:2,r:"data.circuitmaxmats",p:[10,50,444]}]}," ",{p:[11,4,485],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.circuitchems",p:[11,26,507]}," / ",{t:2,r:"data.circuitmaxchems",p:[11,50,531]}]}," ",{p:[12,3,572],t:7,e:"ui-display",f:[{p:[14,3,590],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,605]}]},f:[{p:[15,4,631],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,696],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.circuitcat"],s:'_0=="{{name}}"?"selected":null'},p:[17,43,733]}],params:['{"type" : "circuit", "cat" : "',{t:2,r:"name",p:[17,135,825]},'"}']},f:[{t:2,r:"name",p:[17,147,837]}]}],n:52,r:"data.circuitcats",p:[16,5,663]}]}," ",{p:[20,4,888],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,956],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,968]},{t:2,r:"matstring",p:[22,26,976]}," ",{p:[23,7,997],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[23,40,1030]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[23,119,1109]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitdes",p:[21,5,924]}]}," ",{p:[27,4,1187],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[29,6,1254],t:7,e:"ui-section",f:[{t:2,r:"name",p:[29,18,1266]},{t:2,r:"matstring",p:[29,26,1274]}," ",{p:[30,7,1295],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[30,40,1328]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[30,119,1407]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitmatch",p:[28,5,1220]}]}," ",{p:[34,4,1485],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[36,6,1550],t:7,e:"ui-section",f:[{t:2,r:"name",p:[36,18,1562]}," : ",{t:2,r:"amount",p:[36,29,1573]}," cm3 - ",{t:4,f:[{p:[38,7,1623],t:7,e:"input",a:{value:[{t:2,r:"number",p:[38,20,1636]}],placeholder:["1-",{t:2,r:"sheets",p:[38,46,1662]}],"class":"number"}}," ",{p:[39,7,1698],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "circuit", "mat_id" : ',{t:2,r:"mat_id",p:[39,84,1775]},', "sheets" : ',{t:2,r:"number",p:[39,107,1798]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[37,6,1597]}]}],n:52,r:"data.circuitmat_list",p:[35,5,1513]}]}," ",{p:[44,4,1895],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[46,6,1961],t:7,e:"ui-section",f:[{t:2,r:"name",p:[46,18,1973]}," : ",{t:2,r:"amount",p:[46,29,1984]}," - ",{p:[47,7,2005],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "circuit", "name" : ',{t:2,r:"name",p:[47,80,2078]},', "id" : ',{t:2,r:"reagentid",p:[47,97,2095]},"}"]},f:["Purge"]}]}],n:52,r:"data.circuitchem_list",p:[45,5,1923]}]}]}]}]}],r:"data.circuitbusy"}],n:50,r:"data.circuit_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[55,2,2216],t:7,e:"ui-display",a:{title:"No Linked Circuit Imprinter"}}],r:"data.circuit_linked"}]},e.exports=a.extend(r.exports)},{341:341}],443:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:[{t:2,r:"data.sdesign_name",p:[2,21,50]}]},f:[{p:[3,3,77],t:7,e:"ui-section",a:{title:"Description"},f:[{t:2,r:"data.sdesign_desc",p:[3,35,109]}]}]}," ",{p:[5,2,162],t:7,e:"ui-display",a:{title:"Lathe Types"},f:[{t:4,f:[{p:[7,4,239],t:7,e:"ui-section",a:{title:"Circuit Imprinter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&1"},p:[6,3,198]}," ",{t:4,f:[{p:[10,4,346],t:7,e:"ui-section",a:{title:"Protolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&2"},p:[9,3,305]}," ",{t:4,f:[{p:[13,4,446],t:7,e:"ui-section",a:{title:"Autolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&4"},p:[12,3,405]}," ",{t:4,f:[{p:[16,4,545],t:7,e:"ui-section",a:{title:"Crafting Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&8"},p:[15,3,504]}," ",{t:4,f:[{p:[19,4,655],t:7,e:"ui-section",a:{title:"Exosuit Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&16"},p:[18,3,613]}," ",{t:4,f:[{p:[22,4,764],t:7,e:"ui-section",a:{title:"Biogenerator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&32"},p:[21,3,722]}," ",{t:4,f:[{p:[25,4,867],t:7,e:"ui-section",a:{title:"Limb Grower"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&64"},p:[24,3,825]}," ",{t:4,f:[{p:[28,4,970],t:7,e:"ui-section",a:{title:"Ore Smelter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&128"},p:[27,3,927]}]}," ",{p:[31,2,1045],t:7,e:"ui-display",a:{title:"Materials"},f:[{t:4,f:[{p:[33,4,1116],t:7,e:"ui-section",a:{title:[{t:2,r:"matname",p:[33,23,1135]}]},f:[{t:2,r:"matamt",p:[33,36,1148]}," cm^3"]}],n:52,r:"data.sdesign_materials",p:[32,3,1079]}]}],n:50,r:"data.design_selected",p:[1,1,0]},{t:4,f:[{p:[38,2,1248],t:7,e:"ui-display",a:{title:"No Design Selected."}}],n:50,x:{r:["data.design_selected"],s:"!_0"},p:[37,1,1216]}]},e.exports=a.extend(r.exports)},{341:341}],444:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[4,3,60],t:7,e:"ui-display",a:{title:"Destructive Analyzer Busy!"}}],n:50,r:"data.destroybusy",p:[3,2,32]},{t:4,n:51,f:[{t:4,f:[{p:[7,4,168],t:7,e:"ui-display",a:{title:"Destructive Analyzer Unloaded"}}],n:50,x:{r:["data.destroy_loaded"],s:"!_0"},p:[6,3,135]},{t:4,n:51,f:[{p:[9,4,248],t:7,e:"ui-display",a:{title:"Loaded Item"},f:[{p:[10,4,285],t:7,e:"ui-section",a:{title:"Name"},f:[{t:2,r:"data.destroy_name",p:[10,29,310]}]}]}," ",{p:[12,4,367],t:7,e:"ui-display",a:{title:"Boost Nodes"},f:[{t:4,f:[{p:[14,6,438],t:7,e:"ui-section",a:{title:[{t:2,r:"name",p:[14,25,457]}," | ",{t:2,r:"value",p:[14,36,468]}]},f:[{p:[15,7,487],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["allow"],s:'_0?null:"disabled"'},p:[15,25,505]}],action:"deconstruct",params:['{"id":',{t:2,r:"id",p:[15,90,570]},"}"]},f:["Deconstruct and Boost"]}]}],n:52,r:"data.boost_paths",p:[13,5,405]}]}," ",{p:[19,4,670],t:7,e:"ui-button",a:{action:"eject_da"},f:["Eject Item"]}],x:{r:["data.destroy_loaded"],s:"!_0"}}],r:"data.destroybusy" +}],n:50,r:"data.destroy_linked",p:[2,1,2]},{t:4,n:51,f:[{p:[23,2,755],t:7,e:"ui-display",a:{title:"No Linked Destructive Analyzer"}}],r:"data.destroy_linked"}]},e.exports=a.extend(r.exports)},{341:341}],445:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Design Disk Loaded"}}],n:50,x:{r:["data.ddisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,121],t:7,e:"ui-display",a:{title:"Design Disk Updating"}}],n:50,r:"data.ddisk_update",p:[5,2,92]},{t:4,n:51,f:[{t:4,f:[{p:[9,4,221],t:7,e:"ui-display",a:{title:"Design Disk"},f:[{p:[10,5,259],t:7,e:"ui-section",a:{title:"Disk Space"},f:["Disk Capacity: ",{t:2,r:"data.ddisk_size",p:[10,51,305]}," blueprints."]}," ",{p:[11,5,355],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[11,33,383],t:7,e:"ui-button",a:{action:"ddisk_upall"},f:["Upload all designs"]}]}," ",{p:[12,5,464],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[12,36,495],t:7,e:"ui-button",a:{action:"clear_designdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[13,5,591],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[13,36,622],t:7,e:"ui-button",a:{action:"eject_designdisk"},f:["Eject Disk"]}]}]}," ",{p:[15,4,717],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[17,6,792],t:7,e:"ui-section",a:{title:"Number"},f:["#",{t:2,r:"pos",p:[17,34,820]},": ",{t:4,f:[{p:[19,8,866],t:7,e:"ui-button",a:{action:"upload_empty_ddisk_slot",params:['{"slot": "',{t:2,r:"pos",p:[19,70,928]},'"}']},f:["Upload to Empty Slot"]}],n:50,x:{r:["id"],s:'_0=="null"'},p:[18,7,837]},{t:4,n:51,f:[{p:[21,8,996],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[21,58,1046]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[21,75,1063]}]},f:[{t:2,r:"name",p:[21,122,1110]}]}," ",{p:[22,8,1139],t:7,e:"ui-button",a:{action:"ddisk_erasepos",style:"danger",params:['{"id": "',{t:2,r:"id",p:[22,74,1205]},'"}'],state:[{t:2,x:{r:["id"],s:'_0=="null"?"disabled":null'},p:[22,91,1222]}]},f:["Delete Slot"]}],x:{r:["id"],s:'_0=="null"'}}]}],n:52,r:"data.ddisk_designs",p:[16,5,757]}]}],n:50,x:{r:["data.ddisk_upload"],s:"!_0"},p:[8,3,190]},{t:4,n:51,f:[{p:[28,4,1367],t:7,e:"ui-display",a:{title:"Upload Design to Disk"},f:[{p:[28,46,1409],t:7,e:"ui-section",f:["Available Designs:"]}]}," ",{t:4,f:[{p:[30,5,1513],t:7,e:"ui-section",f:[{p:[30,17,1525],t:7,e:"ui-button",a:{action:"ddisk_uploaddesign",params:['{"id": "',{t:2,r:"id",p:[30,72,1580]},'"}']},f:[{t:2,r:"name",p:[30,82,1590]}]}]}],n:52,r:"data.ddisk_possible_designs",p:[29,4,1470]}],x:{r:["data.ddisk_upload"],s:"!_0"}}],r:"data.ddisk_update"}],x:{r:["data.ddisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],446:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Technology Disk Loaded"}}],n:50,x:{r:["data.tdisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,125],t:7,e:"ui-display",a:{title:"Technology Disk Updating"}}],n:50,r:"data.tdisk_update",p:[5,2,96]},{t:4,n:51,f:[{p:[8,3,198],t:7,e:"ui-display",a:{title:"Technology Disk"},f:[{p:[9,4,239],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[9,32,267],t:7,e:"ui-button",a:{action:"tdisk_down"},f:["Download Research to Disk"]},{p:[9,100,335],t:7,e:"ui-button",a:{action:"tdisk_up"},f:["Upload Research from Disk"]}," ",{p:[10,4,406],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[10,35,437],t:7,e:"ui-button",a:{action:"clear_techdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[11,4,530],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[11,35,561],t:7,e:"ui-button",a:{action:"eject_techdisk"},f:["Eject Disk"]}]}]}]}," ",{p:[13,3,652],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[15,5,723],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,53,771]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,70,788]}]},f:[{t:2,r:"display_name",p:[15,115,833]}]}],n:52,r:"data.tdisk_nodes",p:[14,4,691]}]}],r:"data.tdisk_update"}],x:{r:["data.tdisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],447:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,29],t:7,e:"ui-display",a:{title:[{t:2,r:"data.snode_name",p:[2,21,48]}]},f:[{p:[3,3,73],t:7,e:"ui-section",a:{title:"Description"},f:["Description: ",{t:2,r:"data.snode_desc",p:[3,48,118]}]}," ",{p:[4,3,154],t:7,e:"ui-section",a:{title:"Point Cost"},f:["Point Cost: ",{t:2,r:"data.snode_cost",p:[4,46,197]}]}," ",{p:[5,3,233],t:7,e:"ui-section",a:{title:"Export Price"},f:["Export Price: ",{t:2,r:"data.snode_export",p:[5,50,280]}]}," ",{p:[6,3,318],t:7,e:"ui-button",a:{action:"research_node",params:['{"id"="',{t:2,r:"id",p:[6,52,367]},'"}'],state:[{t:2,x:{r:["data.snode_researched"],s:'_0?"disabled":null'},p:[6,69,384]}]},f:[{t:2,x:{r:["data.snode_researched"],s:'_0?"Researched":"Research Node"'},p:[6,115,430]}]}]}," ",{p:[8,2,518],t:7,e:"ui-display",a:{title:"Prerequisites"},f:[{t:4,f:[{p:[10,4,588],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[10,52,636]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[10,69,653]}]},f:[{t:2,r:"display_name",p:[10,114,698]}]}],n:52,r:"data.node_prereqs",p:[9,3,556]}]}," ",{p:[13,2,759],t:7,e:"ui-display",a:{title:"Unlocks"},f:[{t:4,f:[{p:[15,4,823],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,52,871]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,69,888]}]},f:[{t:2,r:"display_name",p:[15,114,933]}]}],n:52,r:"data.node_unlocks",p:[14,3,791]}]}," ",{p:[18,2,994],t:7,e:"ui-display",a:{title:"Designs"},f:[{t:4,f:[{p:[20,4,1058],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[20,54,1108]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[20,71,1125]}]},f:[{t:2,r:"name",p:[20,118,1172]}]}],n:52,r:"data.node_designs",p:[19,3,1026]}]}],n:50,r:"data.node_selected",p:[1,1,0]},{t:4,f:[{p:[25,2,1263],t:7,e:"ui-display",a:{title:"No Node Selected."}}],n:50,x:{r:["data.node_selected"],s:"!_0"},p:[24,1,1233]}]},e.exports=a.extend(r.exports)},{341:341}],448:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,59],t:7,e:"ui-display",a:{title:"Protolathe Busy!"}}],n:50,r:"data.protobusy",p:[2,2,33]},{t:4,n:51,f:[{p:[5,3,124],t:7,e:"ui-display",f:[{p:[6,4,141],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,183],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,196]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,255],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "proto", "inputText" : ',{t:2,r:"textsearch",p:[8,82,332]},"}"]},f:["Search"]}]}," ",{p:[10,4,390],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.protomats",p:[10,27,413]}," / ",{t:2,r:"data.protomaxmats",p:[10,48,434]}]}," ",{p:[11,4,473],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.protochems",p:[11,26,495]}," / ",{t:2,r:"data.protomaxchems",p:[11,48,517]}]}," ",{p:[12,3,556],t:7,e:"ui-display",f:[{p:[14,3,574],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,589]}]},f:[{p:[15,4,615],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,678],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.protocat","name"],s:'_0==_1?"selected":null'},p:[17,43,715]}],params:['{"type" : "proto", "cat" : "',{t:2,r:"name",p:[17,125,797]},'"}']},f:[{t:2,r:"name",p:[17,137,809]}]}],n:52,r:"data.protocats",p:[16,5,647]}]}," ",{p:[20,4,860],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,926],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,938]},{t:2,r:"matstring",p:[22,26,946]}," ",{t:4,f:[{p:[24,8,996],t:7,e:"input",a:{value:[{t:2,r:"number",p:[24,21,1009]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[24,47,1035]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[23,7,967]}," ",{p:[26,7,1108],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[26,40,1141]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[26,117,1218]},'", "amount" : "',{t:2,r:"number",p:[26,138,1239]},'"}']},f:["Print"]}]}],n:52,r:"data.protodes",p:[21,5,896]}]}," ",{p:[30,4,1321],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[32,6,1386],t:7,e:"ui-section",f:[{t:2,r:"name",p:[32,18,1398]},{t:2,r:"matstring",p:[32,26,1406]}," ",{t:4,f:[{p:[34,8,1456],t:7,e:"input",a:{value:[{t:2,r:"number",p:[34,21,1469]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[34,47,1495]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[33,7,1427]}," ",{p:[36,7,1568],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[36,40,1601]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[36,117,1678]},'", "amount" : "',{t:2,r:"number",p:[36,138,1699]},'"}']},f:["Print"]}]}],n:52,r:"data.protomatch",p:[31,5,1354]}]}," ",{p:[40,4,1781],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[42,6,1844],t:7,e:"ui-section",f:[{t:2,r:"name",p:[42,18,1856]}," : ",{t:2,r:"amount",p:[42,29,1867]}," cm3 - ",{t:4,f:[{p:[44,7,1917],t:7,e:"input",a:{value:[{t:2,r:"number",p:[44,20,1930]}],placeholder:["1-",{t:2,r:"sheets",p:[44,46,1956]}],"class":"number"}}," ",{p:[45,7,1992],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "proto", "mat_id" : ',{t:2,r:"mat_id",p:[45,82,2067]},', "sheets" : ',{t:2,r:"number",p:[45,105,2090]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[43,6,1891]}]}],n:52,r:"data.protomat_list",p:[41,5,1809]}]}," ",{p:[50,4,2187],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[52,6,2251],t:7,e:"ui-section",f:[{t:2,r:"name",p:[52,18,2263]}," : ",{t:2,r:"amount",p:[52,29,2274]}," - ",{p:[53,7,2295],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "proto", "name" : ',{t:2,r:"name",p:[53,78,2366]},', "id" : ',{t:2,r:"reagentid",p:[53,95,2383]},"}"]},f:["Purge"]}]}],n:52,r:"data.protochem_list",p:[51,5,2215]}]}]}]}]}],r:"data.protobusy"}],n:50,r:"data.protolathe_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[61,2,2504],t:7,e:"ui-display",a:{title:"No Linked Protolathe"}}],r:"data.protolathe_linked"}]},e.exports=a.extend(r.exports)},{341:341}],449:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,1,14],t:7,e:"span",a:{"class":"memoedit"},f:["Nanotrasen R&D Console"]},{p:[2,53,66],t:7,e:"br"}," Available Points: ",{p:[3,19,91],t:7,e:"ui-section",a:{title:"Research Points"},f:[{t:2,r:"data.research_points_stored",p:[3,55,127]}]}," ",{p:[4,1,173],t:7,e:"ui-section",a:{title:["Page Selection - ",{t:2,r:"page",p:[4,37,209]}]},f:[{p:[4,47,219],t:7,e:"input",a:{value:[{t:2,r:"pageselect",p:[4,60,232]}],placeholder:"1","class":"number"}}," Select Page: ",{p:[5,14,294],t:7,e:"ui-button",a:{action:"page",params:['{"num" : "',{t:2,r:"pageselect",p:[5,57,337]},'"}']},f:["[Go]"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],450:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"span",a:{"class":"bad"},f:["Settings"]},{p:[1,34,33],t:7,e:"br"},{p:[1,39,38],t:7,e:"br"}," ",{p:[2,1,45],t:7,e:"ui-button",a:{action:"Resync"},f:["RESYNC MACHINERY"]},{p:[2,56,100],t:7,e:"br"}," ",{p:[3,1,107],t:7,e:"ui-button",a:{action:"Lock"},f:["LOCK"]}," ",{p:[4,1,150],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "destroy"}',state:[{t:2,x:{r:["data.destroy_linked"],s:'_0?null:"disabled"'},p:[4,71,220]}]},f:["Disconnect Destructive Analyzer"]}," ",{p:[5,1,309],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "lathe"}',state:[{t:2,x:{r:["data.protolathe_linked"],s:'_0?null:"disabled"'},p:[5,69,377]}]},f:["Disconnect Protolathe"]}," ",{p:[6,1,459],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "imprinter"}',state:[{t:2,x:{r:["data.circuit_linked"],s:'_0?null:"disabled"'},p:[6,73,531]}]},f:["Disconnect Circuit Imprinter"]}]},e.exports=a.extend(r.exports)},{341:341}],451:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Available for Research"},f:[{t:4,f:[{p:[3,3,78],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[3,51,126]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[3,68,143]}]},f:[{t:2,r:"display_name",p:[3,113,188]}]}],n:52,r:"data.techweb_avail",p:[2,2,46]}]}," ",{p:[6,1,245],t:7,e:"ui-display",a:{title:"Locked Nodes"},f:[{t:4,f:[{p:[8,3,314],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[8,51,362]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[8,68,379]}]},f:[{t:2,r:"display_name",p:[8,113,424]}]}],n:52,r:"data.techweb_locked",p:[7,2,281]}]}," ",{p:[11,1,482],t:7,e:"ui-display",a:{title:"Researched Nodes"},f:[{t:4,f:[{p:[13,3,559],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[13,51,607]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[13,68,624]}]},f:[{t:2,r:"display_name",p:[13,113,669]}]}],n:52,r:"data.techweb_researched",p:[12,2,522]}]}]},e.exports=a.extend(r.exports)},{341:341}],452:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,25],t:7,e:"ui-notice",f:[{p:[3,3,40],t:7,e:"span",f:["The grinder is currently processing and cannot be used."]}]}],n:50,r:"data.processing",p:[1,1,0]},{p:{button:[{p:[8,5,208],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[8,36,239]}],action:"eject"},f:["Eject Contents"]}]},t:7,e:"ui-display",a:{title:"Processing Chamber",button:0},f:[" ",{p:[10,3,364],t:7,e:"ui-section",a:{label:"Grinding"},f:[{p:[11,5,399],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.operating"],s:'_0?"average":"good"'},p:[11,18,412]}]},f:[{t:2,x:{r:["data.operating"],s:'_0?"Busy":"Ready"'},p:[11,59,453]}]}," ",{p:[12,2,500],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[12,35,533]}],action:"grind"},f:["Activate"]}]}," ",{p:[14,3,653],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[17,9,755],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["The ",{t:2,r:"name",p:[17,56,802]}]},{p:[17,71,817],t:7,e:"br"}],n:52,r:"adata.contentslist",p:[16,7,717]},{t:4,n:51,f:[{p:[19,9,848],t:7,e:"span",f:["No Contents"]}],r:"adata.contentslist"}],n:50,r:"data.contents",p:[15,5,688]},{t:4,n:51,f:[{p:[22,7,911],t:7,e:"span",f:["No Contents"]}],r:"data.contents"}]}]}," ",{p:{button:[{p:[28,5,1047],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.isBeakerLoaded"],s:'(_0==0)&&_1?null:"disabled"'},p:[28,36,1078]}],action:"detach"},f:["Detach"]}]},t:7,e:"ui-display",a:{title:"Container",button:0},f:[" ",{p:[30,3,1202],t:7,e:"ui-section",a:{label:"Reagents"},f:[{t:4,f:[{p:[32,7,1272],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[32,13,1278]},"/",{t:2,r:"data.beakerMaxVolume",p:[32,55,1320]}," Units"]}," ",{p:[33,7,1365],t:7,e:"br"}," ",{t:4,f:[{p:[35,9,1418],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[35,52,1461]}," units of ",{t:2,r:"name",p:[35,87,1496]}]},{p:[35,102,1511],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[34,7,1378]},{t:4,n:51,f:[{p:[37,9,1542],t:7,e:"span",a:{"class":"bad"},f:["Container Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[31,5,1237]},{t:4,n:51,f:[{p:[40,7,1621],t:7,e:"span",a:{"class":"average"},f:["No Container"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],453:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"span",a:{"class":["pipes32x32 ",{t:2,r:"dir",p:[6,80,253]},"-",{t:2,r:"icon_state",p:[6,88,261]}],title:[{t:2,r:"dir_name",p:[6,111,284]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}," ",{t:4,f:[{p:[12,2,406],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[14,4,468],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["@key","data.selected_color"],s:'_0==_1?"selected":null'},p:[14,22,486]}],action:"color",params:['{"paint_color": ',{t:2,r:"@key",p:[15,44,583]},"}"]},f:[{t:2,r:"@key",p:[15,55,594]}]}],n:52,r:"data.paint_colors",p:[13,3,436]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[11,1,377]},{p:[19,1,654],t:7,e:"ui-display",a:{title:"Utilities"},f:[{p:[20,2,687],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&1?"check-square-o":"square-o"'},p:[20,19,704]}],action:"mode",params:'{"mode": 1}'},f:["Build"]}," ",{p:[22,2,813],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&2?"check-square-o":"square-o"'},p:[22,19,830]}],action:"mode",params:'{"mode": 2}'},f:["Wrench"]}," ",{p:[24,2,940],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&4?"check-square-o":"square-o"'},p:[24,19,957]}],action:"mode",params:'{"mode": 4}'},f:["Destroy"]}," ",{t:4,f:[{p:[27,3,1098],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&8?"check-square-o":"square-o"'},p:[27,20,1115]}],action:"mode",params:'{"mode": 8}'},f:["Paint"]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[26,2,1068]}]}," ",{p:[31,1,1249],t:7,e:"ui-display",a:{title:"Category"},f:[{p:[32,2,1281],t:7,e:"ui-section",f:[{p:[33,3,1297],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==0?"check-square-o":"square-o"'},p:[33,20,1314]}],state:[{t:2,x:{r:["data.category"],s:'_0<=0?"selected":null'},p:[33,83,1377]}],action:"category",params:'{"category": 0}'},f:["Atmospherics"]}," ",{p:[35,3,1496],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==1?"check-square-o":"square-o"'},p:[35,20,1513]}],state:[{t:2,x:{r:["data.category"],s:'_0==1?"selected":null'},p:[35,83,1576]}],action:"category",params:'{"category": 1}'},f:["Disposals"]}," ",{p:[37,3,1692],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==2?"check-square-o":"square-o"'},p:[37,20,1709]}],state:[{t:2,x:{r:["data.category"],s:'_0==2?"selected":null'},p:[37,83,1772]}],action:"category",params:'{"category": 2}'},f:["Transit Tubes"]}]}," ",{t:4,f:[{p:[41,3,1937],t:7,e:"ui-section",a:{label:"Piping Layer"},f:[{p:[42,4,1975],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==1?"selected":null'},p:[42,22,1993]}],action:"piping_layer",params:'{"piping_layer": 1}'},f:["1"]}," ",{p:[44,4,2115],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==2?"selected":null'},p:[44,22,2133]}],action:"piping_layer",params:'{"piping_layer": 2}'},f:["2"]}," ",{p:[46,4,2255],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==3?"selected":null'},p:[46,22,2273]}],action:"piping_layer",params:'{"piping_layer": 3}'},f:["3"]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[40,2,1907]}]}," ",{t:4,f:[{p:[52,2,2462],t:7,e:"ui-display",a:{title:[{t:2,r:"cat_name",p:[52,21,2481]}]},f:[{t:4,f:[{p:[54,4,2521],t:7,e:"ui-section",f:[{p:[55,5,2539],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[55,23,2557]}],action:"pipe_type",params:['{"pipe_type": ',{t:2,r:"pipe_index",p:[56,28,2638]},', "category": ',{t:2,r:"cat_name",p:[56,56,2666]},"}"]},f:[{t:2,r:"pipe_name",p:[56,71,2681]}]}]}],n:52,r:"recipes",p:[53,3,2499]}]}],n:52,r:"data.categories",p:[51,1,2434]}]},e.exports=a.extend(r.exports)},{341:341}],454:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[3,21,78]}],action:"color",params:['{"paint_color": ',{t:2,r:"color_name",p:[4,28,155]},"}"]},f:[{t:2,r:"color_name",p:[4,45,172]}]}],n:52,r:"data.paint_colors",p:[2,2,29]}]}]},e.exports=a.extend(r.exports)},{341:341}],455:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"img",a:{src:["pipe.",{t:2,r:"dir",p:[6,71,244]},".",{t:2,r:"icon_state",p:[6,79,252]},".png"],title:[{t:2,r:"dir_name",p:[6,106,279]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}]},e.exports=a.extend(r.exports)},{341:341}],456:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{341:341}],457:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,26],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[2,20,43]}],style:[{t:2,x:{r:["enabled"],s:'_0?"selected":null'},p:[2,72,95]}],action:"toggle_filter",params:['{"id_tag": "',{t:2,r:"id_tag",p:[3,48,176]},'", "val": ',{t:2,r:"gas_id",p:[3,68,196]},"}"]},f:[{t:2,r:"gas_name",p:[3,81,209]}]}],n:52,r:"filter_types",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],458:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(459),templates:t(461),status:t(460)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,459:459,460:460,461:461}],459:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=a.extend(r.exports)},{341:341}],460:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"table",a:{width:"100%"},f:[{t:4,f:[{p:[3,3,49],t:7,e:"tr",f:[{p:[4,5,59],t:7,e:"td",f:[{p:[5,7,71],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[5,69,133]},'"}']},f:["JMP"]}]}," ",{p:[9,5,193],t:7,e:"td",f:[{p:[10,7,205],t:7,e:"ui-button",a:{action:"fly",params:['{"id": "',{t:2,r:"id",p:[10,47,245]},'"}'],state:[{t:2,x:{r:["can_fly"],s:'_0?null:"disabled"'},p:[10,64,262]}]},f:["Fly"]}]}," ",{p:[14,5,345],t:7,e:"td",f:[{t:2,r:"name",p:[15,7,357]}," (",{p:[15,17,367],t:7,e:"code",f:[{t:2,r:"id",p:[15,23,373]}]},")"]}," ",{p:[17,5,404],t:7,e:"td",f:[{t:2,r:"status",p:[18,7,416]}]}," ",{p:[20,5,443],t:7,e:"td",f:[{t:4,f:[{t:2,r:"mode",p:[22,9,477]}],n:50,r:"mode",p:[21,7,455]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[25,10,532]},") ",{p:[26,9,555],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[26,57,603]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[26,74,620]}]},f:["Fast Travel"]}],n:50,r:"timer",p:[24,7,508]}]}]}],n:52,r:"data.shuttles",p:[2,1,22]}]}]},e.exports=a.extend(r.exports)},{341:341}],461:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=a.extend(r.exports)},{341:341}],462:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,186],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,220],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,233]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,262]}]}]}," ",{p:[9,5,315],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[10,7,350],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[10,20,363]}],max:[{t:2,r:"data.occupant.maxHealth",p:[10,54,397]}],value:[{t:2,r:"data.occupant.health",p:[10,90,433]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[11,16,475]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[11,68,527]}]}]}," ",{t:4,f:[{p:[14,7,764],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[14,26,783]}]},f:[{p:[15,9,804],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[15,30,825]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[15,66,861]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[15,103,898]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[13,5,598]}," ",{t:4,f:[{p:[19,7,1020],t:7,e:"ui-section",a:{label:"Blood"},f:[{p:[20,9,1056],t:7,e:"ui-section",a:{label:"Volume"},f:[{p:[21,11,1095],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.blood.maxBloodVolume",p:[21,32,1116]}],value:[{t:2,r:"data.occupant.blood.currentBloodVolume",p:[21,79,1163]}],state:[{t:2,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"bad":"good"'},p:[21,130,1214]}]},f:[{t:3,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"LOW":"OK"'},p:[21,232,1316]}," - ",{t:2,x:{r:["data.occupant.blood.currentBloodVolume"],s:"Math.round(_0)"},p:[21,342,1426]}," cl"]}]}," ",{p:[23,9,1525],t:7,e:"ui-section",a:{label:"Type"},f:[{p:[24,11,1562],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:"data.occupant.blood.bloodType",p:[24,35,1586]}]}]}]}],n:50,r:"data.occupant.blood",p:[18,5,985]}," ",{p:[28,5,1689],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[29,9,1725],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[29,22,1738]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[29,68,1784]}]}]}," ",{p:[31,5,1867],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[32,9,1903],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[32,22,1916]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[32,68,1962]}]}]}," ",{p:[34,5,2046],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[36,11,2133],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[36,54,2176]}," units of ",{t:2,r:"name",p:[36,89,2211]}]},{p:[36,104,2226],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[35,9,2088]},{t:4,n:51,f:[{p:[38,11,2261],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[5,3,159]}]}," ",{p:[43,1,2357],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[44,2,2389],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[45,5,2420],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[45,22,2437]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[45,71,2486]}]}]}," ",{p:[47,3,2551],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[49,7,2612],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[49,38,2643]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[49,122,2727]},'"}']},f:[{t:2,r:"name",p:[49,132,2737]}]},{p:[49,152,2757],t:7,e:"br"}],n:52,r:"data.chems",p:[48,5,2584]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],463:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{ +p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:4,f:["You Are Here"],n:50,x:{r:["occupied"],s:'_0=="owner"'},p:[10,7,491]},{t:4,n:51,f:[{t:4,f:["Occupied"],n:50,x:{r:["occupied"],s:'_0=="stranger"'},p:[13,9,566]},{t:4,n:51,f:["Swap"],x:{r:["occupied"],s:'_0=="stranger"'}}],x:{r:["occupied"],s:'_0=="owner"'}}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],464:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,23,82],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.drying"],s:'_0?"stop":"tint"'},p:[4,40,99]}],action:"Dry"},f:[{t:2,x:{r:["data.drying"],s:'_0?"Stop drying":"Dry"'},p:[4,88,147]}]}],n:50,r:"data.isdryer",p:[4,3,62]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[7,3,258],t:7,e:"ui-notice",f:[{p:[8,5,275],t:7,e:"span",f:["Unfortunately, this ",{t:2,r:"data.name",p:[8,31,301]}," is empty."]}]}],n:50,x:{r:["data.contents.length"],s:"_0==0"},p:[6,1,221]},{t:4,n:51,f:[{p:[11,1,359],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[12,2,391],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[13,4,425],t:7,e:"section",a:{"class":"cell bold"},f:["Item"]}," ",{p:[16,4,482],t:7,e:"section",a:{"class":"cell bold"},f:["Quantity"]}," ",{p:[19,4,543],t:7,e:"section",a:{"class":"cell bold",align:"center"},f:[{t:4,f:[{t:2,r:"data.verb",p:[20,22,608]}],n:50,r:"data.verb",p:[20,5,591]},{t:4,n:51,f:["Dispense"],r:"data.verb"}]}]}," ",{t:4,f:[{p:[24,3,703],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[25,4,737],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[26,5,765]}]}," ",{p:[28,4,793],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[29,5,835]}]}," ",{p:[31,4,865],t:7,e:"section",a:{"class":"table",alight:"right"},f:[{p:[32,5,909],t:7,e:"section",a:{"class":"cell"}}," ",{p:[33,5,947],t:7,e:"section",a:{"class":"cell"},f:[{p:[34,6,976],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[34,45,1015]}],params:['{ "name" : ',{t:2,r:"name",p:[34,102,1072]},', "amount" : 1 }']},f:["One"]}]}," ",{p:[38,5,1151],t:7,e:"section",a:{"class":"cell"},f:[{p:[39,6,1180],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>1)?null:"disabled"'},p:[39,45,1219]}],params:['{ "name" : ',{t:2,r:"name",p:[39,101,1275]}," }"]},f:["Many"]}]}]}]}],n:52,r:"data.contents",p:[23,2,676]}]}],x:{r:["data.contents.length"],s:"_0==0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],465:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]},"   [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,r:"adata.inputLevel_text",p:[37,78,1447]}]}]}," ",{p:[39,3,1501],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1540],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1579]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1674],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1708]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1804],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1894],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1927]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2039],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2077]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2204],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2238],t:7,e:"span",f:[{t:2,r:"adata.inputAvailable",p:[47,9,2244]}]}]}]}," ",{p:[50,1,2308],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2339],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2377],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2394]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2449]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2519]}]},"   [",{p:[55,6,2587],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2600]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2617]}]},"]"]}," ",{p:[57,3,2724],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2764],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2785]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2817]}]},f:[{t:2,r:"adata.outputLevel_text",p:[58,80,2839]}]}]}," ",{p:[60,3,2894],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2934],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2973]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3070],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3104]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3202],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3293],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3326]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3441],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3479]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3609],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3644],t:7,e:"span",f:[{t:2,r:"adata.outputUsed",p:[68,9,3650]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],466:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:["\ufeff",{t:4,f:[" ",{p:[2,2,33],t:7,e:"ui-display",a:{title:"Dispersal Tank"},f:[{p:[3,3,73],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[4,4,104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.active"],s:'_0?"power-off":"close"'},p:[4,21,121]}],style:[{t:2,x:{r:["data.active"],s:'_0?"selected":null'},p:[5,12,174]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[6,12,223]}],action:"power"},f:[{t:2,x:{r:["data.active"],s:'_0?"On":"Off"'},p:[7,20,286]}]}]}," ",{p:[10,3,354],t:7,e:"ui-section",a:{label:"Smoke Radius Setting"},f:[{p:[11,5,401],t:7,e:"div",a:{"class":"content",style:"float:left"},f:[{p:[12,6,448],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=1?null:"disabled"'},p:[12,36,478]}],style:[{t:2,x:{r:["data.setting"],s:'_0==1?"selected":null'},p:[12,89,531]}],action:"setting",params:'{"amount": 1}'},f:["3"]}," ",{p:[13,6,634],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=2?null:"disabled"'},p:[13,36,664]}],style:[{t:2,x:{r:["data.setting"],s:'_0==2?"selected":null'},p:[13,89,717]}],action:"setting",params:'{"amount": 2}'},f:["6"]}," ",{p:[14,6,820],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=3?null:"disabled"'},p:[14,36,850]}],style:[{t:2,x:{r:["data.setting"],s:'_0==3?"selected":null'},p:[14,89,903]}],action:"setting",params:'{"amount": 3}'},f:["9"]}," ",{p:[15,6,1006],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=4?null:"disabled"'},p:[15,36,1036]}],style:[{t:2,x:{r:["data.setting"],s:'_0==4?"selected":null'},p:[15,89,1089]}],action:"setting",params:'{"amount": 4}'},f:["12"]}," ",{p:[16,6,1193],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=5?null:"disabled"'},p:[16,36,1223]}],style:[{t:2,x:{r:["data.setting"],s:'_0==5?"selected":null'},p:[16,89,1276]}],action:"setting",params:'{"amount": 5}'},f:["15"]}]}]}," ",{p:[19,3,1410],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[21,6,1476],t:7,e:"span",f:[{t:2,x:{r:["adata.TankCurrentVolume"],s:"Math.round(_0)"},p:[21,12,1482]},"/",{t:2,r:"data.TankMaxVolume",p:[21,52,1522]}," Units"]}," ",{p:[22,6,1564],t:7,e:"br"}," ",{p:[23,5,1575],t:7,e:"br"}," ",{t:4,f:[{p:[25,7,1623],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[25,50,1666]}," units of ",{t:2,r:"name",p:[25,85,1701]}]},{p:[25,100,1716],t:7,e:"br"}],n:52,r:"adata.TankContents",p:[24,6,1587]}],n:50,r:"data.isTankLoaded",p:[20,4,1444]},{t:4,n:51,f:[{p:[28,6,1757],t:7,e:"span",a:{"class":"bad"},f:["Tank Empty"]}],r:"data.isTankLoaded"}," ",{p:[30,4,1809],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Eject":"Close"'},p:[30,21,1826]}],style:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"selected":null'},p:[31,12,1881]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[32,12,1936]}],action:"purge"},f:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Purge Contents":"No chemicals detected"'},p:[33,20,1999]}]}]}]}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,2,1]}]},e.exports=a.extend(r.exports)},{341:341}],467:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],468:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],469:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,8,97],t:7,e:"ui-button",a:{action:"jump",params:['{"name" : ',{t:2,r:"name",p:[4,51,140]},"}"]},f:["Jump"]}," ",{p:[7,9,195],t:7,e:"ui-button",a:{action:"spawn",params:['{"name" : ',{t:2,r:"name",p:[7,53,239]},"}"]},f:["Spawn"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[2,22,46]}],button:0},f:[" ",{p:[11,3,308],t:7,e:"ui-section",a:{label:"Description"},f:[{p:[12,5,346],t:7,e:"span",f:[{t:3,r:"desc",p:[12,11,352]}]}]}," ",{p:[14,3,390],t:7,e:"ui-section",a:{label:"Spawners left"},f:[{p:[15,5,430],t:7,e:"span",f:[{t:2,r:"amount_left",p:[15,11,436]}]}]}]}],n:52,r:"data.spawners",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],470:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],471:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=a.extend(r.exports)},{341:341}],472:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],473:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],474:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],475:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 1:return"good";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,173],t:7,e:"ui-notice",f:[{p:[14,2,187],t:7,e:"ui-section",a:{label:"Reconnect"},f:[{p:[15,3,221],t:7,e:"div",a:{style:"float:right"},f:[{p:[16,4,251],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]}]}]}," ",{p:[20,1,359],t:7,e:"ui-display",a:{title:"Turbine Controller"},f:[{p:[21,2,401],t:7,e:"ui-section",a:{label:"Status"},f:[{t:4,f:[{p:[23,4,456],t:7,e:"span",a:{"class":"bad"},f:["Broken"]}],n:50,r:"data.broken",p:[22,3,432]},{t:4,n:51,f:[{p:[25,4,504],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.online"],s:"_0(_1)"},p:[25,17,517]}]},f:[{t:2,x:{r:["data.online","data.compressor_broke","data.turbine_broke"],s:'_0&&!(_1||_2)?"Online":"Offline"'},p:[25,46,546]}]}],r:"data.broken"}," ",{p:[27,3,656],t:7,e:"div",a:{style:"float:right"},f:[{p:[28,4,686],t:7,e:"ui-button",a:{icon:"power-off",action:"power-on",state:[{t:2,r:"data.broken",p:[28,57,739]}],style:[{t:2,x:{r:["data.online"],s:'_0?"selected":""'},p:[28,81,763]}]},f:["On"]}," ",{p:[29,4,817],t:7,e:"ui-button",a:{icon:"close",action:"power-off",state:[{t:2,r:"data.broken",p:[29,54,867]}],style:[{t:2,x:{r:["data.online"],s:'_0?"":"selected"'},p:[29,78,891]}]},f:["Off"]}]}," ",{t:4,f:[{p:[32,4,989],t:7,e:"br"}," [ ",{p:[33,6,1e3],t:7,e:"span",a:{"class":"bad"},f:["Compressor is inoperable"]}," ]"],n:50,r:"data.compressor_broke",p:[31,3,955]}," ",{t:4,f:[{p:[36,4,1097],t:7,e:"br"}," [ ",{p:[37,6,1108],t:7,e:"span",a:{"class":"bad"},f:["Turbine is inoperable"]}," ]"],n:50,r:"data.turbine_broke",p:[35,3,1066]}]}]}," ",{p:[41,1,1200],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[42,2,1230],t:7,e:"ui-section",a:{label:"Turbine Speed"},f:[{p:[43,3,1268],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.rpm"],s:'_0?"--":_1'},p:[43,9,1274]}," RPM"]}]}," ",{p:[45,2,1337],t:7,e:"ui-section",a:{label:"Internal Temp"},f:[{p:[46,3,1375],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.temp"],s:'_0?"--":_1'},p:[46,9,1381]}," K"]}]}," ",{p:[48,2,1443],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{p:[49,3,1483],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.power"],s:'_0?"--":_1'},p:[49,9,1489]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],476:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{341:341}],477:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,331],t:7,e:"ui-notice",f:[{p:[17,4,347],t:7,e:"span",f:["Safety restraints disabled."]}]}],n:50,r:"data.emagged",p:[15,2,307]}," ",{t:4,f:[{p:[21,3,442],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[22,4,482],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[23,5,513]}]}," ",{p:[25,4,559],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[26,5,592]}]}," ",{p:[28,4,640],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,5,673],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[29,26,694]}],value:[{t:2,r:"adata.vr_avatar.health",p:[29,64,732]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[29,99,767]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[29,140,808]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[29,179,847]}]}]}]}],n:50,r:"data.vr_avatar",p:[20,2,416]},{t:4,n:51,f:[{p:[33,3,935],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[37,2,1031],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[38,3,1067],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[38,20,1084]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[39,4,1151]}," the VR Sleeper"]}," ",{t:4,f:[{p:[42,4,1253],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[41,3,1225]}," ",{t:4,f:[{p:[47,4,1376],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar" +},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[46,3,1349]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],478:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=a.extend(r.exports)},{341:341}],479:[function(t,e,n){(function(e){"use strict";var n=t(341),a=e.interopRequireDefault(n);t(331),t(1),t(327),t(330);var r=t(480),i=e.interopRequireDefault(r),o=t(481),s=t(328),p=t(329),u=e.interopRequireDefault(p);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(485)),window.initialize=function(e){window.tgui=window.tgui||new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(482),text:t(486),config:n.config,data:n.data,adata:n.data}}})};var c=document.getElementById("data"),l=c.textContent,d=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(d,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var f=new u["default"]("FontAwesome");f.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,327:327,328:328,329:329,330:330,331:331,341:341,480:480,481:481,482:482,485:485,486:486,"babel/external-helpers":"babel/external-helpers"}],480:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(481),a=t(483);e.exports={components:{"ui-bar":t(342),"ui-button":t(343),"ui-display":t(344),"ui-input":t(345),"ui-linegraph":t(346),"ui-notice":t(347),"ui-section":t(349),"ui-subdisplay":t(350),"ui-tabs":t(351)},events:{enter:t(339).enter,space:t(339).space},transitions:{fade:t(340)},onconfig:function(){var e=this.get("config.interface"),n={ai_airlock:t(355),airalarm:t(356),"airalarm/back":t(357),"airalarm/modes":t(358),"airalarm/scrubbers":t(359),"airalarm/status":t(360),"airalarm/thresholds":t(361),"airalarm/vents":t(362),airlock_electronics:t(363),apc:t(364),atmos_alert:t(365),atmos_control:t(366),atmos_filter:t(367),atmos_mixer:t(368),atmos_pump:t(369),borgopanel:t(370),brig_timer:t(371),bsa:t(372),canister:t(373),cargo:t(374),cargo_express:t(375),cellular_emporium:t(376),centcom_podlauncher:t(377),chem_dispenser:t(378),chem_heater:t(379),chem_master:t(380),chem_synthesizer:t(381),clockwork_slab:t(382),codex_gigas:t(383),computer_fabricator:t(384),crayon:t(385),crew:t(386),cryo:t(387),disposal_unit:t(388),dna_vault:t(389),dogborg_sleeper:t(390),eightball:t(391),emergency_shuttle_console:t(392),engraved_message:t(393),error:t(394),"exofab - Copia":t(395),exonet_node:t(396),firealarm:t(397),gps:t(398),gulag_console:t(399),gulag_item_reclaimer:t(400),holodeck:t(401),implantchair:t(402),intellicard:t(403),keycard_auth:t(404),labor_claim_console:t(405),language_menu:t(406),launchpad_remote:t(407),mech_bay_power_console:t(408),mulebot:t(409),nanite_chamber_control:t(410),nanite_cloud_control:t(411),nanite_program_hub:t(412),nanite_programmer:t(413),nanite_remote:t(414),notificationpanel:t(415),ntnet_relay:t(416),ntos_ai_restorer:t(417),ntos_card:t(418),ntos_configuration:t(419),ntos_file_manager:t(420),ntos_main:t(421),ntos_net_chat:t(422),ntos_net_dos:t(423),ntos_net_downloader:t(424),ntos_net_monitor:t(425),ntos_net_transfer:t(426),ntos_power_monitor:t(427),ntos_revelation:t(428),ntos_station_alert:t(429),ntos_supermatter_monitor:t(430),ntosheader:t(431),nuclear_bomb:t(432),operating_computer:t(433),ore_redemption_machine:t(434),pandemic:t(435),personal_crafting:t(436),portable_pump:t(437),portable_scrubber:t(438),power_monitor:t(439),radio:t(440),rdconsole:t(441),"rdconsole/circuit":t(442),"rdconsole/designview":t(443),"rdconsole/destruct":t(444),"rdconsole/diskopsdesign":t(445),"rdconsole/diskopstech":t(446),"rdconsole/nodeview":t(447),"rdconsole/protolathe":t(448),"rdconsole/rdheader":t(449),"rdconsole/settings":t(450),"rdconsole/techweb":t(451),reagentgrinder:t(452),rpd:t(453),"rpd/colorsel":t(454),"rpd/dirsel":t(455),sat_control:t(456),scrubbing_types:t(457),shuttle_manipulator:t(458),"shuttle_manipulator/modification":t(459),"shuttle_manipulator/status":t(460),"shuttle_manipulator/templates":t(461),sleeper:t(462),slime_swap_body:t(463),smartvend:t(464),smes:t(465),smoke_machine:t(466),solar_control:t(467),space_heater:t(468),spawners_menu:t(469),station_alert:t(470),suit_storage_unit:t(471),tank_dispenser:t(472),tanks:t(473),thermomachine:t(474),turbine_computer:t(475),uplink:t(476),vr_sleeper:t(477),wires:t(478)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(354),titlebar:t(353),resize:t(348)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{339:339,340:340,341:341,342:342,343:343,344:344,345:345,346:346,347:347,348:348,349:349,350:350,351:351,353:353,354:354,355:355,356:356,357:357,358:358,359:359,360:360,361:361,362:362,363:363,364:364,365:365,366:366,367:367,368:368,369:369,370:370,371:371,372:372,373:373,374:374,375:375,376:376,377:377,378:378,379:379,380:380,381:381,382:382,383:383,384:384,385:385,386:386,387:387,388:388,389:389,390:390,391:391,392:392,393:393,394:394,395:395,396:396,397:397,398:398,399:399,400:400,401:401,402:402,403:403,404:404,405:405,406:406,407:407,408:408,409:409,410:410,411:411,412:412,413:413,414:414,415:415,416:416,417:417,418:418,419:419,420:420,421:421,422:422,423:423,424:424,425:425,426:426,427:427,428:428,429:429,430:430,431:431,432:432,433:433,434:434,435:435,436:436,437:437,438:438,439:439,440:440,441:441,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451,452:452,453:453,454:454,455:455,456:456,457:457,458:458,459:459,460:460,461:461,462:462,463:463,464:464,465:465,466:466,467:467,468:468,469:469,470:470,471:471,472:472,473:473,474:474,475:475,476:476,477:477,478:478,481:481,483:483}],481:[function(t,e,n){"use strict";function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],482:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],483:[function(t,e,n){"use strict";function a(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function r(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(481)},{481:481}],484:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;a||p.textContent.toLowerCase().includes(e)?p.style.display="":p.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],485:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],486:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var p=Array(o),u=0;o>u;u++)p[u]=arguments[u+3];n.children=p}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(p){r("throw",p)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(p){return void n(p)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e {{#if data.isBeakerLoaded}} {{Math.round(adata.beakerCurrentVolume)}}/{{data.beakerMaxVolume}} Units - pH: {{Math.round(adata.beakerCurrentpH*10)/10}} + pH: {{Math.round(adata.beakerCurrentpH*adata.partRating)/adata.partRating}}
      {{#each adata.beakerContents}} {{Math.fixed(volume, 2)}} units of {{name}}
      diff --git a/tgui/src/interfaces/chem_heater.ract b/tgui/src/interfaces/chem_heater.ract index 60558c1580..ce4924356a 100644 --- a/tgui/src/interfaces/chem_heater.ract +++ b/tgui/src/interfaces/chem_heater.ract @@ -17,10 +17,13 @@ {{#if data.isBeakerLoaded}} Temperature: {{Math.round(adata.currentTemp)}} K
      - pH: {{Math.round(adata.currentpH*10)/10}} + pH: {{Math.round(adata.currentpH*adata.partRating)/adata.partRating}}
      {{#each adata.beakerContents}} - {{Math.fixed(volume, 2)}} units of {{name}}
      + {{Math.fixed(volume, 2)}} units of {{name}}
      + {{#if data.showPurity}} + Purity: {{Math.fixed(purity, 2)}}
      + {{/if}} {{else}} Beaker Empty {{/each}} From cf225f335a9d050d39a4af040d56788231e30b9f Mon Sep 17 00:00:00 2001 From: Thalpy Date: Mon, 1 Jul 2019 00:18:35 +0100 Subject: [PATCH 332/608] Forgot to rename the box. --- code/modules/research/designs/misc_designs.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 05479ea7c1..019d4461de 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -470,7 +470,7 @@ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING /datum/design/pHmeter - name = "pH meter" + name = "Chemical Analyser" desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution." id = "pHmeter" build_type = PROTOLATHE @@ -524,4 +524,3 @@ build_path = /obj/item/circuitboard/computer/sat_control category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - From 48ce61580e8d20d581f3e8c8758c8cde59849f6b Mon Sep 17 00:00:00 2001 From: Thalpy Date: Mon, 1 Jul 2019 12:36:24 +0100 Subject: [PATCH 333/608] Fixes viro oversight. --- code/modules/reagents/chemistry/holder.dm | 5 +++-- .../code/modules/reagents/chemistry/reagents/MKUltra.dm | 2 +- .../code/modules/reagents/chemistry/reagents/enlargement.dm | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 436688e2c0..7f5ed18f58 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -880,8 +880,9 @@ if(isliving(my_atom)) if(R.OnMobMergeCheck == TRUE)//Forces on_mob_add proc when a chem is merged R.on_mob_add(my_atom, amount) - else - R.on_merge(data, amount, my_atom, other_purity) + //else + // R.on_merge(data, amount, my_atom, other_purity) + R.on_merge(data, amount, my_atom, other_purity) if(!no_react) handle_reactions() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 351167a865..7f89a56eb4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -200,7 +200,7 @@ Creating a chem with a low purity will make you permanently fall in love with so qdel(Vc) to_chat(M, "You feel your vocal chords tingle as your voice comes out in a more sultry tone.") else - message_admins("MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]") + log_game("FERMICHEM: MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]") M.apply_status_effect(/datum/status_effect/chem/enthrall) log_game("FERMICHEM: [M] ckey: [M.key] has taken MKUltra") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 64e4e12b66..498bb8cc5f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -136,7 +136,7 @@ /datum/reagent/fermi/BEsmaller name = "Modesty milk" id = "BEsmaller" - description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." + description = "A volatile collodial mixture derived from milk that encourages mammary reduction via a potent estrogen mix." color = "#E60584" // rgb: 96, 0, 255 taste_description = "a milky ice cream like flavour." metabolization_rate = 0.25 @@ -300,7 +300,7 @@ /datum/reagent/fermi/PEsmaller // Due to cozmo's request...! name = "Chastity draft" id = "PEsmaller" - description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." + description = "A volatile collodial mixture derived from various masculine solutions that encourages a smaller gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." color = "#888888" // This is greyish..? taste_description = "chinese dragon powder" metabolization_rate = 0.5 From 3c8025c477a9977a9ed1784d52c0b0931349ee9c Mon Sep 17 00:00:00 2001 From: Thalpy Date: Mon, 1 Jul 2019 13:56:37 +0100 Subject: [PATCH 334/608] Moving computers --- code/modules/surgery/organs/vocal_cords.dm | 17 +++++++++++------ .../code/datums/status_effects/chems.dm | 4 ++-- .../reagents/chemistry/reagents/MKUltra.dm | 13 ++++++++----- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index fdd75ffd7b..09deabeb06 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -890,7 +890,7 @@ if(L.lewd) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) else - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of [E.master]'s fingers brings you back to being under their command."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of [E.master]'s fingers brings you back to being under their influence."), 5) //tier 1 @@ -910,11 +910,11 @@ addtimer(CALLBACK(H, /atom/movable/proc/say, "I feel happy being with you."), 5) continue if(2) - speaktrigger += "I think I'm in love with you... " + speaktrigger += "[(H.lewd?"I think I'm in love with you... ":"I find you really inspirational, ")]" //' if(3) - speaktrigger += "I'm devoted to [(H.lewd?"being your pet":"following you")]! " + speaktrigger += "[(H.lewd?"I'm devoted to being your pet":"I'm commited to following your cause!")]! " if(4) - speaktrigger += "[(H.lewd?"You are my whole world and all of my being belongs to you, ":"I cannot think of anything else but you, ")] "//Redflags!! + speaktrigger += "[(H.lewd?"You are my whole world and all of my being belongs to you, ":"I cannot think of anything else but aiding your cause, ")] "//Redflags!! //mood GET_COMPONENT_FROM(mood, /datum/component/mood, H) @@ -1029,10 +1029,11 @@ for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, C)+1] - if (E.phase == 3) //If target is fully enthralled, + if (E.phase >= 3) //If target is fully enthralled, ADD_TRAIT(C, TRAIT_MUTE, "enthrall") else C.silent += ((10 * power_multiplier) * E.phase) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You are unable to speak!"), 5) E.cooldown += 3 //SPEAK @@ -1100,7 +1101,7 @@ var/mob/living/carbon/human/H = V var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase > 1) - if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused) // probably a redundant check but for good measure + if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && H.lewd) // probably a redundant check but for good measure addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Your [E.enthrallGender] pushes you over the limit, overwhelming your body with pleasure."), 5) H.mob_climax(forced_climax=TRUE) H.SetStun(20) @@ -1142,6 +1143,7 @@ if(2 to INFINITY) C.Sleeping(45 * power_multiplier) E.cooldown += 10 + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "Drowsiness suddenly overwhelms you as you fall asleep!"), 5) //STRIP else if((findtext(message, strip_words))) @@ -1167,6 +1169,7 @@ if(L.m_intent != MOVE_INTENT_WALK) L.toggle_move_intent() E.cooldown += 1 + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You slow down to a walk."), 5) //RUN else if((findtext(message, run_words))) @@ -1178,6 +1181,7 @@ if(L.m_intent != MOVE_INTENT_RUN) L.toggle_move_intent() E.cooldown += 1 + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You speed up into a jog!"), 5) //LIE DOWN else if(findtext(message, liedown_words)) @@ -1415,6 +1419,7 @@ if(3)//Tier 3 only E.status = "pacify" E.cooldown += 10 + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You feel like never hurting anyone ever again."), 5) //CHARGE else if(findtext(message, charge_words)) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index f84b301850..86a67756ee 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -307,7 +307,7 @@ to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. else - to_chat(owner, "You are unable to put up a resistance any longer, and now are under the control of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [master] in death. ") + to_chat(owner, "You are unable to put up a resistance any longer, and now are under the influence of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot follow [master] in death. ") ADD_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") //IMPORTANT log_game("FERMICHEM: MKULTRA: Status on [owner] ckey: [owner.key] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].") SSblackbox.record_feedback("tally", "fermi_chem", 1, "thralls fully enthralled.") @@ -352,7 +352,7 @@ to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") if(get_dist(master, owner) > 10) if(prob(10)) - to_chat(owner, "You NEED to return to [(owner.lewd?"your [enthrallGender]":"[master]")].") + to_chat(owner, "You feel a deep NEED to return to [(owner.lewd?"your [enthrallGender]":"[master]")].") M.throw_at(get_step_towards(master,owner), 3, 1) return//If you break the mind of someone, you can't use status effects on them. diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 7f89a56eb4..84f97f5a87 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -283,7 +283,10 @@ Creating a chem with a low purity will make you permanently fall in love with so E.master = creator else E = M.has_status_effect(/datum/status_effect/chem/enthrall) - to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side at all costs.") + if(M.lewd) + to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side at all costs.") + else + to_chat log_game("FERMICHEM: [M] ckey: [M.key] has been mindbroken for [creatorName] ckey: [creatorID]") M.slurring = 100 M.confused = 100 @@ -319,7 +322,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(!love) return M.apply_status_effect(STATUS_EFFECT_INLOVE, love) - to_chat(M, "You develop a sudden bond with [love][(M.lewd?", your heart beginning to race as you look upon them with new eyes.":".")] You are determined to keep them safe and feel drawn towards them.") + to_chat(M, "[(M.lewd?"":"")]You develop a sudden bond with [love][(M.lewd?", your heart beginning to race as you look upon them with new eyes.":".")] You are determined to keep them safe and feel drawn towards them.") log_game("FERMICHEM: [M] ckey: [M.key] has temporarily bonded with [love] ckey: [love.key]") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have bonded") else @@ -334,7 +337,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(prob(10)) M.Stun(10) M.emote("whimper")//does this exist? - to_chat(M, " You're overcome with a desire to see [love].") + to_chat(M, "[(M.lewd?"":"")] You're overcome with a desire to see [love].") M.adjustBrainLoss(1)//I found out why everyone was so damaged! ..() @@ -342,7 +345,7 @@ Creating a chem with a low purity will make you permanently fall in love with so M.remove_status_effect(STATUS_EFFECT_INLOVE) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") - to_chat(M, "Your feelings for [love] suddenly vanish!") + to_chat(M, "[(M.lewd?"":"")]Your feelings for [love] suddenly vanish!") log_game("FERMICHEM: [M] ckey: [M.key] is no longer in temp bond") ..() @@ -350,7 +353,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(Lover.has_status_effect(STATUS_EFFECT_INLOVE)) to_chat(Lover, "You are already fully devoted to someone else!") return - to_chat(Lover, "You develop deep feelings for [Love], your heart beginning to race as you look upon them with new eyes.") + to_chat(Lover, "[(Lover.lewd?"":"")]You develop a deep and sudden bond with [love][(Lover.lewd?", your heart beginning to race as your mind filles with thoughts about them.":".")] You are determined to keep them safe and happy, and feel drawn towards them.") if(Lover.mind) Lover.mind.store_memory("You are in love with [Love].") Lover.faction |= "[REF(Love)]" From 779830e6c76e64082d80f40066cd5ffc9c751ba2 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 1 Jul 2019 14:13:22 +0100 Subject: [PATCH 335/608] Compile check. Ready for update. --- modular_citadel/code/datums/status_effects/chems.dm | 3 ++- .../code/modules/reagents/chemistry/reagents/MKUltra.dm | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 86a67756ee..f8d7cfff63 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -597,12 +597,13 @@ //wah intensifies wah-rks else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - if (HAS_TRAIT(C, TRAIT_NYMPHO)) + if (HAS_TRAIT(C, TRAIT_NYMPHO) && C.lewd) if (C.getArousalLoss() > 80) C.mob_climax(forced_climax=TRUE) C.SetStun(10)//We got your stun effects in somewhere, Kev. else C.adjustArousalLoss(10) + to_chat(C, "You feel a surge of arousal!") else C.throw_at(get_step_towards(speaker,C), 3, 1) //cut this if it's too hard to get working diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 84f97f5a87..e569468453 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -284,9 +284,9 @@ Creating a chem with a low purity will make you permanently fall in love with so else E = M.has_status_effect(/datum/status_effect/chem/enthrall) if(M.lewd) - to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side at all costs.") + to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side and protect them at all costs.") else - to_chat + to_chat(M, "The might volume of chemicals in your system overwhelms your mind, and you suddenly agree with what they've been saying. Your highest priority is now to stay by their side and protect them at all costs. log_game("FERMICHEM: [M] ckey: [M.key] has been mindbroken for [creatorName] ckey: [creatorID]") M.slurring = 100 M.confused = 100 @@ -353,7 +353,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(Lover.has_status_effect(STATUS_EFFECT_INLOVE)) to_chat(Lover, "You are already fully devoted to someone else!") return - to_chat(Lover, "[(Lover.lewd?"":"")]You develop a deep and sudden bond with [love][(Lover.lewd?", your heart beginning to race as your mind filles with thoughts about them.":".")] You are determined to keep them safe and happy, and feel drawn towards them.") + to_chat(Lover, "[(Lover.lewd?"":"")]You develop a deep and sudden bond with [Love][(Lover.lewd?", your heart beginning to race as your mind filles with thoughts about them.":".")] You are determined to keep them safe and happy, and feel drawn towards them.") if(Lover.mind) Lover.mind.store_memory("You are in love with [Love].") Lover.faction |= "[REF(Love)]" From 04c3b0e66e2bc2c60d2307e7faaa52a43151ec34 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 1 Jul 2019 14:13:31 +0100 Subject: [PATCH 336/608] Oops. --- .../code/modules/reagents/chemistry/reagents/MKUltra.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index e569468453..3b675ffccb 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -286,7 +286,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(M.lewd) to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side and protect them at all costs.") else - to_chat(M, "The might volume of chemicals in your system overwhelms your mind, and you suddenly agree with what they've been saying. Your highest priority is now to stay by their side and protect them at all costs. + to_chat(M, "The might volume of chemicals in your system overwhelms your mind, and you suddenly agree with what they've been saying. Your highest priority is now to stay by their side and protect them at all costs.") log_game("FERMICHEM: [M] ckey: [M.key] has been mindbroken for [creatorName] ckey: [creatorID]") M.slurring = 100 M.confused = 100 From 0f2978d7fd491db455d6782d1239e997457230ec Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 1 Jul 2019 14:47:32 +0100 Subject: [PATCH 337/608] Updated Analysis meter's Analysis. --- modular_citadel/code/modules/reagents/objects/items.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index a1d7a296a4..e7b73525c6 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -138,8 +138,8 @@ out_message += "A reaction appears to be occuring currently.\n" out_message += "Chemicals found in the beaker:\n" for(var/datum/reagent/R in cont.reagents.reagent_list) - out_message += "[R.name], Purity: [R.purity] [(scanmode?"Overdose: [R.overdose_threshold], Addiction: [R.addiction_threshold], Base pH [R.pH]":"")]\n" + out_message += "[R.volume]u of [R.name], Purity: [R.purity], [(scanmode?"[(R.overdose_threshold?"Overdose: [R.overdose_threshold]u, ":"")][(R.addiction_threshold?"Addiction: [R.addiction_threshold]u, ":"")]Base pH: [R.pH].":".")]\n" if(scanmode) - out_message += "Analysis: [R.description]\n" + out_message += "Analysis: [R.description]\n" to_chat(user, "[out_message]") desc = "An electrode attached to a small circuit box that will analyse a beaker. It can be toggled to give a reduced or extended report. The screen currently displays [round(cont.reagents.pH, 0.1)]." From 326bae210935a2f51f22f4fd8444fd266b3de86c Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 1 Jul 2019 21:04:17 +0100 Subject: [PATCH 338/608] pH? More like Pretty HARGH. --- code/modules/reagents/chemistry/holder.dm | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 7f5ed18f58..be2b4ccb57 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -191,6 +191,7 @@ amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) var/part = amount / src.total_volume var/trans_data = null + message_admins("transferring pH: [pH]") for(var/reagent in cached_reagents) var/datum/reagent/T = reagent var/transfer_amount = T.volume * part @@ -844,8 +845,11 @@ var/new_total = cached_total + amount var/cached_temp = chem_temp var/list/cached_reagents = reagent_list + var/cached_pH = pH + + //Equalize temperature - Not using specific_heat() because the new chemical isn't in yet. var/specific_heat = 0 var/thermal_energy = 0 @@ -858,13 +862,14 @@ chem_temp = thermal_energy / (specific_heat * new_total) //cacluate reagent based pH shift. - if(ignore_pH == FALSE) - pH = ((cached_pH * cached_total)+(D.pH * amount))/(cached_total + amount)//should be right - if(istype(my_atom, /obj/item/reagent_containers/)) - var/obj/item/reagent_containers/RC = my_atom - RC.pH_check()//checks beaker resilience + if(ignore_pH == TRUE) + message_admins("ignoring pH old pH: [pH], added pH [D.pH]") + pH = ((cached_pH * cached_total)+(other_pH * amount))/(cached_total + amount)//should be right else - pH = other_pH + pH = ((cached_pH * cached_total)+(D.pH * amount))/(cached_total + amount)//should be right + if(istype(my_atom, /obj/item/reagent_containers/)) + var/obj/item/reagent_containers/RC = my_atom + RC.pH_check()//checks beaker resilience //add the reagent to the existing if it exists for(var/A in cached_reagents) From d876b20a0bf44e430ce34de729e4e95b37f99753 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 1 Jul 2019 22:32:42 +0100 Subject: [PATCH 339/608] Quickfix for botany and removed message_admins that I thought I pushed. --- code/modules/reagents/chemistry/holder.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index be2b4ccb57..809d0cee65 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -191,7 +191,6 @@ amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) var/part = amount / src.total_volume var/trans_data = null - message_admins("transferring pH: [pH]") for(var/reagent in cached_reagents) var/datum/reagent/T = reagent var/transfer_amount = T.volume * part @@ -819,7 +818,7 @@ WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") return FALSE - if (D.id == "water" && no_react == FALSE) //Do like an otter, add acid to water. + if (D.id == "water" && no_react == FALSE && !istype(my_atom, /obj/item/reagent_containers/food)) //Do like an otter, add acid to water, but also don't blow up botany. if (pH <= 2) SSblackbox.record_feedback("tally", "fermi_chem", 1, "water-acid explosions") var/datum/effect_system/smoke_spread/chem/s = new @@ -863,7 +862,6 @@ //cacluate reagent based pH shift. if(ignore_pH == TRUE) - message_admins("ignoring pH old pH: [pH], added pH [D.pH]") pH = ((cached_pH * cached_total)+(other_pH * amount))/(cached_total + amount)//should be right else pH = ((cached_pH * cached_total)+(D.pH * amount))/(cached_total + amount)//should be right From d83fe495562e554694cb4c40f927583fa7a7570d Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 2 Jul 2019 15:03:19 +0100 Subject: [PATCH 340/608] +lewdchem pref on CC -EnthrallExpo from botany, tweaks messages on EExpo --- code/datums/mind.dm | 1 + code/modules/client/preferences.dm | 3 +++ code/modules/client/preferences_savefile.dm | 2 ++ code/modules/mob/living/carbon/human/species.dm | 2 ++ modular_citadel/code/datums/status_effects/chems.dm | 4 ++-- modular_citadel/code/modules/client/preferences.dm | 2 ++ .../modules/reagents/chemistry/reagents/MKUltra.dm | 11 ++++++++--- 7 files changed, 20 insertions(+), 5 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 90affe0228..f43f0d19bd 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -128,6 +128,7 @@ if(L.client && L.client.prefs) L.canbearoused = L.client.prefs.arousable //Technically this should make taking over a character mean the body gain the new minds setting... L.update_arousal_hud() //Removes the old icon + L.lewd = L.client.prefs.lewdchem /datum/mind/proc/store_memory(new_text) memory += "[new_text]
      " diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 7a6fdad721..2d265db999 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -782,6 +782,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Voracious MediHound sleepers:
      [(cit_toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"]
      " dat += "Hear Vore Sounds:
      [(cit_toggles & EATING_NOISES) ? "Yes" : "No"]
      " dat += "Hear Vore Digestion Sounds: [(cit_toggles & DIGESTION_NOISES) ? "Yes" : "No"]
      " + dat += "Lewdchem:[lewdchem == TRUE ? "Enabled" : "Disabled"]
      " dat += "Widescreen: [widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"]
      " dat += "Auto stand: [autostand ? "Enabled" : "Disabled"]
      " dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]
      " @@ -2000,6 +2001,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["genitals_use_skintone"] = !features["genitals_use_skintone"] if("arousable") arousable = !arousable + if("lewdchem") + lewdchem = !lewdchem if("has_cock") features["has_cock"] = !features["has_cock"] if(features["has_cock"] == FALSE) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 3c5d547b46..07e41f1e01 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -117,6 +117,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["widescreenpref"] >> widescreenpref S["autostand"] >> autostand S["cit_toggles"] >> cit_toggles + S["lewdchem"] >> lewdchem //try to fix any outdated data if necessary if(needs_update >= 0) @@ -210,6 +211,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["widescreenpref"], widescreenpref) WRITE_FILE(S["autostand"], autostand) WRITE_FILE(S["cit_toggles"], cit_toggles) + WRITE_FILE(S["lewdchem"], lewdchem) return 1 diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 3324b07217..16f190e3c0 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -296,6 +296,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species) + C.lewd = C.client.prefs.lewdchem + //CITADEL EDIT if(NOAROUSAL in species_traits) C.canbearoused = FALSE diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index f8d7cfff63..af41d218f9 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -352,8 +352,8 @@ to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") if(get_dist(master, owner) > 10) if(prob(10)) - to_chat(owner, "You feel a deep NEED to return to [(owner.lewd?"your [enthrallGender]":"[master]")].") - M.throw_at(get_step_towards(master,owner), 3, 1) + to_chat(owner, "You feel [(owner.lewd?"a deep NEED to return to your [enthrallGender]":"like you have to return to [master]")].") + M.throw_at(get_step_towards(master,owner), 5, 1) return//If you break the mind of someone, you can't use status effects on them. diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm index dfe419964e..f757123b45 100644 --- a/modular_citadel/code/modules/client/preferences.dm +++ b/modular_citadel/code/modules/client/preferences.dm @@ -15,6 +15,7 @@ var/arousable = TRUE var/widescreenpref = TRUE var/autostand = TRUE + var/lewdchem = TRUE //vore prefs var/toggleeatingnoise = TRUE @@ -53,5 +54,6 @@ datum/preferences/copy_to(mob/living/carbon/human/character, icon_updates = 1) character.give_genitals(TRUE) character.flavor_text = features["flavor_text"] //Let's update their flavor_text at least initially character.canbearoused = arousable + character.lewd = lewdchem if(icon_updates) character.update_genitals() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 3b675ffccb..94fdee15b4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -308,9 +308,12 @@ Creating a chem with a low purity will make you permanently fall in love with so metabolization_rate = 0.1 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses." DoNotSplit = TRUE + can_synth = FALSE var/mob/living/carbon/love /datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system,Gives a positive moodlet if close, gives brain damagea and a negative moodlet if not close enough. + if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) + return ..() if(!M.has_status_effect(STATUS_EFFECT_INLOVE)) var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers for(var/victim in seen) @@ -322,7 +325,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(!love) return M.apply_status_effect(STATUS_EFFECT_INLOVE, love) - to_chat(M, "[(M.lewd?"":"")]You develop a sudden bond with [love][(M.lewd?", your heart beginning to race as you look upon them with new eyes.":".")] You are determined to keep them safe and feel drawn towards them.") + to_chat(M, "[(M.lewd?"":"")][(M.lewd?"You develop a sudden crush on [love], your heart beginning to race as you look upon them with new eyes.":"You suddenly feel like making friends with [love].")] You are determined to make friends with them and feel drawn towards them.") log_game("FERMICHEM: [M] ckey: [M.key] has temporarily bonded with [love] ckey: [love.key]") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have bonded") else @@ -335,13 +338,15 @@ Creating a chem with a low purity will make you permanently fall in love with so SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") if(prob(10)) - M.Stun(10) + M.Stun(5) M.emote("whimper")//does this exist? to_chat(M, "[(M.lewd?"":"")] You're overcome with a desire to see [love].") - M.adjustBrainLoss(1)//I found out why everyone was so damaged! + M.adjustBrainLoss(0.5)//I found out why everyone was so damaged! ..() /datum/reagent/fermi/enthrallExplo/on_mob_delete(mob/living/carbon/M) + if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) + return ..() M.remove_status_effect(STATUS_EFFECT_INLOVE) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") From 946fbff999bbf40b92431b1d80e8ba4593f3c0ce Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 2 Jul 2019 22:15:32 +0100 Subject: [PATCH 341/608] +Yamerol, tweaked PE, tweaked CM3000, tweaked medpH. --- .../food_and_drinks/food/snacks_vend.dm | 2 +- .../mob/living/carbon/human/species.dm | 4 +- code/modules/mob/living/living.dm | 3 +- code/modules/reagents/chemistry/holder.dm | 12 +-- .../chemistry/machinery/chem_master.dm | 5 ++ .../chemistry/reagents/medicine_reagents.dm | 12 +-- .../code/datums/status_effects/chems.dm | 2 +- .../reagents/chemistry/reagents/MKUltra.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 8 +- .../reagents/chemistry/reagents/healing.dm | 88 +++++++++++++++++++ .../reagents/chemistry/recipes/fermi.dm | 30 +++++-- tgstation.dme | 1 + 12 files changed, 142 insertions(+), 27 deletions(-) create mode 100644 modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm diff --git a/code/modules/food_and_drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm index 317a434040..8f661b868e 100644 --- a/code/modules/food_and_drinks/food/snacks_vend.dm +++ b/code/modules/food_and_drinks/food/snacks_vend.dm @@ -7,7 +7,7 @@ desc = "Nougat love it or hate it." icon_state = "candy" trash = /obj/item/trash/candy - list_reagents = list("nutriment" = 1, "sugar" = 3) + list_reagents = list("nutriment" = 1, "sugar" = 3, "cocoa" = 3) junkiness = 25 filling_color = "#D2691E" tastes = list("candy" = 1) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 16f190e3c0..a99b115e4c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -295,8 +295,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) A.cure(FALSE) SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species) - - C.lewd = C.client.prefs.lewdchem + if(C.client) + C.lewd = C.client.prefs.lewdchem //CITADEL EDIT if(NOAROUSAL in species_traits) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 5d708ebc18..786b2f9584 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -281,7 +281,7 @@ var/datum/disease/D = thing if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) ContactContractDisease(D) - + if(iscarbon(L)) var/mob/living/carbon/C = L if(HAS_TRAIT(src, TRAIT_STRONG_GRABBER)) @@ -329,6 +329,7 @@ to_chat(src, "You have given up life and succumbed to death.") death() + /mob/living/incapacitated(ignore_restraints, ignore_grab) if(stat || IsUnconscious() || IsStun() || IsKnockdown() || recoveringstam || (!ignore_restraints && restrained(ignore_grab))) // CIT CHANGE - adds recoveringstam check here return TRUE diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 809d0cee65..6a30a6eef5 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -544,7 +544,7 @@ for(var/B in cached_required_reagents) // multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.001)) if (multiplier == 0) - fermiEnd(multiplier) + fermiEnd() return for(var/P in cached_results) targetVol = cached_results[P]*multiplier @@ -557,16 +557,16 @@ if (reactedVol < targetVol) reactedVol = fermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) else//Volume is used up - fermiEnd(multiplier) + fermiEnd() return else//pH is out of range - fermiEnd(multiplier) + fermiEnd() return else//Temperature is too low, or reaction has stopped. - fermiEnd(multiplier) + fermiEnd() return -/datum/reagents/proc/fermiEnd(multiplier) +/datum/reagents/proc/fermiEnd() var/datum/chemical_reaction/fermi/C = fermiReactID STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE @@ -576,7 +576,7 @@ if(istype(my_atom, /obj/item/reagent_containers)) var/obj/item/reagent_containers/RC = my_atom RC.pH_check() - C.FermiFinish(src, my_atom, multiplier) + C.FermiFinish(src, my_atom) handle_reactions() update_total() //Reaction sounds and words diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index aeed5ffc37..0666cfd104 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -182,11 +182,13 @@ var/id = params["id"] var/amount = text2num(params["amount"]) if (amount > 0) + end_fermi_reaction() beaker.reagents.trans_id_to(src, id, amount) . = TRUE else if (amount == -1) // -1 means custom amount useramount = input("Enter the Amount you want to transfer:", name, useramount) as num|null if (useramount > 0) + end_fermi_reaction() beaker.reagents.trans_id_to(src, id, useramount) . = TRUE @@ -358,6 +360,9 @@ +/obj/machinery/chem_master/proc/end_fermi_reaction()//Ends any reactions upon moving. + if(beaker.reagents.fermiIsReacting == 1) + beaker.reagents.fermiEnd() /obj/machinery/chem_master/proc/isgoodnumber(num) if(isnum(num)) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 068680858b..6017e5107c 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -172,7 +172,7 @@ description = "A mixture of cryoxadone and slime jelly, that apparently inverses the requirement for its activation." color = "#f7832a" taste_description = "spicy jelly" - pH = 14 + pH = 12 /datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/M) if(M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) @@ -527,7 +527,7 @@ description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body. Slimepeople friendly!" color = "#91D865" healtoxinlover = TRUE - pH = 14//invert + pH = 12//invert /datum/reagent/medicine/sal_acid name = "Salicyclic Acid" @@ -537,7 +537,7 @@ color = "#D2D2D2" metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 25 - pH = 1 + pH = 2.1 /datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M) @@ -652,7 +652,7 @@ reagent_state = LIQUID color = "#64FFE6" metabolization_rate = 0.5 * REAGENTS_METABOLISM - pH = 13 + pH = 11.5 /datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/carbon/M) if(prob(10)) @@ -771,7 +771,7 @@ color = "#000000" metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 35 - pH = 14 + pH = 12 /datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/M) if(M.health < 0) @@ -1145,7 +1145,7 @@ color = "#91D865" overdose_threshold = 30 taste_description = "jelly" - pH = 13 + pH = 11.8 /datum/reagent/medicine/neo_jelly/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-1.5*REM, 0) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index af41d218f9..fd993a00fd 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -134,7 +134,7 @@ var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/penis/P = o.getorganslot("penis") moveCalc = 1+((round(P.length) - 21)/3) //effects how fast you can move - bloodCalc = 1+((round(P.length) - 21)/10) //effects how much blood you need (I didn' bother adding an arousal check because I'm spending too much time on this organ already.) + bloodCalc = 1+((round(P.length) - 21)/15) //effects how much blood you need (I didn' bother adding an arousal check because I'm spending too much time on this organ already.) if(!P) o.remove_movespeed_modifier(DICK_MOVEMENT_SPEED) o.ResetBloodVol() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 94fdee15b4..5cda4d4b24 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -325,7 +325,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(!love) return M.apply_status_effect(STATUS_EFFECT_INLOVE, love) - to_chat(M, "[(M.lewd?"":"")][(M.lewd?"You develop a sudden crush on [love], your heart beginning to race as you look upon them with new eyes.":"You suddenly feel like making friends with [love].")] You are determined to make friends with them and feel drawn towards them.") + to_chat(M, "[(M.lewd?"":"")][(M.lewd?"You develop a sudden crush on [love], your heart beginning to race as you look upon them with new eyes.":"You suddenly feel like making friends with [love].")] You feel strangely drawn towards them.") log_game("FERMICHEM: [M] ckey: [M.key] has temporarily bonded with [love] ckey: [love.key]") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have bonded") else diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 929e0605e3..9a3ae25b25 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -340,10 +340,10 @@ /datum/reagent/fermi/acidic_buffer name = "Acidic buffer" id = "acidic_buffer" - description = "This reagent will consume itself and move the pH of a beaker towards 3 when added to another." + description = "This reagent will consume itself and move the pH of a beaker towards acidity when added to another." taste_description = "an acidy sort of taste, blech." color = "#fbc314" - pH = 3 + pH = 0 //Consumes self on addition and shifts pH /datum/reagent/fermi/acidic_buffer/on_new(datapH) @@ -361,10 +361,10 @@ /datum/reagent/fermi/basic_buffer name = "Basic buffer" id = "basic_buffer" - description = "This reagent will consume itself and move the pH of a beaker towards 11 when added to another." + description = "This reagent will consume itself and move the pH of a beaker towards alkalinity when added to another." taste_description = "an soapy sort of taste, blech." color = "#3853a4" - pH = 11 + pH = 14 /datum/reagent/fermi/basic_buffer/on_new(datapH) data = datapH diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm new file mode 100644 index 0000000000..8fac5103fb --- /dev/null +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -0,0 +1,88 @@ +/datum/reagent/fermi/yamerol + name = "Yamerol" + id = "yamerol" + description = "For when you've trouble speaking or breathing, just yell YAMEROL! A chem that helps soothe any congestion problems and at high concentrations restores damaged lungs and tongues!" + taste_description = "a weird, syrupy flavour, yamero" + color = "#68e83a" + pH = 8.6 + overdose_threshold = 35 + ImpureChem = "yamerol_tox" //If you make an inpure chem, it stalls growth + InverseChemVal = 0.3 + InverseChem = "yamerol_tox" //At really impure vols, it just becomes 100% inverse + +/datum/reagent/fermi/yamerol/on_mob_life(mob/living/carbon/C) + var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) + message_admins("Yamero!") + if(T) + T.adjustTongueLoss(C, -2) + message_admins("Yamero tongue!") + if(L) + message_admins("Yamero lungs!") + L.adjustLungLoss(-5, C) + C.adjustOxyLoss(-2) + else + message_admins("Yamero no lungs!") + C.adjustOxyLoss(-10) + ..() + +/datum/reagent/fermi/yamerol/overdose_process(mob/living/carbon/C) + var/obj/item/organ/tongue/oT = C.getorganslot(ORGAN_SLOT_TONGUE) + + if(current_cycle > 10) + if(!C.getorganslot(ORGAN_SLOT_TONGUE)) + var/obj/item/organ/tongue/T + + if(C.dna && C.dna.species && C.dna.species.mutanttongue) + T = new C.dna.species.mutanttongue() + else + T = new() + T.Insert(C) + to_chat(M, "You feel your tongue reform in your mouth.") + holder.remove_reagent(src.id, "10") + else + if((oT.name == "fluffy tongue") && (purity == 1)) + var/obj/item/organ/tongue/T + + if(C.dna && C.dna.species && C.dna.species.mutanttongue) + T = new C.dna.species.mutanttongue() + else + T = new() + oT.Remove(C) + qdel(oT) + T.Insert(C) + to_chat(M, "You feel your tongue.... unfluffify...?") + holder.remove_reagent(src.id, "10") + + if(!C.getorganslot(ORGAN_SLOT_LUNGS)) + var/obj/item/organ/lungs/L = new() + L.Insert(C) + to_chat(M, "You feel your lungs reform in your chest.") + holder.remove_reagent(src.id, "10") + + + ..() + +/datum/reagent/fermi/yamerol_tox + name = "Yamerol" + id = "yamerol_tox" + description = "For when you've trouble speaking or breathing, just yell YAMEROL! A chem that helps soothe any congestion problems and at high concentrations restores damaged lungs and tongues!" + taste_description = "a weird, syrupy flavour, yamero" + color = "#68e83a" + pH = 8.6 + +/datum/reagent/fermi/yamerol_tox/on_mob_life(mob/living/carbon/C) + var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) + message_admins("Yameroe!") + if(T) + message_admins("Yamero tongue!") + T.adjustTongueLoss(C, 2) + if(L) + message_admins("Yameroe lungs!") + L.adjustLungLoss(5, C) + C.adjustOxyLoss(2) + else + message_admins("Yameroe no lungs!") + C.adjustOxyLoss(10) + ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 372ef001c4..7dca90d707 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -6,7 +6,7 @@ return //Called when reaction STOP_PROCESSING -/datum/chemical_reaction/fermi/proc/FermiFinish(datum/reagents/holder, multipler) +/datum/chemical_reaction/fermi/proc/FermiFinish(datum/reagents/holder) return //Called when temperature is above a certain threshold, or if purity is too low. @@ -418,19 +418,19 @@ if(!locate(/datum/reagent/fermi/acidic_buffer) in my_atom.reagents.reagent_list) return var/datum/reagent/fermi/acidic_buffer/Fa = locate(/datum/reagent/fermi/acidic_buffer) in my_atom.reagents.reagent_list - Fa.data = 3 + Fa.data = 0 /datum/chemical_reaction/fermi/basic_buffer//done test name = "Ethyl Ethanoate buffer" id = "basic_buffer" results = list("basic_buffer" = 1.5) - required_reagents = list("acidic_buffer" = 0.5, "ethanol" = 0.5, "salglu_solution" = 0.1, "water" = 0.5) + required_reagents = list("acidic_buffer" = 0.5, "ethanol" = 0.5, , "water" = 0.5) required_catalysts = list("sacid" = 1) //vagely acetic //FermiChem vars: OptimalTempMin = 250 OptimalTempMax = 500 ExplodeTemp = 9999 //check to see overflow doesn't happen! - OptimalpHMin = 8 + OptimalpHMin = 6 OptimalpHMax = 12 ReactpHLim = 0 //CatalystFact = 0 //To do 1 @@ -446,7 +446,7 @@ if(!locate(/datum/reagent/fermi/basic_buffer) in my_atom.reagents.reagent_list) return var/datum/reagent/fermi/basic_buffer/Fb = locate(/datum/reagent/fermi/basic_buffer) in my_atom.reagents.reagent_list - Fb.data = 11 + Fb.data = 14 //secretcatchemcode, shh!! Of couse I hide it amongst cats. Though, I moved it with your requests. //I'm not trying to be sneaky, I'm trying to keep it a secret! @@ -504,3 +504,23 @@ catto.desc = "A cute chem cat, created by a lot of compicated and confusing chemistry!" catto.color = "#770000" my_atom.reagents.remove_any(10) + +/datum/chemical_reaction/fermi/yamerol//done test + name = "Yamerol" + id = "yamerol" + results = list("yamerol" = 1.5) + required_reagents = list("perfluorodecalin" = 0.5, "furranium" = 0.5, "water" = 0.5) + //FermiChem vars: + OptimalTempMin = 300 + OptimalTempMax = 500 + ExplodeTemp = 800 //check to see overflow doesn't happen! + OptimalpHMin = 6.8 + OptimalpHMax = 7.2 + ReactpHLim = 4 + //CatalystFact = 0 //To do 1 + CurveSharpT = 5 + CurveSharppH = 0.5 + ThermicConstant = -15 + HIonRelease = 0.1 + RateUpLim = 2 + FermiChem = TRUE diff --git a/tgstation.dme b/tgstation.dme index 91f0f94ce3..301894f102 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -3034,6 +3034,7 @@ #include "modular_citadel\code\modules\reagents\chemistry\reagents\eigentstasium.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\enlargement.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\healing.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\MKUltra.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\SDGF.dm" From 27aad8f1172febdb960565f232a56994d0938981 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 2 Jul 2019 22:42:07 +0100 Subject: [PATCH 342/608] Quick in case. --- code/datums/mind.dm | 1 - .../mob/living/carbon/human/species.dm | 2 - code/modules/mob/living/living.dm | 9 ++- .../chemistry/machinery/chem_master.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 42 +++++------ .../code/datums/status_effects/chems.dm | 70 ++++++++++--------- .../code/modules/client/preferences.dm | 2 +- .../reagents/chemistry/reagents/MKUltra.dm | 12 ++-- .../reagents/chemistry/reagents/healing.dm | 22 +++--- 9 files changed, 84 insertions(+), 78 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index f43f0d19bd..90affe0228 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -128,7 +128,6 @@ if(L.client && L.client.prefs) L.canbearoused = L.client.prefs.arousable //Technically this should make taking over a character mean the body gain the new minds setting... L.update_arousal_hud() //Removes the old icon - L.lewd = L.client.prefs.lewdchem /datum/mind/proc/store_memory(new_text) memory += "[new_text]
      " diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index a99b115e4c..3324b07217 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -295,8 +295,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) A.cure(FALSE) SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species) - if(C.client) - C.lewd = C.client.prefs.lewdchem //CITADEL EDIT if(NOAROUSAL in species_traits) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 786b2f9584..8ab8991320 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -318,9 +318,16 @@ visible_message("[src] points at [A].", "You point at [A].") return TRUE -/mob/living/verb/succumb(whispered as null) +/mob/living/verb/succumb(whispered as num) set name = "Succumb" set category = "IC" + message_admins("succumb pressed") + if(src.has_status_effect(/datum/status_effect/chem/enthrall)) + message_admins("status found") + var/datum/status_effect/chem/enthrall/E = src.has_status_effect(/datum/status_effect/chem/enthrall) + if(E.phase < 3) + message_admins("increasing phase") + E.phase += 1 if (InCritical()) log_message("Has [whispered ? "whispered his final words" : "succumbed to death"] while in [InFullCritical() ? "hard":"soft"] critical with [round(health, 0.1)] points of health!", LOG_ATTACK) adjustOxyLoss(health - HEALTH_THRESHOLD_DEAD) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 0666cfd104..14a51f007f 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -361,7 +361,7 @@ /obj/machinery/chem_master/proc/end_fermi_reaction()//Ends any reactions upon moving. - if(beaker.reagents.fermiIsReacting == 1) + if(beaker.reagents.fermiIsReacting) beaker.reagents.fermiEnd() /obj/machinery/chem_master/proc/isgoodnumber(num) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 09deabeb06..cc37c19b64 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -809,7 +809,7 @@ else E.enthrallTally += power_multiplier*1.25 //thinking about it, I don't know how this can proc if(L.canbearoused) - if(L.lewd) + if(L.client?.prefs.lewdchem) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] is so nice to listen to."), 5) E.cooldown += 1 @@ -821,7 +821,7 @@ power_multiplier *= distancelist[get_dist(user, V)+1] if(L == user) continue - if (L.lewd) + if (L.client?.prefs.lewdchem) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] has praised me!!"), 5) if(HAS_TRAIT(L, TRAIT_NYMPHO)) L.adjustArousalLoss(2*power_multiplier) @@ -833,7 +833,7 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've been praised for doing a good job!"), 5) E.resistanceTally -= power_multiplier E.enthrallTally += power_multiplier - var/descmessage = "[(L.lewd?"I feel so happy! I'm a good pet who [E.enthrallGender] loves!":"I did a good job!")]" + var/descmessage = "[(L.client?.prefs.lewdchem?"I feel so happy! I'm a good pet who [E.enthrallGender] loves!":"I did a good job!")]" SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise, descmessage) E.cooldown += 1 @@ -842,10 +842,10 @@ for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) - var/descmessage = "[(L.lewd?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]" + var/descmessage = "[(L.client?.prefs.lewdchem?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]" if(L == user) continue - if (L.lewd) + if (L.client?.prefs.lewdchem) if(HAS_TRAIT(L, TRAIT_MASO)) L.adjustArousalLoss(3*power_multiplier) descmessage += "And yet, it feels so good..!
      " //I don't really understand masco, is this the right sort of thing they like? @@ -871,7 +871,7 @@ var/mob/living/carbon/C = V var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) REMOVE_TRAIT(C, TRAIT_MUTE, "enthrall") - if(C.lewd) + if(C.client?.prefs.lewdchem) addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.enthrallGender]"), 5) else addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.master]"), 5) @@ -887,7 +887,7 @@ E.phase = 3 E.status = null user.emote("snap") - if(L.lewd) + if(L.client?.prefs.lewdchem) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) else addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of [E.master]'s fingers brings you back to being under their influence."), 5) @@ -910,11 +910,11 @@ addtimer(CALLBACK(H, /atom/movable/proc/say, "I feel happy being with you."), 5) continue if(2) - speaktrigger += "[(H.lewd?"I think I'm in love with you... ":"I find you really inspirational, ")]" //' + speaktrigger += "[(H.client?.prefs.lewdchem?"I think I'm in love with you... ":"I find you really inspirational, ")]" //' if(3) - speaktrigger += "[(H.lewd?"I'm devoted to being your pet":"I'm commited to following your cause!")]! " + speaktrigger += "[(H.client?.prefs.lewdchem?"I'm devoted to being your pet":"I'm commited to following your cause!")]! " if(4) - speaktrigger += "[(H.lewd?"You are my whole world and all of my being belongs to you, ":"I cannot think of anything else but aiding your cause, ")] "//Redflags!! + speaktrigger += "[(H.client?.prefs.lewdchem?"You are my whole world and all of my being belongs to you, ":"I cannot think of anything else but aiding your cause, ")] "//Redflags!! //mood GET_COMPONENT_FROM(mood, /datum/component/mood, H) @@ -1003,7 +1003,7 @@ speaktrigger += "I feel like I'm on the brink of losing my mind, " //horny - if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && H.lewd) + if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && H.client?.prefs.lewdchem) switch(H.getArousalLoss()) if(40 to 60) speaktrigger += "I'm feeling a little horny, " @@ -1016,7 +1016,7 @@ if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar)) speaktrigger += "I love the collar you gave me, " //End - if(H.lewd) + if(H.client?.prefs.lewdchem) speaktrigger += "[E.enthrallGender]!" else speaktrigger += "[user.first_name()]!" @@ -1077,7 +1077,7 @@ if(3) E.phase = 0 E.cooldown = 0 - if(C.lewd) + if(C.client?.prefs.lewdchem) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) else addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) @@ -1101,7 +1101,7 @@ var/mob/living/carbon/human/H = V var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase > 1) - if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && H.lewd) // probably a redundant check but for good measure + if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && H.client?.prefs.lewdchem) // probably a redundant check but for good measure addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Your [E.enthrallGender] pushes you over the limit, overwhelming your body with pleasure."), 5) H.mob_climax(forced_climax=TRUE) H.SetStun(20) @@ -1156,7 +1156,7 @@ for(var/obj/item/W in items) if(W == H.w_uniform || W == H.wear_suit) H.dropItemToGround(W, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Before you can even think about it, you quickly remove your clothes in response to [(H.lewd?"your [E.enthrallGender]'s command'":"[E.master]'s directive'")]."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Before you can even think about it, you quickly remove your clothes in response to [(H.client?.prefs.lewdchem?"your [E.enthrallGender]'s command'":"[E.master]'s directive'")]."), 5) E.cooldown += 10 //WALK @@ -1192,7 +1192,7 @@ if(2 to INFINITY) L.lay_down() E.cooldown += 10 - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[(L.lewd?"You eagerly lie down!":"You suddenly lie down!")]"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[(L.client?.prefs.lewdchem?"You eagerly lie down!":"You suddenly lie down!")]"), 5) //KNOCKDOWN else if(findtext(message, knockdown_words)) @@ -1221,7 +1221,7 @@ for (var/trigger in E.customTriggers) speaktrigger += "[trigger], " to_chat(user, "[C] whispers, \"[speaktrigger] are my triggers.\"")//So they don't trigger themselves! - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You whisper your triggers to [(C.lewd?"Your [E.enthrallGender]":"[E.master]")]."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You whisper your triggers to [(C.client?.prefs.lewdchem?"Your [E.enthrallGender]":"[E.master]")]."), 5) //CUSTOM TRIGGERS @@ -1253,7 +1253,7 @@ E.customTriggers[trigger] = trigger2 log_game("FERMICHEM: [H] has been implanted by [user] with [trigger], triggering [trigger2].") E.mental_capacity -= 5 - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.lewd?"your [E.enthrallGender]":"[E.master]")] whispers you a new trigger."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.client?.prefs.lewdchem?"your [E.enthrallGender]":"[E.master]")] whispers you a new trigger."), 5) else to_chat(user, "Your pet looks at you confused, it seems they don't understand that effect!") else @@ -1310,7 +1310,7 @@ objective = replacetext(lowertext(objective), "suicide", "self-love") message_admins("[H] has been implanted by [user] with the objective [objective].") log_game("FERMICHEM: [H] has been implanted by [user] with the objective [objective] via MKUltra.") - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.lewd?"Your [E.enthrallGender]":"[E.master]")] whispers you a new objective."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.client?.prefs.lewdchem?"Your [E.enthrallGender]":"[E.master]")] whispers you a new objective."), 5) brainwash(H, objective) E.mental_capacity -= 200 else @@ -1324,7 +1324,7 @@ var/mob/living/carbon/human/H = V var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase == 3) - var/instill = stripped_input(user, "Instill an emotion in your [(user.lewd?"Your pet":"listener")].", MAX_MESSAGE_LEN) + var/instill = stripped_input(user, "Instill an emotion in your [(user.client?.prefs.lewdchem?"Your pet":"listener")].", MAX_MESSAGE_LEN) var/customSpan = list("Notice", "Warning", "Hypnophrase", "Love", "Velvet") to_chat(H, "[instill]") E.cooldown += 1 @@ -1337,7 +1337,7 @@ if(E.phase > 1) if(user.ckey == E.enthrallID && user.real_name == E.master.real_name) E.master = user - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.lewd?"You hear the words of your [E.enthrallGender] again!! They're back!!":"You recognise the voice of [E.master].")]"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.client?.prefs.lewdchem?"You hear the words of your [E.enthrallGender] again!! They're back!!":"You recognise the voice of [E.master].")]"), 5) //I dunno how to do state objectives without them revealing they're an antag diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index fd993a00fd..4622b84ac9 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -169,15 +169,17 @@ */ //Preamble +/* /mob/living var/lewd = TRUE +*/ /mob/living/verb/toggle_lewd() set category = "IC" set name = "Toggle Lewdchem" set desc = "Allows you to toggle if you'd like lewd flavour messages." - lewd = !(lewd) - to_chat(usr, "You [(lewd?"will":"no longer")] receive lewdchem messages.") + client?.prefs.lewdchem = !(client?.prefs.lewdchem) + to_chat(usr, "You [(client?.prefs.lewdchem?"will":"no longer")] receive lewdchem messages.") /datum/status_effect/chem/enthrall id = "enthrall" @@ -233,10 +235,10 @@ var/mob/living/carbon/human/H = owner if(H)//Prefs if(!H.canbearoused) - H.lewd = FALSE - var/message = "[(owner.lewd?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]" + H.client?.prefs.lewdchem = FALSE + var/message = "[(owner.client?.prefs.lewdchem?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) - to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") + to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") log_game("FERMICHEM: MKULTRA: Status applied on [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Enthrall attempts") return ..() @@ -282,7 +284,7 @@ resistanceTally /= 2 enthrallTally = 0 SSblackbox.record_feedback("tally", "fermi_chem", 1, "Enthralled to state 2") - if(owner.lewd) + if(owner.client?.prefs.lewdchem) to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") else to_chat(owner, "Your conciousness slips, as you feel more drawn to following [master].") @@ -291,11 +293,11 @@ phase = -1 to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") if(DistApart < 10) - to_chat(master, "[(master.lewd?"Your pet":"Your thrall")] seems to have broken free of your enthrallment!
      ") + to_chat(master, "[(master.client?.prefs.lewdchem?"Your pet":"Your thrall")] seems to have broken free of your enthrallment!
      ") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Thralls broken free") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) - if(owner.lewd) + if(owner.client?.prefs.lewdchem) to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") if (2) //partially enthralled if (enthrallTally > 250) @@ -303,7 +305,7 @@ mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 resistanceTally /= 2 - if(owner.lewd) + if(owner.client?.prefs.lewdchem) to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. else @@ -318,7 +320,7 @@ resistGrowth = 0 to_chat(owner, "You manage to shake some of the effects from your addled mind, however you can still feel yourself drawn towards [master].") if(prob(10)) - if(owner.lewd) + if(owner.client?.prefs.lewdchem) to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (3)//fully entranced if ((resistanceTally >= 200 && withdrawalTick >= 150) || (HAS_TRAIT(M, TRAIT_MINDSHIELD) && (resistanceTally >= 100))) @@ -326,10 +328,10 @@ phase -= 1 resistanceTally = 0 resistGrowth = 0 - to_chat(owner, "The separation from [(owner.lewd?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") + to_chat(owner, "The separation from [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") if(prob(2)) - if(owner.lewd) + if(owner.client?.prefs.lewdchem) to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken if (mental_capacity >= 499 && (owner.getBrainLoss() <=0 || HAS_TRAIT(M, TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra")) @@ -346,13 +348,13 @@ cooldownMsg = FALSE else if (cooldownMsg == FALSE) if(DistApart < 10) - if(master.lewd) + if(master.client?.prefs.lewdchem) to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") else to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") if(get_dist(master, owner) > 10) if(prob(10)) - to_chat(owner, "You feel [(owner.lewd?"a deep NEED to return to your [enthrallGender]":"like you have to return to [master]")].") + to_chat(owner, "You feel [(owner.client?.prefs.lewdchem?"a deep NEED to return to your [enthrallGender]":"like you have to return to [master]")].") M.throw_at(get_step_towards(master,owner), 5, 1) return//If you break the mind of someone, you can't use status effects on them. @@ -384,28 +386,28 @@ if (withdrawal == TRUE)//Your minions are really REALLY needy. switch(withdrawalTick)//denial if(5)//To reduce spam - to_chat(owner, "You are unable to complete [(owner.lewd?"your [enthrallGender]":"[master]")]'s orders without their presence, and any commands and objectives given to you prior are not in effect until you are back with them.") + to_chat(owner, "You are unable to complete [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")]'s orders without their presence, and any commands and objectives given to you prior are not in effect until you are back with them.") if(10 to 35)//Gives wiggle room, so you're not SUPER needy if(prob(5)) - to_chat(owner, "You're starting to miss [(owner.lewd?"your [enthrallGender]":"[master]")].") + to_chat(owner, "You're starting to miss [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")].") if(prob(5)) owner.adjustBrainLoss(0.5) - to_chat(owner, "[(owner.lewd?"[enthrallGender]":"[master]")] will surely be back soon") //denial + to_chat(owner, "[(owner.client?.prefs.lewdchem?"[enthrallGender]":"[master]")] will surely be back soon") //denial if(36) - var/message = "[(owner.lewd?"I feel empty when [enthrallGender]'s not around..":"I miss [master]'s presence")]" + var/message = "[(owner.client?.prefs.lewdchem?"I feel empty when [enthrallGender]'s not around..":"I miss [master]'s presence")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1, message) if(37 to 65)//barganing if(prob(10)) to_chat(owner, "They are coming back, right...?") owner.adjustBrainLoss(1) if(prob(10)) - if(owner.lewd) + if(owner.client?.prefs.lewdchem) to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.") owner.adjustBrainLoss(-1.5) if(66) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") - var/message = "[(owner.lewd?"I feel so lost in this complicated world without [enthrallGender]..":"I have to return to [master]!")]" - to_chat(owner, "You start to feel really angry about how you're not with [(owner.lewd?"your [enthrallGender]":"[master]")]!") + var/message = "[(owner.client?.prefs.lewdchem?"I feel so lost in this complicated world without [enthrallGender]..":"I have to return to [master]!")]" + to_chat(owner, "You start to feel really angry about how you're not with [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")]!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2, message) owner.stuttering += 50 owner.jitteriness += 250 @@ -413,16 +415,16 @@ if(prob(10)) addtimer(CALLBACK(M, /mob/verb/a_intent_change, INTENT_HARM), 2) addtimer(CALLBACK(M, /mob/proc/click_random_mob), 2) - if(owner.lewd) + if(owner.client?.prefs.lewdchem) to_chat(owner, "You are overwhelmed with anger at the lack of [enthrallGender]'s presence and suddenly lash out!") else to_chat(owner, "You are overwhelmed with anger and suddenly lash out!") owner.adjustBrainLoss(1) if(90) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") - var/message = "[(owner.lewd?"Where are you [enthrallGender]??!":"I need to find [master]!")]" + var/message = "[(owner.client?.prefs.lewdchem?"Where are you [enthrallGender]??!":"I need to find [master]!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing3", /datum/mood_event/enthrallmissing3, message) - if(owner.lewd) + if(owner.client?.prefs.lewdchem) to_chat(owner, "You need to find your [enthrallGender] at all costs, you can't hold yourself back anymore!") else to_chat(owner, "You need to find [master] at all costs, you can't hold yourself back anymore!") @@ -435,14 +437,14 @@ M.hallucination += 10 if(101) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") - var/message = "[(owner.lewd?"I'm all alone, It's so hard to continute without [enthrallGender]...":"I really need to find [master]!!!")]" + var/message = "[(owner.client?.prefs.lewdchem?"I'm all alone, It's so hard to continute without [enthrallGender]...":"I really need to find [master]!!!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4, message) - to_chat(owner, "You can hardly find the strength to continue without [(owner.lewd?"your [enthrallGender]":"[master]")].") + to_chat(owner, "You can hardly find the strength to continue without [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")].") if(102 to 140) //depression 2, revengeance if(prob(20)) owner.Stun(50) owner.emote("cry")//does this exist? - if(owner.lewd) + if(owner.client?.prefs.lewdchem) to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.") else to_chat(owner, "You are overwheled with withdrawl from [master].") @@ -455,7 +457,7 @@ if(prob(15)) deltaResist += 5 if(prob(20)) - if(owner.lewd) + if(owner.client?.prefs.lewdchem) to_chat(owner, "Maybe you'll be okay without your [enthrallGender].") else to_chat(owner, "You feel your mental functions slowly begin to return.") @@ -488,7 +490,7 @@ else if(status == "charge") ADD_TRAIT(owner, TRAIT_GOTTAGOFAST, "MKUltra") status = "charged" - if(master.lewd) + if(master.client?.prefs.lewdchem) to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") else to_chat(owner, "[master]'s command fills you with a burst of speed!") @@ -527,7 +529,7 @@ cooldownMsg = FALSE else if (cooldownMsg == FALSE) if(DistApart < 10) - if(master.lewd) + if(master.client?.prefs.lewdchem) to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") else to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") @@ -597,7 +599,7 @@ //wah intensifies wah-rks else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - if (HAS_TRAIT(C, TRAIT_NYMPHO) && C.lewd) + if (HAS_TRAIT(C, TRAIT_NYMPHO) && C.client?.prefs.lewdchem) if (C.getArousalLoss() > 80) C.mob_climax(forced_climax=TRUE) C.SetStun(10)//We got your stun effects in somewhere, Kev. @@ -638,20 +640,20 @@ if (status == "Sleeper" || phase == 0) return else if (phase == 4) - if(owner.lewd) + if(owner.client?.prefs.lewdchem) to_chat(owner, "Your mind is too far gone to even entertain the thought of resisting. Unless you can fix the brain damage, you won't be able to break free of your [enthrallGender]'s control.") else to_chat(owner, "Your brain is too overwhelmed with from the high volume of chemicals in your system, rendering you unable to resist, unless you can fix the brain damage.") return else if (phase == 3 && withdrawal == FALSE) - if(owner.lewd) + if(owner.client?.prefs.lewdchem) to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance. If you get split up from them, then you might be able to entertain the idea of resisting.") else to_chat(owner, "You are unable to resist [master] in your current state. If you get split up from them, then you might be able to resist.") return else if (status == "Antiresist")//If ordered to not resist; resisting while ordered to not makes it last longer, and increases the rate in which you are enthralled. if (statusStrength > 0) - if(owner.lewd) + if(owner.client?.prefs.lewdchem) to_chat(owner, "The order from your [enthrallGender] to give in is conflicting with your attempt to resist, drawing you deeper into trance! You'll have to wait a bit before attemping again, lest your attempts become frustrated again.") else to_chat(owner, "The order from your [master] to give in is conflicting with your attempt to resist. You'll have to wait a bit before attemping again, lest your attempts become frustrated again.") diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm index f757123b45..1caa4cfed7 100644 --- a/modular_citadel/code/modules/client/preferences.dm +++ b/modular_citadel/code/modules/client/preferences.dm @@ -54,6 +54,6 @@ datum/preferences/copy_to(mob/living/carbon/human/character, icon_updates = 1) character.give_genitals(TRUE) character.flavor_text = features["flavor_text"] //Let's update their flavor_text at least initially character.canbearoused = arousable - character.lewd = lewdchem + character.client?.prefs.lewdchem = lewdchem if(icon_updates) character.update_genitals() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 5cda4d4b24..95843fe51f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -183,7 +183,7 @@ Creating a chem with a low purity will make you permanently fall in love with so E.enthrallID = creatorID E.enthrallGender = creatorGender E.master = get_mob_by_key(creatorID) - to_chat(M, to_chat(M, "Your aldled, plastic, mind bends under the chemical influence of a new [(M.lewd?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.")) //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE. + to_chat(M, to_chat(M, "Your aldled, plastic, mind bends under the chemical influence of a new [(M.client?.prefs.lewdchem?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.")) //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE. return if(purity < 0.5)//Impure chems don't function as you expect return @@ -283,7 +283,7 @@ Creating a chem with a low purity will make you permanently fall in love with so E.master = creator else E = M.has_status_effect(/datum/status_effect/chem/enthrall) - if(M.lewd) + if(M.client?.prefs.lewdchem) to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side and protect them at all costs.") else to_chat(M, "The might volume of chemicals in your system overwhelms your mind, and you suddenly agree with what they've been saying. Your highest priority is now to stay by their side and protect them at all costs.") @@ -325,7 +325,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(!love) return M.apply_status_effect(STATUS_EFFECT_INLOVE, love) - to_chat(M, "[(M.lewd?"":"")][(M.lewd?"You develop a sudden crush on [love], your heart beginning to race as you look upon them with new eyes.":"You suddenly feel like making friends with [love].")] You feel strangely drawn towards them.") + to_chat(M, "[(M.client?.prefs.lewdchem?"":"")][(M.client?.prefs.lewdchem?"You develop a sudden crush on [love], your heart beginning to race as you look upon them with new eyes.":"You suddenly feel like making friends with [love].")] You feel strangely drawn towards them.") log_game("FERMICHEM: [M] ckey: [M.key] has temporarily bonded with [love] ckey: [love.key]") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have bonded") else @@ -340,7 +340,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(prob(10)) M.Stun(5) M.emote("whimper")//does this exist? - to_chat(M, "[(M.lewd?"":"")] You're overcome with a desire to see [love].") + to_chat(M, "[(M.client?.prefs.lewdchem?"":"")] You're overcome with a desire to see [love].") M.adjustBrainLoss(0.5)//I found out why everyone was so damaged! ..() @@ -350,7 +350,7 @@ Creating a chem with a low purity will make you permanently fall in love with so M.remove_status_effect(STATUS_EFFECT_INLOVE) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") - to_chat(M, "[(M.lewd?"":"")]Your feelings for [love] suddenly vanish!") + to_chat(M, "[(M.client?.prefs.lewdchem?"":"")]Your feelings for [love] suddenly vanish!") log_game("FERMICHEM: [M] ckey: [M.key] is no longer in temp bond") ..() @@ -358,7 +358,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(Lover.has_status_effect(STATUS_EFFECT_INLOVE)) to_chat(Lover, "You are already fully devoted to someone else!") return - to_chat(Lover, "[(Lover.lewd?"":"")]You develop a deep and sudden bond with [Love][(Lover.lewd?", your heart beginning to race as your mind filles with thoughts about them.":".")] You are determined to keep them safe and happy, and feel drawn towards them.") + to_chat(Lover, "[(Lover.client?.prefs.lewdchem?"":"")]You develop a deep and sudden bond with [Love][(Lover.client?.prefs.lewdchem?", your heart beginning to race as your mind filles with thoughts about them.":".")] You are determined to keep them safe and happy, and feel drawn towards them.") if(Lover.mind) Lover.mind.store_memory("You are in love with [Love].") Lover.faction |= "[REF(Love)]" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index 8fac5103fb..cf00c94ad2 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -13,16 +13,16 @@ /datum/reagent/fermi/yamerol/on_mob_life(mob/living/carbon/C) var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) - message_admins("Yamero!") + if(T) T.adjustTongueLoss(C, -2) - message_admins("Yamero tongue!") + if(L) - message_admins("Yamero lungs!") + L.adjustLungLoss(-5, C) C.adjustOxyLoss(-2) else - message_admins("Yamero no lungs!") + C.adjustOxyLoss(-10) ..() @@ -38,7 +38,7 @@ else T = new() T.Insert(C) - to_chat(M, "You feel your tongue reform in your mouth.") + to_chat(C, "You feel your tongue reform in your mouth.") holder.remove_reagent(src.id, "10") else if((oT.name == "fluffy tongue") && (purity == 1)) @@ -51,13 +51,13 @@ oT.Remove(C) qdel(oT) T.Insert(C) - to_chat(M, "You feel your tongue.... unfluffify...?") + to_chat(C, "You feel your tongue.... unfluffify...?") holder.remove_reagent(src.id, "10") if(!C.getorganslot(ORGAN_SLOT_LUNGS)) var/obj/item/organ/lungs/L = new() L.Insert(C) - to_chat(M, "You feel your lungs reform in your chest.") + to_chat(C, "You feel your lungs reform in your chest.") holder.remove_reagent(src.id, "10") @@ -74,15 +74,15 @@ /datum/reagent/fermi/yamerol_tox/on_mob_life(mob/living/carbon/C) var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) - message_admins("Yameroe!") + if(T) - message_admins("Yamero tongue!") + T.adjustTongueLoss(C, 2) if(L) - message_admins("Yameroe lungs!") + L.adjustLungLoss(5, C) C.adjustOxyLoss(2) else - message_admins("Yameroe no lungs!") + C.adjustOxyLoss(10) ..() From 381e12f04a395d6413df0f7e89992e135fd79f76 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 2 Jul 2019 22:52:45 +0100 Subject: [PATCH 343/608] Fixing message_admins. --- code/modules/mob/living/living.dm | 8 +++----- modular_citadel/code/datums/status_effects/chems.dm | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 8ab8991320..57a3f8d5e4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -318,16 +318,14 @@ visible_message("[src] points at [A].", "You point at [A].") return TRUE -/mob/living/verb/succumb(whispered as num) +/mob/living/verb/succumb(whispered as null) set name = "Succumb" set category = "IC" - message_admins("succumb pressed") if(src.has_status_effect(/datum/status_effect/chem/enthrall)) - message_admins("status found") var/datum/status_effect/chem/enthrall/E = src.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase < 3) - message_admins("increasing phase") - E.phase += 1 + E.enthrallTally += 50 + to_chat(src, "You give into [E.master]'s influence'.") if (InCritical()) log_message("Has [whispered ? "whispered his final words" : "succumbed to death"] while in [InFullCritical() ? "hard":"soft"] critical with [round(health, 0.1)] points of health!", LOG_ATTACK) adjustOxyLoss(health - HEALTH_THRESHOLD_DEAD) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 4622b84ac9..2fb5500c42 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -178,8 +178,8 @@ set category = "IC" set name = "Toggle Lewdchem" set desc = "Allows you to toggle if you'd like lewd flavour messages." - client?.prefs.lewdchem = !(client?.prefs.lewdchem) - to_chat(usr, "You [(client?.prefs.lewdchem?"will":"no longer")] receive lewdchem messages.") + client.prefs.lewdchem = !(client.prefs.lewdchem) + to_chat(usr, "You [(client.prefs.lewdchem?"will":"no longer")] receive lewdchem messages.") /datum/status_effect/chem/enthrall id = "enthrall" From 161c5955f2a410d5c00b5e8c647138cd1f653102 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 2 Jul 2019 23:06:46 +0100 Subject: [PATCH 344/608] Removed tastes in buffers. --- .../code/modules/reagents/chemistry/reagents/fermi_reagents.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 9a3ae25b25..a028072dc0 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -341,7 +341,6 @@ name = "Acidic buffer" id = "acidic_buffer" description = "This reagent will consume itself and move the pH of a beaker towards acidity when added to another." - taste_description = "an acidy sort of taste, blech." color = "#fbc314" pH = 0 @@ -362,7 +361,6 @@ name = "Basic buffer" id = "basic_buffer" description = "This reagent will consume itself and move the pH of a beaker towards alkalinity when added to another." - taste_description = "an soapy sort of taste, blech." color = "#3853a4" pH = 14 From 5f72277549281a1f8e31702a4c1787619e80ff9d Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 2 Jul 2019 23:24:35 +0100 Subject: [PATCH 345/608] Succumb tweak. Ready to merge. --- code/modules/mob/living/carbon/human/whisper.dm | 2 +- code/modules/mob/living/living.dm | 9 ++++----- code/modules/mob/living/say.dm | 2 +- modular_citadel/code/datums/status_effects/chems.dm | 1 + 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index 65a4c5d33f..51c7ad9d25 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -88,4 +88,4 @@ AM.Hear(rendered, src, language, message, , spans) if(critical) //Dying words. - succumb(1) + succumb() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 57a3f8d5e4..d3f244b0c3 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -318,20 +318,19 @@ visible_message("[src] points at [A].", "You point at [A].") return TRUE -/mob/living/verb/succumb(whispered as null) +/mob/living/verb/succumb() set name = "Succumb" set category = "IC" if(src.has_status_effect(/datum/status_effect/chem/enthrall)) var/datum/status_effect/chem/enthrall/E = src.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase < 3) E.enthrallTally += 50 - to_chat(src, "You give into [E.master]'s influence'.") + to_chat(src, "You give into [E.master]'s influence.") if (InCritical()) - log_message("Has [whispered ? "whispered his final words" : "succumbed to death"] while in [InFullCritical() ? "hard":"soft"] critical with [round(health, 0.1)] points of health!", LOG_ATTACK) + log_message("Has succumbed to death while in [InFullCritical() ? "hard":"soft"] critical with [round(health, 0.1)] points of health!", LOG_ATTACK) adjustOxyLoss(health - HEALTH_THRESHOLD_DEAD) updatehealth() - if(!whispered) - to_chat(src, "You have given up life and succumbed to death.") + to_chat(src, "You have given up life and succumbed to death.") death() diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 86562c2e11..b0383c068f 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -208,7 +208,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( send_speech(message, message_range, src, bubble_type, spans, language, message_mode) if(succumbed) - succumb(1) + succumb() to_chat(src, compose_message(src, language, message, , spans, message_mode)) return 1 diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 2fb5500c42..64cb2b784e 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -310,6 +310,7 @@ to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death.
      ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. else to_chat(owner, "You are unable to put up a resistance any longer, and now are under the influence of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot follow [master] in death. ") + to_chat(master, "Your [(master.client?.prefs.lewdchem?"pet":"follower")] [owner] appears to have fully fallen under your sway.") ADD_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") //IMPORTANT log_game("FERMICHEM: MKULTRA: Status on [owner] ckey: [owner.key] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].") SSblackbox.record_feedback("tally", "fermi_chem", 1, "thralls fully enthralled.") From e940cc7ab764304c9d5cb7583fe6d79f135a065b Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 2 Jul 2019 23:45:32 +0100 Subject: [PATCH 346/608] Mild concern over strength of chem. --- .../code/modules/reagents/chemistry/reagents/healing.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index cf00c94ad2..8900716b49 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -77,12 +77,11 @@ if(T) - T.adjustTongueLoss(C, 2) + T.adjustTongueLoss(C, 1) if(L) - L.adjustLungLoss(5, C) + L.adjustLungLoss(2.5, C) C.adjustOxyLoss(2) else - C.adjustOxyLoss(10) ..() From e34c6265e7b9328cbd3daebad5ee255bd5d20a7b Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 2 Jul 2019 23:46:58 +0100 Subject: [PATCH 347/608] Tidying. --- .../modules/reagents/chemistry/reagents/healing.dm | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index 8900716b49..c1e5a1d494 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -6,9 +6,9 @@ color = "#68e83a" pH = 8.6 overdose_threshold = 35 - ImpureChem = "yamerol_tox" //If you make an inpure chem, it stalls growth + ImpureChem = "yamerol_tox" InverseChemVal = 0.3 - InverseChem = "yamerol_tox" //At really impure vols, it just becomes 100% inverse + InverseChem = "yamerol_tox" /datum/reagent/fermi/yamerol/on_mob_life(mob/living/carbon/C) var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE) @@ -16,13 +16,10 @@ if(T) T.adjustTongueLoss(C, -2) - if(L) - L.adjustLungLoss(-5, C) C.adjustOxyLoss(-2) else - C.adjustOxyLoss(-10) ..() @@ -32,7 +29,6 @@ if(current_cycle > 10) if(!C.getorganslot(ORGAN_SLOT_TONGUE)) var/obj/item/organ/tongue/T - if(C.dna && C.dna.species && C.dna.species.mutanttongue) T = new C.dna.species.mutanttongue() else @@ -76,10 +72,8 @@ var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) if(T) - T.adjustTongueLoss(C, 1) if(L) - L.adjustLungLoss(2.5, C) C.adjustOxyLoss(2) else From cd645626c032b016db43aa365aa466b87c37e4b8 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 3 Jul 2019 02:11:18 +0100 Subject: [PATCH 348/608] expasion OD increase, corrected names and inverted listing of fermichems --- .../code/modules/reagents/chemistry/reagents/SDGF.dm | 3 +++ .../modules/reagents/chemistry/reagents/eigentstasium.dm | 1 + .../code/modules/reagents/chemistry/reagents/enlargement.dm | 6 ++++-- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 5 +++++ .../code/modules/reagents/chemistry/reagents/healing.dm | 1 + .../code/modules/reagents/reagent container/hypovial.dm | 4 ++-- 6 files changed, 16 insertions(+), 4 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index 1f50c2669b..574ee7794a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -56,6 +56,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ImpureChem = "SDGFtox" InverseChemVal = 0.5 InverseChem = "SDZF" + can_synth = TRUE //Main SDGF chemical /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. @@ -213,6 +214,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING id = "SDGFtox" description = "A chem that makes a certain chemcat angry at you if you're reading this, how did you get this???"//i.e. tell me please, figure it's a good way to get pinged for bugfixes. metabolization_rate = 1 + can_synth = FALSE /datum/reagent/fermi/SDGFtox/on_mob_life(mob/living/carbon/M)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good) M.blood_volume -= 10 @@ -227,6 +229,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING color = "#a502e0" // rgb: 96, 0, 255 metabolization_rate = 0.5 * REAGENTS_METABOLISM var/startHunger + can_synth = TRUE /datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. switch(current_cycle)//Pretends to be normal diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index e905f7b257..c6bc537ed3 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -29,6 +29,7 @@ var/mob/living/carbon/fermi_Tclone = null var/teleBool = FALSE pH = 3.7 + can_synth = TRUE /datum/reagent/fermi/eigenstate/on_new(list/data) location_created = data.["location_created"] diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 498bb8cc5f..70283a7edc 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -24,7 +24,7 @@ description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." color = "#E60584" // rgb: 96, 0, 255 taste_description = "a milky ice cream like flavour." - overdose_threshold = 12 + overdose_threshold = 17 metabolization_rate = 0.25 ImpureChem = "BEsmaller" //If you make an inpure chem, it stalls growth InverseChemVal = 0.35 @@ -165,6 +165,7 @@ metabolization_rate = 0.25 description = "A medicine used to treat organomegaly in a patient's breasts." var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) + can_synth = TRUE /datum/reagent/fermi/BEsmaller_hypo/on_mob_add(mob/living/carbon/M) . = ..() @@ -202,7 +203,7 @@ description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? dumb color = "#888888" // This is greyish..? taste_description = "chinese dragon powder" - overdose_threshold = 12 //ODing makes you male and removes female genitals + overdose_threshold = 17 //ODing makes you male and removes female genitals metabolization_rate = 0.5 ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth InverseChemVal = 0.35 @@ -329,6 +330,7 @@ taste_description = "chinese dragon powder" description = "A medicine used to treat organomegaly in a patient's penis." metabolization_rate = 0.5 + can_synth = TRUE /datum/reagent/fermi/PEsmaller_hypo/on_mob_add(mob/living/carbon/M) . = ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index a028072dc0..c2d4e7fbc8 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -5,6 +5,7 @@ name = "Fermi" //This should never exist, but it does so that it can exist in the case of errors.. id = "fermi" taste_description = "affection and love!" + can_synth = FALSE //This should process fermichems to find out how pure they are and what effect to do. /datum/reagent/fermi/on_mob_add(mob/living/carbon/M, amount) @@ -77,6 +78,7 @@ overdose_threshold = 25 DoNotSplit = TRUE pH = 4 + can_synth = TRUE /datum/reagent/fermi/hatmium/on_mob_add(mob/living/carbon/human/M) @@ -124,6 +126,7 @@ DoNotSplit = TRUE pH = 5 var/obj/item/organ/tongue/T + can_synth = TRUE /datum/reagent/fermi/furranium/on_mob_life(mob/living/carbon/M) @@ -343,6 +346,7 @@ description = "This reagent will consume itself and move the pH of a beaker towards acidity when added to another." color = "#fbc314" pH = 0 + can_synth = TRUE //Consumes self on addition and shifts pH /datum/reagent/fermi/acidic_buffer/on_new(datapH) @@ -363,6 +367,7 @@ description = "This reagent will consume itself and move the pH of a beaker towards alkalinity when added to another." color = "#3853a4" pH = 14 + can_synth = TRUE /datum/reagent/fermi/basic_buffer/on_new(datapH) data = datapH diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index c1e5a1d494..48eae07aa2 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -9,6 +9,7 @@ ImpureChem = "yamerol_tox" InverseChemVal = 0.3 InverseChem = "yamerol_tox" + can_synth = TRUE /datum/reagent/fermi/yamerol/on_mob_life(mob/living/carbon/C) var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE) diff --git a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm index d313e4061a..c1e0d6ff01 100755 --- a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm +++ b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm @@ -138,12 +138,12 @@ comes_with = list("tricordrazine" = 30) /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction - name = "pink hypovial (breast reduction)" + name = "pink hypovial (breast treatment)" icon_state = "hypovial-pink" comes_with = list("BEsmaller_hypo" = 30) /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction - name = "pink hypovial (penis reduction)" + name = "pink hypovial (penis treatment)" icon_state = "hypovial-pink" comes_with = list("PEsmaller_hypo" = 30) From 42edafc3e68dfbd49526e1f0b04d3e17c80fc105 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 3 Jul 2019 02:13:18 +0100 Subject: [PATCH 349/608] OOPS --- .../code/modules/reagents/chemistry/recipes/fermi.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 7dca90d707..6756fc30a5 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -424,7 +424,7 @@ name = "Ethyl Ethanoate buffer" id = "basic_buffer" results = list("basic_buffer" = 1.5) - required_reagents = list("acidic_buffer" = 0.5, "ethanol" = 0.5, , "water" = 0.5) + required_reagents = list("acidic_buffer" = 0.5, "ethanol" = 0.5, "water" = 0.5) required_catalysts = list("sacid" = 1) //vagely acetic //FermiChem vars: OptimalTempMin = 250 From bccd3e42b613acc3f5ac7ae872401cac959f8579 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 3 Jul 2019 19:53:38 +0100 Subject: [PATCH 350/608] Mild tweak --- .../code/modules/reagents/chemistry/recipes/fermi.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 6756fc30a5..a673205482 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -426,11 +426,11 @@ results = list("basic_buffer" = 1.5) required_reagents = list("acidic_buffer" = 0.5, "ethanol" = 0.5, "water" = 0.5) required_catalysts = list("sacid" = 1) //vagely acetic - //FermiChem vars: + //FermiChem vars:x OptimalTempMin = 250 OptimalTempMax = 500 ExplodeTemp = 9999 //check to see overflow doesn't happen! - OptimalpHMin = 6 + OptimalpHMin = 5 OptimalpHMax = 12 ReactpHLim = 0 //CatalystFact = 0 //To do 1 From ad37ec08b2a1876dc6abff95309eebae2ce352e3 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 4 Jul 2019 23:24:18 +0100 Subject: [PATCH 351/608] Removing slimejelly req from feedback. --- code/modules/mob/living/carbon/human/examine.dm | 7 +++++++ code/modules/reagents/chemistry/holder.dm | 4 +++- .../code/modules/reagents/chemistry/recipes/fermi.dm | 8 ++++---- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index b6287bdcfa..9a2f6255cd 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -304,6 +304,13 @@ msg += "" + var/obj/item/organ/vocal_cords/Vc = getorganslot(ORGAN_SLOT_VOICE) + if(Vc) + if (Vc.name == "Velvet chords") + if(user.client?.prefs.lewdchem) + msg += "You feel your chords resonate looking at them." + + if(!appears_dead) if(stat == UNCONSCIOUS) msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n" diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6a30a6eef5..2bca1fc031 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -494,6 +494,8 @@ //Standard reaction mechanics: else + if (C.FermiChem == TRUE)//Just to make sure + return 0 for(var/B in cached_required_reagents) // multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01)) @@ -810,7 +812,7 @@ if(!isnum(amount) || !amount) return FALSE - if(amount <= 0) + if(amount <= 0.00) return FALSE var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index a673205482..59037d80c4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -103,7 +103,7 @@ name = "Synthetic-derived growth factor" id = "SDGF" results = list("SDGF" = 0.3) - required_reagents = list("stable_plasma" = 0.15, "slimejelly" = 0.15, "uranium" = 0.15, "synthflesh" = 0.15, "blood" = 0.15) + required_reagents = list("stable_plasma" = 0.15, "clonexadone" = 0.15, "uranium" = 0.15, "synthflesh" = 0.15) mix_message = "the reaction gives off a blorble!" required_temp = 1 //FermiChem vars: @@ -318,7 +318,7 @@ name = "Hat growth serum" id = "hatmium" results = list("hatmium" = 0.5) - required_reagents = list("whiskey" = 0.1, "nutriment" = 0.3, "cooking_oil" = 0.2, "iron" = 0.1, "gold" = 0.3) + required_reagents = list("ethanol" = 0.1, "nutriment" = 0.3, "cooking_oil" = 0.2, "iron" = 0.1, "gold" = 0.3) //mix_message = "" //FermiChem vars: OptimalTempMin = 500 @@ -456,8 +456,8 @@ name = "secretcatchem" id = "secretcatchem" results = list("secretcatchem" = 0.5) - required_reagents = list("stable_plasma" = 0.1, "sugar" = 0.1, "cream" = 0.1, "blood" = 0.1, "slimejelly" = 0.1)//Yes this will make a plushie if you don't lucky guess. It'll eat all your reagents too. - required_catalysts = list("felinidmutationtoxin" = 1) + required_reagents = list("stable_plasma" = 0.1, "sugar" = 0.1, "cream" = 0.1, "clonexadone" = 0.1)//Yes this will make a plushie if you don't lucky guess. It'll eat all your reagents too. + required_catalysts = list("SDGF" = 1) required_temp = 600 mix_message = "the reaction gives off a meow!" mix_sound = "modular_citadel/sound/voice/merowr.ogg" From 7fa072030b5b155a9295d4870fed2e5f6467fc97 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 4 Jul 2019 23:44:13 +0100 Subject: [PATCH 352/608] Update to manage prefs. (and so it doesn't do it the wrong way round.) --- code/modules/mob/living/carbon/human/examine.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 9a2f6255cd..2fa98c59de 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -304,11 +304,11 @@ msg += "" - var/obj/item/organ/vocal_cords/Vc = getorganslot(ORGAN_SLOT_VOICE) + var/obj/item/organ/vocal_cords/Vc = user.getorganslot(ORGAN_SLOT_VOICE) if(Vc) - if (Vc.name == "Velvet chords") - if(user.client?.prefs.lewdchem) - msg += "You feel your chords resonate looking at them." + if(istype(Vc, /obj/item/organ/vocal_cords/velvet)) + if(client?.prefs.lewdchem) + msg += "You feel your chords resonate looking at them.\n" if(!appears_dead) From d7ac87c99b6a862365c72570be3693739076d431 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 6 Jul 2019 17:04:24 +0100 Subject: [PATCH 353/608] Tweaks --- modular_citadel/code/datums/status_effects/chems.dm | 2 +- .../code/modules/reagents/chemistry/reagents/SDGF.dm | 2 ++ .../code/modules/reagents/chemistry/reagents/fermi_reagents.dm | 3 +++ .../code/modules/reagents/chemistry/recipes/fermi.dm | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 64cb2b784e..5f2c8a47cc 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -300,7 +300,7 @@ if(owner.client?.prefs.lewdchem) to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") if (2) //partially enthralled - if (enthrallTally > 250) + if (enthrallTally > 200) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index 574ee7794a..b1c4bbffcc 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -45,6 +45,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/playerClone = FALSE var/unitCheck = FALSE metabolization_rate = 0.5 * REAGENTS_METABOLISM + taste_description = "a weird chemical fleshy flavour" //var/datum/status_effect/chem/SDGF/candidates/candies var/list/candies = list() //var/polling = FALSE @@ -58,6 +59,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING InverseChem = "SDZF" can_synth = TRUE + //Main SDGF chemical /datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone. //Setup clone diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index c2d4e7fbc8..b2ede684a4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -223,6 +223,9 @@ N.nanite_volume = -2 ..() +/datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume) + O.emp_act(EMP_HEAVY) + /datum/reagent/fermi/nanite_b_goneTox name = "Naninte bain" id = "nanite_b_goneTox" diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 59037d80c4..6b4df94b88 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -489,7 +489,7 @@ RateUpLim += (rand(1, 1000)/100) PurityMin += (rand(-1, 1)/10) var/additions = list("aluminium", "silver", "gold", "plasma", "silicon", "bluespace", "uranium", "milk") - required_reagents[pick(additions)] = rand(1, 5)//weird + required_reagents[pick(additions)] = rand(0.1, 0.5)//weird /datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom) SSblackbox.record_feedback("tally", "catgirlium")//log From 6db1a1576dff543f05d08174b83c3a73789a250c Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 6 Jul 2019 18:08:07 +0100 Subject: [PATCH 354/608] Rewrote explosion code. --- .../code/datums/mood_events/chem_events.dm | 10 +++++++--- .../modules/reagents/chemistry/reagents/MKUltra.dm | 12 +++++++----- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index 55e0c1b617..c496a0fa27 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -48,8 +48,12 @@ /datum/mood_event/InLove mood_change = 10 - description = "I'm in love!!\n" + +/datum/mood_event/InLove/add_effects(message) + description = "[message]\n" /datum/mood_event/MissingLove - mood_change = -20 - description = "I can't keep my crush off my mind, I need to see them again!\n" + mood_change = -10 + +/datum/mood_event/MissingLove/add_effects(message) + description = "[message]\n" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 95843fe51f..f32c6b6431 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -317,7 +317,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(!M.has_status_effect(STATUS_EFFECT_INLOVE)) var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers for(var/victim in seen) - if((victim == /mob/living/simple_animal/pet/) || (victim == M) || (M.stat == DEAD) || (!isliving(victim))) + if((istype(victim, /mob/living/simple_animal/pet/)) || (victim == M) || (M.stat == DEAD) || (!isliving(victim))) seen = seen - victim if(seen.len == 0) return @@ -332,13 +332,15 @@ Creating a chem with a low purity will make you permanently fall in love with so if(get_dist(M, love) < 8) if(HAS_TRAIT(M, TRAIT_NYMPHO)) //Add this back when merged/updated. M.adjustArousalLoss(5) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove) + var/message = "[(M.client?.prefs.lewdchem?"I'm next to my crush..! Eee!":"I'm making friends with [love]!")]" + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove, message) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") else - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove) + var/message = "[(M.client?.prefs.lewdchem?"I can't keep my crush off my mind, I need to see them again!":"I really want to make friends with [love]!")]" + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove, message) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") - if(prob(10)) - M.Stun(5) + if(prob(5)) + M.Stun(10) M.emote("whimper")//does this exist? to_chat(M, "[(M.client?.prefs.lewdchem?"":"")] You're overcome with a desire to see [love].") M.adjustBrainLoss(0.5)//I found out why everyone was so damaged! From e84fc73bed39d660fc8bd2382063fc0556ee9c99 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 7 Jul 2019 05:59:21 +0100 Subject: [PATCH 355/608] Fixed buffers, SDGF, icons and spelling. --- code/modules/surgery/organs/vocal_cords.dm | 5 ++- icons/obj/chemical.dmi | Bin 47569 -> 45486 bytes .../code/datums/status_effects/chems.dm | 31 +++++++++++------- .../reagents/chemistry/reagents/SDGF.dm | 17 +++++++++- .../chemistry/reagents/fermi_reagents.dm | 10 +++--- 5 files changed, 45 insertions(+), 18 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index cc37c19b64..ef1658265a 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1068,6 +1068,9 @@ else if((findtext(message, forget_words))) for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) + if(E.phase == 4) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You're unable to forget about [(C.client?.prefs.lewdchem?"the dominating presence of [E.enthrallGender]":"[E.master]")]!"), 5) + continue addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!"), 5) C.Sleeping(50) switch(E.phase) @@ -1408,7 +1411,7 @@ L.SetKnockdown(0) L.SetUnconscious(0) //i said get up i don't care if you're being tased E.cooldown += 10 //This could be really strong - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You jump to your feel from sheer willpower!"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You jump to your feet from sheer willpower!"), 5) //PACIFY else if(findtext(message, pacify_words)) diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 93daa6149ed062a90b39df21047102ab1fccd68d..b63e9344f193e4988976a7f65f0ff10b1f7fd3a7 100644 GIT binary patch literal 45486 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

      !oCfHf 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 literal 47569 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 shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") to_chat(fermi_Clone, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") fermi_Clone = null owner.remove_status_effect(src) + */ ..() +/datum/status_effect/chem/SGDF/on_remove(mob/living/carbon/M) + log_game("FERMICHEM: SGDF mind shift applied. [owner] is now playing as their clone and should not have memories after their clone split (look up SGDF status applied). ID: [owner.key]") + originalmind.transfer_to(fermi_Clone) + to_chat(owner, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") + to_chat(M, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") + fermi_Clone = null + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /datum/status_effect/chem/breast_enlarger @@ -247,7 +254,7 @@ var/mob/living/carbon/M = owner //chem calculations - if(!owner.reagents.has_reagent("enthrall")) + if(!owner.reagents.has_reagent("enthrall") || !owner.reagents.has_reagent("enthrallTest")) if (phase < 3 && phase != 0) deltaResist += 3//If you've no chem, then you break out quickly if(prob(10)) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index b1c4bbffcc..62a78c6567 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -161,7 +161,22 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE M.next_move_modifier -= 4 to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") - M.apply_status_effect(/datum/status_effect/chem/SGDF) + + //clone + var/typepath = M.type + var/mob/living/fermi_Clone = new typepath(M.loc) + var/mob/living/carbon/C = fermi_Clone + + if(istype(C) && istype(M)) + C.real_name = M.real_name + M.dna.transfer_identity(C, transfer_SE=1) + C.updateappearance(mutcolor_update=1) + C.apply_status_effect(/datum/status_effect/chem/SGDF) + var/datum/status_effect/chem/SGDF/S = C.has_status_effect(/datum/status_effect/chem/SGDF) + S.original = M + S.originalmind = M.mind + S.status_set = TRUE + log_game("FERMICHEM: [M] ckey: [M.key] has created a mindless clone of themselves") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Braindead clones made") if(87 to INFINITY) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index b2ede684a4..6f040ee511 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -350,18 +350,19 @@ color = "#fbc314" pH = 0 can_synth = TRUE + addProc = TRUE //Consumes self on addition and shifts pH /datum/reagent/fermi/acidic_buffer/on_new(datapH) data = datapH if(LAZYLEN(holder.reagent_list) == 1) return - holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume*3)))/(holder.total_volume + (volume*3)) + holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume)) var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The beaker fizzes as the pH changes!") playsound(get_turf(holder.my_atom), 'sound/FermiChem/bufferadd.ogg', 50, 1) - holder.remove_reagent(id, volume) + holder.remove_reagent(id, volume, ignore_pH = TRUE) ..() /datum/reagent/fermi/basic_buffer @@ -371,17 +372,18 @@ color = "#3853a4" pH = 14 can_synth = TRUE + addProc = TRUE /datum/reagent/fermi/basic_buffer/on_new(datapH) data = datapH if(LAZYLEN(holder.reagent_list) == 1) return - holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume*3)))/(holder.total_volume + (volume*3)) + holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume)) var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The beaker froths as the pH changes!") playsound(get_turf(holder.my_atom), 'sound/FermiChem/bufferadd.ogg', 50, 1) - holder.remove_reagent(id, volume) + holder.remove_reagent(id, volume, ignore_pH = TRUE) ..() //Turns you into a cute catto while it's in your system. From 9f843f299d068fc869dfe9683a2f61ddcfd26b15 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 7 Jul 2019 06:02:34 +0100 Subject: [PATCH 356/608] BUFFERSSSSSS ARGH --- .../code/modules/reagents/chemistry/reagents/fermi_reagents.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 6f040ee511..c056fec66e 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -350,7 +350,6 @@ color = "#fbc314" pH = 0 can_synth = TRUE - addProc = TRUE //Consumes self on addition and shifts pH /datum/reagent/fermi/acidic_buffer/on_new(datapH) @@ -372,7 +371,6 @@ color = "#3853a4" pH = 14 can_synth = TRUE - addProc = TRUE /datum/reagent/fermi/basic_buffer/on_new(datapH) data = datapH From 30322f11638dd96d83bca7880dad82327cd5d98f Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 7 Jul 2019 06:29:55 +0100 Subject: [PATCH 357/608] TO BE TESTED --- modular_citadel/code/datums/status_effects/chems.dm | 13 ++++--------- .../reagents/chemistry/reagents/fermi_reagents.dm | 2 -- .../modules/reagents/chemistry/recipes/fermi.dm | 2 ++ 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index b0c16152a2..10756eefd7 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -20,15 +20,10 @@ if(original.stat == DEAD || original == null || !original) if((fermi_Clone && fermi_Clone.stat != DEAD) || (fermi_Clone == null)) if(originalmind) - owner.remove_status_effect(src) - /* - log_game("FERMICHEM: SGDF mind shift applied. [owner] is now playing as their clone and should not have memories after their clone split (look up SGDF status applied). ID: [owner.key]") - owner.mind.transfer_to(fermi_Clone) - to_chat(owner, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") - to_chat(fermi_Clone, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") - fermi_Clone = null - owner.remove_status_effect(src) - */ + if(!originalmind.current) + owner.remove_status_effect(src) + else + original = originalmind.current //TEST THIS ..() /datum/status_effect/chem/SGDF/on_remove(mob/living/carbon/M) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index c056fec66e..ce64ee4cd9 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -353,7 +353,6 @@ //Consumes self on addition and shifts pH /datum/reagent/fermi/acidic_buffer/on_new(datapH) - data = datapH if(LAZYLEN(holder.reagent_list) == 1) return holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume)) @@ -373,7 +372,6 @@ can_synth = TRUE /datum/reagent/fermi/basic_buffer/on_new(datapH) - data = datapH if(LAZYLEN(holder.reagent_list) == 1) return holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume)) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 6b4df94b88..611b647c26 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -419,6 +419,7 @@ return var/datum/reagent/fermi/acidic_buffer/Fa = locate(/datum/reagent/fermi/acidic_buffer) in my_atom.reagents.reagent_list Fa.data = 0 + Fa.addProc = TRUE /datum/chemical_reaction/fermi/basic_buffer//done test name = "Ethyl Ethanoate buffer" @@ -447,6 +448,7 @@ return var/datum/reagent/fermi/basic_buffer/Fb = locate(/datum/reagent/fermi/basic_buffer) in my_atom.reagents.reagent_list Fb.data = 14 + Fb.addProc = TRUE //secretcatchemcode, shh!! Of couse I hide it amongst cats. Though, I moved it with your requests. //I'm not trying to be sneaky, I'm trying to keep it a secret! From b163f56eb3957a69941511a5bcf866c60f0ae92a Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 7 Jul 2019 16:16:02 +0100 Subject: [PATCH 358/608] Guess what it didn't work. --- modular_citadel/code/datums/status_effects/chems.dm | 5 +---- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 2 ++ .../code/modules/reagents/chemistry/recipes/fermi.dm | 2 -- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 10756eefd7..23ae8e54ea 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -20,10 +20,7 @@ if(original.stat == DEAD || original == null || !original) if((fermi_Clone && fermi_Clone.stat != DEAD) || (fermi_Clone == null)) if(originalmind) - if(!originalmind.current) - owner.remove_status_effect(src) - else - original = originalmind.current //TEST THIS + owner.remove_status_effect(src) ..() /datum/status_effect/chem/SGDF/on_remove(mob/living/carbon/M) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index ce64ee4cd9..c056fec66e 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -353,6 +353,7 @@ //Consumes self on addition and shifts pH /datum/reagent/fermi/acidic_buffer/on_new(datapH) + data = datapH if(LAZYLEN(holder.reagent_list) == 1) return holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume)) @@ -372,6 +373,7 @@ can_synth = TRUE /datum/reagent/fermi/basic_buffer/on_new(datapH) + data = datapH if(LAZYLEN(holder.reagent_list) == 1) return holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume)) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 611b647c26..6b4df94b88 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -419,7 +419,6 @@ return var/datum/reagent/fermi/acidic_buffer/Fa = locate(/datum/reagent/fermi/acidic_buffer) in my_atom.reagents.reagent_list Fa.data = 0 - Fa.addProc = TRUE /datum/chemical_reaction/fermi/basic_buffer//done test name = "Ethyl Ethanoate buffer" @@ -448,7 +447,6 @@ return var/datum/reagent/fermi/basic_buffer/Fb = locate(/datum/reagent/fermi/basic_buffer) in my_atom.reagents.reagent_list Fb.data = 14 - Fb.addProc = TRUE //secretcatchemcode, shh!! Of couse I hide it amongst cats. Though, I moved it with your requests. //I'm not trying to be sneaky, I'm trying to keep it a secret! From 2c5839480c58b58f5cf184fb43a734d7571ce0a4 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 7 Jul 2019 18:05:57 +0100 Subject: [PATCH 359/608] AT LAST, SALVATION. --- .../code/modules/reagents/chemistry/recipes/fermi.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 6b4df94b88..9503b3bda2 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -418,7 +418,7 @@ if(!locate(/datum/reagent/fermi/acidic_buffer) in my_atom.reagents.reagent_list) return var/datum/reagent/fermi/acidic_buffer/Fa = locate(/datum/reagent/fermi/acidic_buffer) in my_atom.reagents.reagent_list - Fa.data = 0 + Fa.data = 0.1//setting it to 0 means byond thinks it's not there. /datum/chemical_reaction/fermi/basic_buffer//done test name = "Ethyl Ethanoate buffer" From c3ac34158afa113b28f1af9a4c2c8c9e6f2646be Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 8 Jul 2019 19:51:10 +0100 Subject: [PATCH 360/608] Fixed shock command. --- code/modules/surgery/organs/vocal_cords.dm | 10 ++++------ .../code/datums/status_effects/chems.dm | 17 +++++++++-------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index ef1658265a..a05a77d64a 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -654,7 +654,7 @@ ////////////////////////////////////// ///////////FermiChem////////////////// ////////////////////////////////////// -//Removed span_list from input arguments. //mob/living/user +//Removed span_list from input arguments. /proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = TRUE, message_admins = FALSE, debug = FALSE) if(!user || !user.can_speak() || user.stat) @@ -706,8 +706,8 @@ else if (is_devil(user))//The devil is supposed to be seductive, right? power_multiplier *= 1.2 - //range = 0.5 - 4.2~ - //most cases = 1-2 + //range = 0.5 - 1.4~ + //most cases = 1 //Try to check if the speaker specified a name or a job to focus on var/list/specific_listeners = list() @@ -791,8 +791,6 @@ var/distancelist = list(2,2,1.5,1.3,1.15,1,0.8,0.6,0.5,0.25) - //enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words - //CALLBACKS ARE USED FOR MESSAGES BECAUSE SAY IS HANDLED AFTER THE PROCESSING. //Tier 1 @@ -1326,7 +1324,7 @@ for(var/V in listeners) var/mob/living/carbon/human/H = V var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) - if(E.phase == 3) + if(E.phase == 3 && H.client?.prefs.lewdchem) var/instill = stripped_input(user, "Instill an emotion in your [(user.client?.prefs.lewdchem?"Your pet":"listener")].", MAX_MESSAGE_LEN) var/customSpan = list("Notice", "Warning", "Hypnophrase", "Love", "Velvet") to_chat(H, "[instill]") diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 23ae8e54ea..c46f8f0197 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -246,7 +246,7 @@ var/mob/living/carbon/M = owner //chem calculations - if(!owner.reagents.has_reagent("enthrall") || !owner.reagents.has_reagent("enthrallTest")) + if(!owner.reagents.has_reagent("enthrall") && !owner.reagents.has_reagent("enthrallTest")) if (phase < 3 && phase != 0) deltaResist += 3//If you've no chem, then you break out quickly if(prob(10)) @@ -258,7 +258,7 @@ mental_capacity += 10 //mindshield check - if(HAS_TRAIT(M, TRAIT_MINDSHIELD))//If you manage to enrapture a head, wow, GJ. (resisting gives a bigger bonus with a mindshield) + if(HAS_TRAIT(M, TRAIT_MINDSHIELD))//If you manage to enrapture a head, wow, GJ. (resisting gives a bigger bonus with a mindshield) From what I can tell, this isn't possible. resistanceTally += 2 if(prob(10)) to_chat(owner, "You feel lucidity returning to your mind as the mindshield buzzes, attempting to return your brain to normal function.") @@ -513,7 +513,7 @@ //adrenals? //customEcho - if(customEcho && withdrawal == FALSE) + if(customEcho && withdrawal == FALSE && owner.client?.prefs.lewdchem) if(prob(5)) if(!customSpan) //just in case! customSpan = "notice" @@ -590,12 +590,13 @@ //Shocking truth! else if (lowertext(customTriggers[trigger]) == "shock") - if (C.canbearoused) - C.electrocute_act(10, src, 1, FALSE, FALSE, FALSE, TRUE)//I've no idea how strong this is + if (C.canbearoused && C.client?.prefs.lewdchem) C.adjustArousalLoss(5) - to_chat(owner, "Your muscles seize up, then start spasming wildy!") - else - C.electrocute_act(15, src, 1, FALSE, FALSE, FALSE, TRUE)//To make up for the lack of effect + C.jitteriness += 100 + C.stuttering += 25 + C.Knockdown(60) + C.Stun(60) + to_chat(owner, "Your muscles seize up, then start spasming wildy!") //wah intensifies wah-rks else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From d870604322d5c777d5446c097abf926a5bc63147 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 8 Jul 2019 19:59:51 +0100 Subject: [PATCH 361/608] Missed one --- code/modules/surgery/organs/vocal_cords.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index a05a77d64a..d50b229698 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1327,7 +1327,8 @@ if(E.phase == 3 && H.client?.prefs.lewdchem) var/instill = stripped_input(user, "Instill an emotion in your [(user.client?.prefs.lewdchem?"Your pet":"listener")].", MAX_MESSAGE_LEN) var/customSpan = list("Notice", "Warning", "Hypnophrase", "Love", "Velvet") - to_chat(H, "[instill]") + var/instillSpan = input(user, "Pick the style", "Style") in customSpan + to_chat(H, "[instill]") E.cooldown += 1 //RECOGNISE From adf2166c571ed872f709f1bdd49d8aa54244bcfb Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 8 Jul 2019 12:31:15 -0700 Subject: [PATCH 362/608] t --- .../subsystem/processing/quirks.dm | 51 ++++++++++++++++++- code/datums/traits/_quirk.dm | 1 - code/modules/jobs/job_types/captain.dm | 3 ++ code/modules/jobs/job_types/cargo_service.dm | 2 + code/modules/jobs/job_types/engineering.dm | 2 + code/modules/jobs/job_types/job.dm | 2 + code/modules/jobs/job_types/medical.dm | 2 + code/modules/jobs/job_types/science.dm | 2 + code/modules/jobs/job_types/security.dm | 2 + .../modules/mob/dead/new_player/new_player.dm | 2 +- 10 files changed, 65 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index a6c86a3576..708f823298 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -9,6 +9,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) runlevels = RUNLEVEL_GAME var/list/quirks = list() //Assoc. list of all roundstart quirk datum types; "name" = /path/ + var/list/quirk_names_by_path = list() var/list/quirk_points = list() //Assoc. list of quirk names and their "point cost"; positive numbers are good traits, and negative ones are bad var/list/quirk_objects = list() //A list of all quirk objects in the game, since some may process @@ -22,11 +23,57 @@ PROCESSING_SUBSYSTEM_DEF(quirks) var/datum/quirk/T = V quirks[initial(T.name)] = T quirk_points[initial(T.name)] = initial(T.value) + quirk_names_by_path[T] = initial(T.name) -/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli, spawn_effects) +/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli, spawn_effects, roundstart = FALSE, datum/job/job, silent = FALSE) GenerateQuirks(cli) - for(var/V in cli.prefs.character_quirks) + var/list/quirks = cli.prefs.character_quirks.Copy() + var/list/cut + if(job && job.blacklisted_quirks) + cut = filter_quirks(quirks, job) + for(var/V in quirks) user.add_quirk(V, spawn_effects) + if(!silent) + to_chat(user, "The following quirks were cut during assignment either due to a job restriction or another reason: [english_list(cut)].") + +/datum/controller/subsystem/processing/quirks/proc/quirk_path_by_name(name) + return quirks[name] + +/datum/controller/subsystem/processing/quirks/proc/quirk_points_by_name(name) + return quirk_points[name] + +/datum/controller/subsystem/processing/quirks/proc/quirk_name_by_path(path) + return quirk_names_by_path[path] + +/datum/controller/subsystem/processing/quirks/proc/total_points(list/quirk_names) + . = 0 + for(var/i in quirk_names) + . += quirk_points_by_name(i) + +/datum/controller/subsystem/processing/quirks/proc/filter_quirks(list/quirks, datum/job/job) + var/list/cut = list() + var/list/banned_names = list() + for(var/i in job.blacklisted_quirks) + var/name = quirk_name_by_path(i) + if(name) + banned_names += name + var/list/blacklisted = quirks & banned_names + if(length(blacklisted)) + for(var/i in blacklisted) + quirks -= i + cut += i + var/points_used = total_points(quirks) + if(points_used > 0) + //they owe us points, let's collect. + for(var/i in quirks) + var/points = quirk_points_by_name(i) + if(points > 0) + cut += i + quirks -= i + points_used -= points + if(points_used <= 0) + break + return cut /datum/controller/subsystem/processing/quirks/proc/GenerateQuirks(client/user) if(user.prefs.character_quirks.len) diff --git a/code/datums/traits/_quirk.dm b/code/datums/traits/_quirk.dm index cc6dd8db3f..12e34b0c90 100644 --- a/code/datums/traits/_quirk.dm +++ b/code/datums/traits/_quirk.dm @@ -13,7 +13,6 @@ var/mob/living/quirk_holder /datum/quirk/New(mob/living/quirk_mob, spawn_effects) - ..() if(!quirk_mob || (human_only && !ishuman(quirk_mob)) || quirk_mob.has_quirk(type)) qdel(src) quirk_holder = quirk_mob diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index cd9c914e7a..e9fa8ec099 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -21,6 +21,8 @@ Captain access = list() //See get_access() minimal_access = list() //See get_access() + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems) + /datum/job/captain/get_access() return get_all_accesses() @@ -94,6 +96,7 @@ Head of Personnel ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) /datum/outfit/job/hop name = "Head of Personnel" diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm index 22ef2a9211..a8d64e8013 100644 --- a/code/modules/jobs/job_types/cargo_service.dm +++ b/code/modules/jobs/job_types/cargo_service.dm @@ -17,6 +17,8 @@ Quartermaster access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems) + /datum/outfit/job/quartermaster name = "Quartermaster" jobtype = /datum/job/qm diff --git a/code/modules/jobs/job_types/engineering.dm b/code/modules/jobs/job_types/engineering.dm index f28e5f1afc..ec596d67a0 100644 --- a/code/modules/jobs/job_types/engineering.dm +++ b/code/modules/jobs/job_types/engineering.dm @@ -29,6 +29,8 @@ Chief Engineer ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems) + /datum/outfit/job/ce name = "Chief Engineer" jobtype = /datum/job/chief_engineer diff --git a/code/modules/jobs/job_types/job.dm b/code/modules/jobs/job_types/job.dm index f678700735..aa356362f7 100644 --- a/code/modules/jobs/job_types/job.dm +++ b/code/modules/jobs/job_types/job.dm @@ -56,6 +56,8 @@ var/list/mind_traits // Traits added to the mind of the mob assigned this job + var/list/blacklisted_quirks //list of quirk typepaths blacklisted. + //Only override this proc //H is usually a human unless an /equip override transformed it /datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE) diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index 5a926f490a..2f48f89ce4 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -27,6 +27,8 @@ Chief Medical Officer ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems) + /datum/outfit/job/cmo name = "Chief Medical Officer" jobtype = /datum/job/cmo diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm index 6a14f204a3..846403b279 100644 --- a/code/modules/jobs/job_types/science.dm +++ b/code/modules/jobs/job_types/science.dm @@ -31,6 +31,8 @@ Research Director ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems) + /datum/outfit/job/rd name = "Research Director" jobtype = /datum/job/rd diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm index 8d2b9e8681..49a4d390d1 100644 --- a/code/modules/jobs/job_types/security.dm +++ b/code/modules/jobs/job_types/security.dm @@ -37,6 +37,8 @@ Head of Security mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent) + /datum/outfit/job/hos name = "Head of Security" jobtype = /datum/job/hos diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 0d72d47023..4302341865 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -416,7 +416,7 @@ SSticker.mode.make_antag_chance(humanc) if(humanc && CONFIG_GET(flag/roundstart_traits)) - SSquirks.AssignQuirks(humanc, humanc.client, TRUE) + SSquirks.AssignQuirks(humanc, humanc.client, TRUE, TRUE, job) log_manifest(character.mind.key,character.mind,character,latejoin = TRUE) From 270cdb1c43ce5aeae1276ac45110f4d8ac3648a3 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 8 Jul 2019 12:35:21 -0700 Subject: [PATCH 363/608] CE memes --- code/modules/jobs/job_types/engineering.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/jobs/job_types/engineering.dm b/code/modules/jobs/job_types/engineering.dm index ec596d67a0..0477bdf43e 100644 --- a/code/modules/jobs/job_types/engineering.dm +++ b/code/modules/jobs/job_types/engineering.dm @@ -29,7 +29,7 @@ Chief Engineer ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) - blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic) /datum/outfit/job/ce name = "Chief Engineer" From e7224991b781c7ab5b98e088765d24ee50b43c6c Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 8 Jul 2019 23:06:01 +0100 Subject: [PATCH 364/608] Few fixes --- modular_citadel/code/datums/status_effects/chems.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index c46f8f0197..9b6f0c8b4c 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -249,7 +249,7 @@ if(!owner.reagents.has_reagent("enthrall") && !owner.reagents.has_reagent("enthrallTest")) if (phase < 3 && phase != 0) deltaResist += 3//If you've no chem, then you break out quickly - if(prob(10)) + if(prob(5)) to_chat(owner, "Your mind starts to restore some of it's clarity as you feel the effects of the drug wain.") if (mental_capacity <= 500 || phase == 4) if (owner.reagents.has_reagent("mannitol")) @@ -350,8 +350,10 @@ if(DistApart < 10) if(master.client?.prefs.lewdchem) to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") + cooldownMsg = TRUE else to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") + cooldownMsg = TRUE if(get_dist(master, owner) > 10) if(prob(10)) to_chat(owner, "You feel [(owner.client?.prefs.lewdchem?"a deep NEED to return to your [enthrallGender]":"like you have to return to [master]")].") From 30a006e42f63c4b302a7ac6d8bc33caaccf40bf9 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 8 Jul 2019 18:21:04 -0700 Subject: [PATCH 365/608] additions, and it now nulls out. --- code/controllers/subsystem/processing/quirks.dm | 11 +++++++++++ code/controllers/subsystem/ticker.dm | 2 +- code/modules/jobs/job_types/captain.dm | 2 +- code/modules/jobs/job_types/security.dm | 2 +- code/modules/mob/dead/new_player/new_player.dm | 2 +- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index 708f823298..2cc2fcb9ac 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -62,6 +62,8 @@ PROCESSING_SUBSYSTEM_DEF(quirks) for(var/i in blacklisted) quirks -= i cut += i + + /* //Code to automatically reduce positive quirks until balance is even. var/points_used = total_points(quirks) if(points_used > 0) //they owe us points, let's collect. @@ -73,6 +75,15 @@ PROCESSING_SUBSYSTEM_DEF(quirks) points_used -= points if(points_used <= 0) break + */ + + //Nah, let's null all non-neutrals out. + if(cut.len) + for(var/i in quirks) + if(quirk_points_by_name(i) != 0) + cut += i + quirks -= i + return cut /datum/controller/subsystem/processing/quirks/proc/GenerateQuirks(client/user) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 74f9ad0382..ed9ccad538 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -374,7 +374,7 @@ SUBSYSTEM_DEF(ticker) if(player.mind.assigned_role != player.mind.special_role) SSjob.EquipRank(N, player.mind.assigned_role, 0) if(CONFIG_GET(flag/roundstart_traits) && ishuman(N.new_character)) - SSquirks.AssignQuirks(N.new_character, N.client, TRUE) + SSquirks.AssignQuirks(N.new_character, N.client, TRUE, TRUE, SSjob.GetJob(player.mind.assigned_role), FALSE) CHECK_TICK if(captainless) for(var/mob/dead/new_player/N in GLOB.player_list) diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index e9fa8ec099..af9e57ff2c 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -96,7 +96,7 @@ Head of Personnel ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) - blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/prosopagnosia) /datum/outfit/job/hop name = "Head of Personnel" diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm index 49a4d390d1..d216320d2d 100644 --- a/code/modules/jobs/job_types/security.dm +++ b/code/modules/jobs/job_types/security.dm @@ -37,7 +37,7 @@ Head of Security mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) - blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic) /datum/outfit/job/hos name = "Head of Security" diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 4302341865..dc730bf0fd 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -416,7 +416,7 @@ SSticker.mode.make_antag_chance(humanc) if(humanc && CONFIG_GET(flag/roundstart_traits)) - SSquirks.AssignQuirks(humanc, humanc.client, TRUE, TRUE, job) + SSquirks.AssignQuirks(humanc, humanc.client, TRUE, FALSE, job, FALSE) log_manifest(character.mind.key,character.mind,character,latejoin = TRUE) From 1b3de620f96175091e979c41a0ef16ba30fa9c54 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 9 Jul 2019 02:44:17 +0100 Subject: [PATCH 366/608] BM requests. --- code/modules/surgery/organs/vocal_cords.dm | 31 +++++++++++++++++-- .../code/datums/status_effects/chems.dm | 1 + .../chemistry/reagents/eigentstasium.dm | 7 +++-- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index d50b229698..54621f71a3 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -758,6 +758,7 @@ //phase1 var/static/regex/petstatus_words = regex("how are you|what is your status|are you okay") var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") + var/static/regex/speak_words = regex("talk to me|speak") var/static/regex/antiresist_words = regex("unable to resist|give in")//useful if you think your target is resisting a lot var/static/regex/resist_words = regex("resist|snap out of it|fight")//useful if two enthrallers are fighting var/static/regex/forget_words = regex("forget|muddled|awake and forget") @@ -869,6 +870,7 @@ var/mob/living/carbon/C = V var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) REMOVE_TRAIT(C, TRAIT_MUTE, "enthrall") + C.silent = 0 if(C.client?.prefs.lewdchem) addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.enthrallGender]"), 5) else @@ -889,7 +891,7 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) else addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of [E.master]'s fingers brings you back to being under their influence."), 5) - + to_chat(user, "You wake up [L]!") //tier 1 @@ -1032,14 +1034,17 @@ else C.silent += ((10 * power_multiplier) * E.phase) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You are unable to speak!"), 5) + to_chat(user, "You silence [C].") E.cooldown += 3 //SPEAK - else if((findtext(message, silence_words))) + else if((findtext(message, speak_words)))//fix for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) REMOVE_TRAIT(C, TRAIT_MUTE, "enthrall") + C.silent = 0 E.cooldown += 3 + to_chat(user, "You [(C.client?.prefs.lewdchem?"allow [C] to speak again":"encourage [C] to speak again")].") //Antiresist @@ -1051,6 +1056,7 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "Your mind clouds over, as you find yourself unable to resist!"), 5) E.statusStrength = (1 * power_multiplier * E.phase) E.cooldown += 15//Too short? yes, made 15 + to_chat(user, "You frustrate [L]'s attempts at resisting.") //RESIST else if((findtext(message, resist_words))) @@ -1061,6 +1067,7 @@ E.owner_resist() E.cooldown += 2 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You are spurred into resisting from [user]'s words!'"), 5) + to_chat(user, "You spark resistance in [C].") //FORGET (A way to cancel the process) else if((findtext(message, forget_words))) @@ -1075,6 +1082,7 @@ if(1 to 2) E.phase = -1 to_chat(C, "You have no recollection of being enthralled by [E.master]!") + to_chat(user, "You revert [C] back to their state before enthrallment.") if(3) E.phase = 0 E.cooldown = 0 @@ -1082,6 +1090,7 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) else addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) + to_chat(user, "You put [C] into a sleeper state, ready to turn them back at the snap of your fingers.") //ATTRACT else if((findtext(message, attract_words))) @@ -1091,6 +1100,7 @@ L.throw_at(get_step_towards(user,L), 3 * power_multiplier, 1 * power_multiplier) E.cooldown += 3 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You are drawn towards [user]!"), 5) + to_chat(user, "You draw [L] towards you!") //teir 2 @@ -1145,6 +1155,7 @@ C.Sleeping(45 * power_multiplier) E.cooldown += 10 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "Drowsiness suddenly overwhelms you as you fall asleep!"), 5) + to_chat(user, "You send [C] to sleep.") //STRIP else if((findtext(message, strip_words))) @@ -1171,6 +1182,7 @@ L.toggle_move_intent() E.cooldown += 1 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You slow down to a walk."), 5) + to_chat(user, "You encourage [L] to slow down.") //RUN else if((findtext(message, run_words))) @@ -1183,6 +1195,7 @@ L.toggle_move_intent() E.cooldown += 1 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You speed up into a jog!"), 5) + to_chat(user, "You encourage [L] to pick up the pace!") //LIE DOWN else if(findtext(message, liedown_words)) @@ -1194,6 +1207,7 @@ L.lay_down() E.cooldown += 10 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[(L.client?.prefs.lewdchem?"You eagerly lie down!":"You suddenly lie down!")]"), 5) + to_chat(user, "You encourage [L] to lie down.") //KNOCKDOWN else if(findtext(message, knockdown_words)) @@ -1205,6 +1219,7 @@ L.Knockdown(30 * power_multiplier * E.phase) E.cooldown += 8 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You suddenly drop to the ground!"), 5) + to_chat(user, "You encourage [L] to drop down to the ground.") //tier3 @@ -1329,6 +1344,8 @@ var/customSpan = list("Notice", "Warning", "Hypnophrase", "Love", "Velvet") var/instillSpan = input(user, "Pick the style", "Style") in customSpan to_chat(H, "[instill]") + to_chat(user, "You sucessfully instill a feeling in [H]") + log_game("FERMICHEM: [H] has been instilled by [user] with [instill] via MKUltra.") E.cooldown += 1 //RECOGNISE @@ -1340,6 +1357,7 @@ if(user.ckey == E.enthrallID && user.real_name == E.master.real_name) E.master = user addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.client?.prefs.lewdchem?"You hear the words of your [E.enthrallGender] again!! They're back!!":"You recognise the voice of [E.master].")]"), 5) + to_chat(user, "[H] looks at you with sparkling eyes, recognising you!") //I dunno how to do state objectives without them revealing they're an antag @@ -1355,6 +1373,7 @@ E.cooldown += 5 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You begin to lick your wounds."), 5) L.Stun(15 * power_multiplier) + to_chat(user, "[L] begins to lick their wounds.") //STUN else if(findtext(message, stun_words)) @@ -1366,6 +1385,7 @@ L.Stun(40 * power_multiplier) E.cooldown += 8 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "Your muscles freeze up!"), 5) + to_chat(user, "You cause [L] to freeze up!") //HALLUCINATE else if(findtext(message, hallucinate_words)) @@ -1375,6 +1395,7 @@ switch(E.phase) if(3 to INFINITY) new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) + to_chat(user, "You send [C] on a trip.") //HOT else if(findtext(message, hot_words)) @@ -1385,6 +1406,7 @@ if(3 to INFINITY) L.adjust_bodytemperature(50 * power_multiplier)//This seems nuts, reduced it, but then it didn't do anything, so I reverted it. addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You feel your metabolism speed up!"), 5) + to_chat(user, "You speed [L]'s metabolism up!") //COLD else if(findtext(message, cold_words)) @@ -1395,7 +1417,7 @@ if(3 to INFINITY) L.adjust_bodytemperature(-50 * power_multiplier) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You feel your metabolism slow down!"), 5) - + to_chat(user, "You slow [L]'s metabolism down!") //GET UP else if(findtext(message, getup_words)) @@ -1411,6 +1433,7 @@ L.SetUnconscious(0) //i said get up i don't care if you're being tased E.cooldown += 10 //This could be really strong addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You jump to your feet from sheer willpower!"), 5) + to_chat(user, "You spur [L] to their feet!") //PACIFY else if(findtext(message, pacify_words)) @@ -1422,6 +1445,7 @@ E.status = "pacify" E.cooldown += 10 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You feel like never hurting anyone ever again."), 5) + to_chat(user, "You remove any intent to harm from [L]'s mind.") //CHARGE else if(findtext(message, charge_words)) @@ -1433,6 +1457,7 @@ E.statusStrength = 2* power_multiplier E.status = "charge" E.cooldown += 10 + to_chat(user, "You rally [L], leading them into a charge!") if(message_admins || debug)//Do you want this in? message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 9b6f0c8b4c..4e2226a99e 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -548,6 +548,7 @@ //Remove all stuff /datum/status_effect/chem/enthrall/on_remove() var/mob/living/carbon/M = owner + M.mind.remove_antag_datum(/datum/antagonist/brainwashed) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrallpraise") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrallscold") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index c6bc537ed3..399d9eeb1a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -102,12 +102,15 @@ M.Jitter(200) M.Knockdown(200) M.Stun(80) - var/items = M.get_contents() if(!LAZYLEN(items)) return ..() var/obj/item/I = pick(items) - M.dropItemToGround(I, TRUE) + if(istype(I, /obj/item/implant)) + qdel(I) + to_chat(M, "You feel your implant rip itself out of you, sent flying off to another dimention!") + else + M.dropItemToGround(I, TRUE) do_sparks(5,FALSE,I) do_teleport(I, get_turf(I), 5, no_effects=TRUE); do_sparks(5,FALSE,I) From 3a2192ec2e5a068c076736054ed6a2e1ae40ed3a Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 9 Jul 2019 20:36:16 +0100 Subject: [PATCH 367/608] Hotfix for captain. --- code/modules/mob/living/living.dm | 2 ++ modular_citadel/code/datums/status_effects/chems.dm | 2 +- .../code/modules/reagents/chemistry/reagents/MKUltra.dm | 2 ++ .../code/modules/reagents/chemistry/reagents/fermi_reagents.dm | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index d3f244b0c3..362b547733 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -324,6 +324,8 @@ if(src.has_status_effect(/datum/status_effect/chem/enthrall)) var/datum/status_effect/chem/enthrall/E = src.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase < 3) + if(HAS_TRAIT(src, TRAIT_MINDSHIELD)) + to_chat(src, "Your mindshield prevents your mind from giving in!") E.enthrallTally += 50 to_chat(src, "You give into [E.master]'s influence.") if (InCritical()) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 4e2226a99e..cce569c656 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -288,7 +288,7 @@ else to_chat(owner, "Your conciousness slips, as you feel more drawn to following [master].") - else if (resistanceTally > 150) + else if (resistanceTally > 125) phase = -1 to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") if(DistApart < 10) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index f32c6b6431..7006918aa1 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -200,6 +200,8 @@ Creating a chem with a low purity will make you permanently fall in love with so qdel(Vc) to_chat(M, "You feel your vocal chords tingle as your voice comes out in a more sultry tone.") else + if(M.mind.assigned_role == "Captain") + return log_game("FERMICHEM: MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]") M.apply_status_effect(/datum/status_effect/chem/enthrall) log_game("FERMICHEM: [M] ckey: [M.key] has taken MKUltra") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index c056fec66e..5a4dd2df0a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -75,6 +75,7 @@ description = "A strange substance that draws in a hat from the hat dimention." color = "#7c311a" // rgb: , 0, 255 taste_description = "like jerky, whiskey and an off aftertaste of a crypt." + metabolization_rate = 0.2 overdose_threshold = 25 DoNotSplit = TRUE pH = 4 From ce390fb595e019ccd44e81f0751a5a6651bf4f9a Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 9 Jul 2019 23:27:37 +0100 Subject: [PATCH 368/608] Tweaks to MK --- code/datums/looping_sounds/_looping_sound.dm | 2 +- code/game/objects/items/devices/scanners.dm | 3 +++ code/modules/mob/living/living.dm | 7 +++++-- code/modules/surgery/organs/vocal_cords.dm | 6 +++--- modular_citadel/code/datums/status_effects/chems.dm | 2 +- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index 1b7a304494..49942976ce 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -96,4 +96,4 @@ /datum/looping_sound/proc/on_stop() if(end_sound) - play(end_sound) \ No newline at end of file + play(end_sound) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 61c67a9fbf..637ec327ff 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -200,6 +200,9 @@ SLIME SCANNER if(advanced && M.hallucinating()) msg += "\tSubject is hallucinating.\n" + if(src.has_status_effect(/datum/status_effect/chem/enthrall)) + msg += "\tSubject has abnormal brain fuctions.\n" + //Eyes and ears if(advanced) if(iscarbon(M)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 362b547733..532316259f 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -326,8 +326,11 @@ if(E.phase < 3) if(HAS_TRAIT(src, TRAIT_MINDSHIELD)) to_chat(src, "Your mindshield prevents your mind from giving in!") - E.enthrallTally += 50 - to_chat(src, "You give into [E.master]'s influence.") + else if(src.mind.assigned_role in GLOB.command_positions) + to_chat(src, "Your dedication to your department prevents you from giving in!") + else + E.enthrallTally += 20 + to_chat(src, "You give into [E.master]'s influence.") if (InCritical()) log_message("Has succumbed to death while in [InFullCritical() ? "hard":"soft"] critical with [round(health, 0.1)] points of health!", LOG_ATTACK) adjustOxyLoss(health - HEALTH_THRESHOLD_DEAD) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 54621f71a3..b6f09bcd77 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1105,7 +1105,7 @@ //teir 2 - + /* removed for now //ORGASM else if((findtext(message, orgasm_words))) for(var/V in listeners) @@ -1122,7 +1122,7 @@ E.cooldown += 6 else H.throw_at(get_step_towards(user,H), 3 * power_multiplier, 1 * power_multiplier) - + */ //awoo @@ -1166,7 +1166,7 @@ if(2 to INFINITY) var/items = H.get_contents() for(var/obj/item/W in items) - if(W == H.w_uniform || W == H.wear_suit) + if(W == H.wear_suit) H.dropItemToGround(W, TRUE) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Before you can even think about it, you quickly remove your clothes in response to [(H.client?.prefs.lewdchem?"your [E.enthrallGender]'s command'":"[E.master]'s directive'")]."), 5) E.cooldown += 10 diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index cce569c656..c3c68cfa1e 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -299,7 +299,7 @@ if(owner.client?.prefs.lewdchem) to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") if (2) //partially enthralled - if (enthrallTally > 200) + if(enthrallTally > 200) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 From aece9b31ed8c24100f0f4b7f4b51704a3eb78ab9 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 9 Jul 2019 23:28:12 +0100 Subject: [PATCH 369/608] Mistakessss! --- code/game/objects/items/devices/scanners.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 637ec327ff..7337676a46 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -200,7 +200,7 @@ SLIME SCANNER if(advanced && M.hallucinating()) msg += "\tSubject is hallucinating.\n" - if(src.has_status_effect(/datum/status_effect/chem/enthrall)) + if(M.has_status_effect(/datum/status_effect/chem/enthrall)) msg += "\tSubject has abnormal brain fuctions.\n" //Eyes and ears From 8f555b0fdd222544acc60b99e394d289b31644d2 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 10 Jul 2019 21:35:47 +0100 Subject: [PATCH 370/608] Reworked Astral, doubled lung damage, fixed lung damage oopsie. --- .../mob/living/simple_animal/astral.dm | 41 +++++++++++++++++++ .../chemistry/reagents/other_reagents.dm | 2 +- code/modules/surgery/organs/lungs.dm | 13 +++--- .../reagents/chemistry/reagents/SDGF.dm | 4 +- .../reagents/chemistry/reagents/astrogen.dm | 40 ++++++++---------- .../chemistry/reagents/fermi_reagents.dm | 2 +- .../reagents/chemistry/reagents/healing.dm | 2 +- tgstation.dme | 1 + 8 files changed, 71 insertions(+), 34 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/astral.dm diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm new file mode 100644 index 0000000000..ceebb62be3 --- /dev/null +++ b/code/modules/mob/living/simple_animal/astral.dm @@ -0,0 +1,41 @@ +/mob/living/simple_animal/astral + name = "Astral projection" + desc = "A soul of someone projecting their mind." + icon = 'icons/mob/mob.dmi' + icon_state = "ghost" + icon_living = "ghost" + mob_biotypes = list(MOB_SPIRIT) + attacktext = "raises the hairs on the neck of" + response_harm = "disrupts the concentration of" + response_disarm = "wafts" + friendly = "touches" + loot = null + maxHealth = 5 + health = 5 + melee_damage_lower = 0 + melee_damage_upper = 0 + obj_damage = 0 + deathmessage = "disappears as if it was never really there to begin with" + incorporeal_move = 1 + alpha = 50 + attacktext = "touches the mind of" + speak_emote = list("echos") + movement_type = FLYING + var/pseudo_death = FALSE + +/mob/living/simple_animal/astral/death() + icon_state = "shade_dead" + Stun(1000) + canmove = 0 + friendly = "deads at" + pseudo_death = TRUE + incorporeal_move = 0 + to_chat(src, "Your astral projection is interrupted and your mind is sent back to your body with a shock!") + +/mob/living/simple_animal/astral/ClickOn(var/atom/A, var/params) + ..() + if(pseudo_death == FALSE) + if(isliving(A)) + var/message = html_decode(stripped_input(src, "Enter a message to send to [A]", MAX_MESSAGE_LEN)) + to_chat(A, "[src] speaks into your mind, \"[message]\"") + log_game("FERMICHEM: [src] has astrally transmitted [message] into [A]") diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 03a83b7448..f7c9c95e40 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1929,7 +1929,7 @@ /datum/reagent/moonsugar/on_mob_life(mob/living/carbon/M) if(prob(20)) to_chat(M, "You find yourself unable to supress the desire to meow!") - M.emote("*nya") + M.emote("nya") ..() //Kept for legacy, I think it will break everything if you enable it. diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 1dd0f9fd70..ff8310e2aa 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -405,13 +405,13 @@ var/cold_modifier = H.dna.species.coldmod if(breath_temperature < cold_level_3_threshold) H.apply_damage_type(cold_level_3_damage*cold_modifier, cold_damage_type) - adjustLungLoss(cold_level_3_damage*cold_modifier, H) + adjustLungLoss((cold_level_3_damage*cold_modifier*2), H) if(breath_temperature > cold_level_3_threshold && breath_temperature < cold_level_2_threshold) H.apply_damage_type(cold_level_2_damage*cold_modifier, cold_damage_type) - adjustLungLoss(cold_level_2_damage*cold_modifier, H) + adjustLungLoss((cold_level_2_damage*cold_modifier*2), H) if(breath_temperature > cold_level_2_threshold && breath_temperature < cold_level_1_threshold) H.apply_damage_type(cold_level_1_damage*cold_modifier, cold_damage_type) - adjustLungLoss(cold_level_1_damage*cold_modifier, H) + adjustLungLoss((cold_level_1_damage*cold_modifier*2), H) if(breath_temperature < cold_level_1_threshold) if(prob(20)) to_chat(H, "You feel [cold_message] in your [name]!") @@ -420,13 +420,13 @@ var/heat_modifier = H.dna.species.heatmod if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold) H.apply_damage_type(heat_level_1_damage*heat_modifier, heat_damage_type) - adjustLungLoss(cold_level_1_damage*heat_modifier, H) + adjustLungLoss((heat_level_1_damage*heat_modifier*2), H) if(breath_temperature > heat_level_2_threshold && breath_temperature < heat_level_3_threshold) H.apply_damage_type(heat_level_2_damage*heat_modifier, heat_damage_type) - adjustLungLoss(cold_level_1_damage*heat_modifier, H) + adjustLungLoss((heat_level_2_damage*heat_modifier*2), H) if(breath_temperature > heat_level_3_threshold) H.apply_damage_type(heat_level_3_damage*heat_modifier, heat_damage_type) - adjustLungLoss(cold_level_1_damage*heat_modifier, H) + adjustLungLoss((heat_level_3_damage*heat_modifier*2), H) if(breath_temperature > heat_level_1_threshold) if(prob(20)) to_chat(H, "You feel [hot_message] in your [name]!") @@ -500,4 +500,3 @@ if (breath.gases[/datum/gas/plasma]) var/plasma_pp = breath.get_breath_partial_pressure(breath.gases[/datum/gas/plasma]) owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. - diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index 62a78c6567..f57bfdaa9c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -68,11 +68,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING startHunger = M.nutrition if(pollStarted == FALSE) pollStarted = TRUE - candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") + candies = pollGhostCandidates("Do you want to play as a clone of [M], and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you and it will likely earn you a bwoink.") log_game("FERMICHEM: [M] ckey: [M.key] has taken SDGF, and ghosts have been polled.") if(20 to INFINITY) if(LAZYLEN(candies) && playerClone == FALSE) //If there's candidates, clone the person and put them in there! - message_admins("Ghost candidate found! [candies] is becoming a clone of [M]! Hee~!! Exciting!!") log_game("FERMICHEM: [M] ckey: [M.key] is creating a clone, controlled by [candies]") to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") var/typepath = M.type @@ -83,6 +82,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.dna.transfer_identity(SM) SM.updateappearance(mutcolor_update=1) var/mob/dead/observer/C = pick(candies) + message_admins("Ghost candidate found! [C] is becoming a clone of [M] (They agreed to respect the character they're becoming. If they don't, then they agreed to a a bwoinking.) (Hee~!! Exciting!!)") SM.key = C.key SM.mind.enslave_mind_to_creator(M) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index 2b50c5e132..215d82f84a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -18,13 +18,14 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die id = "astral" description = "An opalescent murky liquid that is said to distort your soul from your being." color = "#A080H4" // rgb: , 0, 255 - taste_description = "velvety brambles" + taste_description = "your mind" metabolization_rate = 0//Removal is exponential, see code overdose_threshold = 20 addiction_threshold = 24.5 addiction_stage1_end = 9999//Should never end. There is no escape make your time var/mob/living/carbon/origin - var/mob/living/simple_animal/hostile/retaliate/ghost/G = null + var/mob/living/simple_animal/astral/G = null + var/datum/mind/originalmind var/antiGenetics = 255 var/sleepytime = 0 InverseChemVal = 0.25 @@ -41,39 +42,34 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! M.alpha = 255 + originalmind = M.mind if(current_cycle == 0) log_game("FERMICHEM: [M] ckey: [M.key] became an astral ghost") origin = M if (G == null) G = new(get_turf(M.loc)) - G.attacktext = "raises the hairs on the neck of" - G.response_harm = "disrupts the concentration of" - G.response_disarm = "wafts" - G.loot = null - G.maxHealth = 5 - G.health = 5 - G.melee_damage_lower = 0 - G.melee_damage_upper = 0 - G.obj_damage = 0 - G.deathmessage = "disappears as if it was never really there to begin with" - G.incorporeal_move = 1 - G.alpha = 35 G.name = "[M]'s astral projection" var/datum/action/chem/astral/AS = new(G) AS.origin = M AS.ghost = G M.mind.transfer_to(G) - sleepytime = 15*volume SSblackbox.record_feedback("tally", "fermi_chem", 1, "Astral projections") if(overdosed) if(prob(50)) to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") do_teleport(G, M.loc) M.reagents.remove_reagent(id, current_cycle/2, FALSE)//exponent + sleepytime+=5 + if(G.stat == DEAD || !G || G.pseudo_death == TRUE) + originalmind.transfer_to(M) + M.Sleeping(10, 0) ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) - G.mind.transfer_to(origin) + if(!G) + originalmind.transfer_to(M) + else + G.mind.transfer_to(origin) qdel(G) if(overdosed) to_chat(M, "The high volume of Astrogren you just took causes you to black out momentarily as your mind snaps back to your body.") @@ -86,7 +82,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die if(addiction_stage < 2) antiGenetics = 255 M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them. - if(prob(65)) + if(prob(70)) M.alpha-- antiGenetics-- switch(antiGenetics) @@ -99,6 +95,11 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die to_chat(M, "Your addiction is only getting worse as your body disappears. Maybe you should get some more, and fast?") M.alpha-- antiGenetics-- + if(200) + to_chat(M, "You feel a substantial part of your soul flake off into the ethereal world, rendering yourself unclonable.") + M.alpha-- + antiGenetics-- + ADD_TRAIT(M, TRAIT_NOCLONE, "astral") //So you can't scan yourself, then die, to metacomm. You can only use your memories if you come back as something else. if(180) to_chat(M, "You feel fear build up in yourself as more and more of your body and consciousness begins to fade.") M.alpha-- @@ -107,11 +108,6 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die to_chat(M, "As you lose more and more of yourself, you start to think that maybe shedding your mortality isn't too bad.") M.alpha-- antiGenetics-- - if(100) - to_chat(M, "You feel a substantial part of your soul flake off into the ethereal world, rendering yourself unclonable.") - M.alpha-- - antiGenetics-- - ADD_TRAIT(M, TRAIT_NOCLONE, "astral") //So you can't scan yourself, then die, to metacomm. You can only use your memories if you come back as something else. if(80) to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates your forthcoming oblivion.") M.alpha-- diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 5a4dd2df0a..c683624e06 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -270,7 +270,7 @@ if(prob(20)) to_chat(C, "You can feel your lungs burning!") var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) - L.adjustLungLoss(acidstr, C) + L.adjustLungLoss(acidstr*2, C) C.apply_damage(acidstr/5, BURN, target) C.acid_act(acidstr, volume) ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index 48eae07aa2..7dd61df462 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -75,7 +75,7 @@ if(T) T.adjustTongueLoss(C, 1) if(L) - L.adjustLungLoss(2.5, C) + L.adjustLungLoss(4, C) C.adjustOxyLoss(2) else C.adjustOxyLoss(10) diff --git a/tgstation.dme b/tgstation.dme index 7a04ed0c42..d254c1495f 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2081,6 +2081,7 @@ #include "code\modules\mob\living\silicon\robot\robot_movement.dm" #include "code\modules\mob\living\silicon\robot\say.dm" #include "code\modules\mob\living\simple_animal\animal_defense.dm" +#include "code\modules\mob\living\simple_animal\astral.dm" #include "code\modules\mob\living\simple_animal\constructs.dm" #include "code\modules\mob\living\simple_animal\corpse.dm" #include "code\modules\mob\living\simple_animal\damage_procs.dm" From 63eb375b7438984ae331124d9ac63ea1a2764ae6 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Fri, 12 Jul 2019 16:39:10 +0100 Subject: [PATCH 371/608] Decreased impossibility of catchem --- .../code/modules/reagents/chemistry/recipes/fermi.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 9503b3bda2..f352d31d07 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -477,14 +477,14 @@ /datum/chemical_reaction/fermi/secretcatchem/New() //rand doesn't seem to work with n^-e OptimalTempMin += rand(-100, 100) - OptimalTempMax = (OptimalTempMin+rand(0, 200)) - ExplodeTemp = (OptimalTempMax+rand(0, 200)) + OptimalTempMax = (OptimalTempMin+rand(20, 200)) + ExplodeTemp = (OptimalTempMax+rand(20, 200)) OptimalpHMin += rand(1, 10) OptimalpHMax = (OptimalpHMin + rand(1, 5)) - ReactpHLim += rand(-2, 2) + ReactpHLim += rand(-1.8, 2) CurveSharpT += (rand(1, 500)/100) CurveSharppH += (rand(1, 500)/100) - ThermicConstant += rand(-50, 50) + ThermicConstant += rand(-20, 20) HIonRelease += (rand(-25, 25)/100) RateUpLim += (rand(1, 1000)/100) PurityMin += (rand(-1, 1)/10) From 110f0cbb832eef8cb8a873322a34bf49e07339b0 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 13 Jul 2019 19:17:19 +0100 Subject: [PATCH 372/608] Fixes and making a message clearer so people don't think it's admins. --- .../mob/living/simple_animal/astral.dm | 4 +-- code/modules/surgery/organs/vocal_cords.dm | 16 ++++++---- .../code/datums/status_effects/chems.dm | 32 ++++++++++++------- .../reagents/chemistry/reagents/MKUltra.dm | 21 ++++++------ 4 files changed, 41 insertions(+), 32 deletions(-) diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm index ceebb62be3..d58c013f10 100644 --- a/code/modules/mob/living/simple_animal/astral.dm +++ b/code/modules/mob/living/simple_animal/astral.dm @@ -8,7 +8,7 @@ attacktext = "raises the hairs on the neck of" response_harm = "disrupts the concentration of" response_disarm = "wafts" - friendly = "touches" + friendly = "communes with" loot = null maxHealth = 5 health = 5 @@ -37,5 +37,5 @@ if(pseudo_death == FALSE) if(isliving(A)) var/message = html_decode(stripped_input(src, "Enter a message to send to [A]", MAX_MESSAGE_LEN)) - to_chat(A, "[src] speaks into your mind, \"[message]\"") + to_chat(A, "[src] projects into your mind, \"[message].\"") log_game("FERMICHEM: [src] has astrally transmitted [message] into [A]") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index b6f09bcd77..de0ff80a6c 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -649,13 +649,13 @@ /obj/item/organ/vocal_cords/velvet/handle_speech(message) //actually say the message owner.say(message, spans = spans, sanitize = FALSE) - velvetspeech(message, owner) + velvetspeech(message, owner, 1) ////////////////////////////////////// ///////////FermiChem////////////////// ////////////////////////////////////// //Removed span_list from input arguments. -/proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = TRUE, message_admins = FALSE, debug = FALSE) +/proc/velvetspeech(message, mob/living/user, base_multiplier = 1, message_admins = FALSE, debug = FALSE) if(!user || !user.can_speak() || user.stat) return 0 //no cooldown @@ -668,13 +668,14 @@ for(var/mob/living/L in get_hearers_in_view(8, user)) if(L.can_hear() && !L.anti_magic_check(FALSE, TRUE) && L.stat != DEAD) if(L.has_status_effect(/datum/status_effect/chem/enthrall))//Check to see if they have the status - if(L == user && !include_speaker) //Remove this if I decide to make OD apply to self. + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)//Check to see if pet is on cooldown from last command and if the master is right + if(E.master != user) continue if(ishuman(L)) var/mob/living/carbon/human/H = L if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) continue - var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)//Check to see if pet is on cooldown from last command + if (E.cooldown > 0)//If they're on cooldown you can't give them more commands. continue listeners += L @@ -1270,6 +1271,7 @@ log_game("FERMICHEM: [H] has been implanted by [user] with [trigger], triggering [trigger2].") E.mental_capacity -= 5 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.client?.prefs.lewdchem?"your [E.enthrallGender]":"[E.master]")] whispers you a new trigger."), 5) + to_chat(user, "You sucessfully set the trigger word [trigger] in [H]") else to_chat(user, "Your pet looks at you confused, it seems they don't understand that effect!") else @@ -1298,6 +1300,7 @@ E.customSpan = trigger2 user.SetStun(0) H.SetStun(0) + to_chat(user, "You sucessfully set an echoing phrase in [H]") //CUSTOM OBJECTIVE else if((findtext(message, objective_words))) @@ -1329,6 +1332,7 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.client?.prefs.lewdchem?"Your [E.enthrallGender]":"[E.master]")] whispers you a new objective."), 5) brainwash(H, objective) E.mental_capacity -= 200 + to_chat(user, "You sucessfully give an objective to [H]") else to_chat(user, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") user.SetStun(0) @@ -1341,9 +1345,7 @@ var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase == 3 && H.client?.prefs.lewdchem) var/instill = stripped_input(user, "Instill an emotion in your [(user.client?.prefs.lewdchem?"Your pet":"listener")].", MAX_MESSAGE_LEN) - var/customSpan = list("Notice", "Warning", "Hypnophrase", "Love", "Velvet") - var/instillSpan = input(user, "Pick the style", "Style") in customSpan - to_chat(H, "[instill]") + to_chat(H, "[instill]") to_chat(user, "You sucessfully instill a feeling in [H]") log_game("FERMICHEM: [H] has been instilled by [user] with [instill] via MKUltra.") E.cooldown += 1 diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index c3c68cfa1e..e213a5132c 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -183,6 +183,7 @@ /datum/status_effect/chem/enthrall id = "enthrall" alert_type = null + //examine_text TODO var/enthrallTally = 1 //Keeps track of the enthralling process var/resistanceTally = 0 //Keeps track of the resistance var/deltaResist //The total resistance added per resist click @@ -299,7 +300,7 @@ if(owner.client?.prefs.lewdchem) to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") if (2) //partially enthralled - if(enthrallTally > 200) + if(enthrallTally > 200) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 @@ -330,7 +331,7 @@ resistGrowth = 0 to_chat(owner, "The separation from [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") - if(prob(2)) + if(prob(1)) if(owner.client?.prefs.lewdchem) to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken @@ -393,7 +394,7 @@ if(prob(5)) to_chat(owner, "You're starting to miss [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")].") if(prob(5)) - owner.adjustBrainLoss(0.5) + owner.adjustBrainLoss(0.1) to_chat(owner, "[(owner.client?.prefs.lewdchem?"[enthrallGender]":"[master]")] will surely be back soon") //denial if(36) var/message = "[(owner.client?.prefs.lewdchem?"I feel empty when [enthrallGender]'s not around..":"I miss [master]'s presence")]" @@ -401,7 +402,7 @@ if(37 to 65)//barganing if(prob(10)) to_chat(owner, "They are coming back, right...?") - owner.adjustBrainLoss(1) + owner.adjustBrainLoss(0.5) if(prob(10)) if(owner.client?.prefs.lewdchem) to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.") @@ -421,7 +422,6 @@ to_chat(owner, "You are overwhelmed with anger at the lack of [enthrallGender]'s presence and suddenly lash out!") else to_chat(owner, "You are overwhelmed with anger and suddenly lash out!") - owner.adjustBrainLoss(1) if(90) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") var/message = "[(owner.client?.prefs.lewdchem?"Where are you [enthrallGender]??!":"I need to find [master]!")]" @@ -431,8 +431,8 @@ else to_chat(owner, "You need to find [master] at all costs, you can't hold yourself back anymore!") if(91 to 100)//depression - if(prob(20)) - owner.adjustBrainLoss(2.5) + if(prob(10)) + M.gain_trauma_type(BRAIN_TRAUMA_MILD) owner.stuttering += 35 owner.jitteriness += 35 else if(prob(25)) @@ -442,6 +442,7 @@ var/message = "[(owner.client?.prefs.lewdchem?"I'm all alone, It's so hard to continute without [enthrallGender]...":"I really need to find [master]!!!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4, message) to_chat(owner, "You can hardly find the strength to continue without [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")].") + M.gain_trauma_type(BRAIN_TRAUMA_SEVERE) if(102 to 140) //depression 2, revengeance if(prob(20)) owner.Stun(50) @@ -450,22 +451,31 @@ to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.") else to_chat(owner, "You are overwheled with withdrawl from [master].") - owner.adjustBrainLoss(4) + owner.adjustBrainLoss(1) owner.stuttering += 35 owner.jitteriness += 35 + if(prob(10))//2% chance + switch(rand(1,5))//Now let's see what hopefully-not-important part of the brain we cut off + if(1 to 3) + M.gain_trauma_type(BRAIN_TRAUMA_MILD) + if(4) + M.gain_trauma_type(BRAIN_TRAUMA_SEVERE) + if(5)//0.4% chance + M.gain_trauma_type(BRAIN_TRAUMA_SPECIAL) if(prob(5)) deltaResist += 5 if(140 to INFINITY) //acceptance if(prob(15)) deltaResist += 5 + owner.adjustBrainLoss(-1) if(prob(20)) if(owner.client?.prefs.lewdchem) to_chat(owner, "Maybe you'll be okay without your [enthrallGender].") else to_chat(owner, "You feel your mental functions slowly begin to return.") if(prob(5)) - owner.adjustBrainLoss(2.5) - M.hallucination += 10 + owner.adjustBrainLoss(1) + M.hallucination += 30 withdrawalTick += 0.5//Enough to leave you with a major brain trauma, but not kill you. @@ -516,7 +526,7 @@ //customEcho if(customEcho && withdrawal == FALSE && owner.client?.prefs.lewdchem) - if(prob(5)) + if(prob(2)) if(!customSpan) //just in case! customSpan = "notice" to_chat(owner, "[customEcho].") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 7006918aa1..1508a5d519 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -177,21 +177,19 @@ Creating a chem with a low purity will make you permanently fall in love with so if(!creatorID) //This happens when the reaction explodes. return + if(purity < 0.5)//Impure chems don't function as you expect + return var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) if(E) - if(E.enthrallID == M.ckey && creatorName != M.real_name)//If you're enthralled to yourself (from OD) and someone else tries to enthrall you, you become thralled to them instantly. + if(E.enthrallID == M.ckey && creatorID != M.ckey)//If you're enthralled to yourself (from OD) and someone else tries to enthrall you, you become thralled to them instantly. E.enthrallID = creatorID E.enthrallGender = creatorGender E.master = get_mob_by_key(creatorID) to_chat(M, to_chat(M, "Your aldled, plastic, mind bends under the chemical influence of a new [(M.client?.prefs.lewdchem?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.")) //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE. - return - if(purity < 0.5)//Impure chems don't function as you expect - return + log_game("FERMICHEM: Narcissist [M] ckey: [M.key] been rebound to [creatorName], ID: [creatorID]") + return if((M.ckey == creatorID) && (creatorName == M.real_name)) //same name AND same player - same instance of the player. (should work for clones?) log_game("FERMICHEM: [M] ckey: [M.key] has been given velvetspeech") - /*if(M.has_status_effect(STATUS_EFFECT_INLOVE) //Not sure if I need/want this. - to_chat(M, "You are too captivated by your love to think about anything else") - return*/ var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet if(Vc) @@ -200,8 +198,6 @@ Creating a chem with a low purity will make you permanently fall in love with so qdel(Vc) to_chat(M, "You feel your vocal chords tingle as your voice comes out in a more sultry tone.") else - if(M.mind.assigned_role == "Captain") - return log_game("FERMICHEM: MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]") M.apply_status_effect(/datum/status_effect/chem/enthrall) log_game("FERMICHEM: [M] ckey: [M.key] has taken MKUltra") @@ -258,7 +254,8 @@ Creating a chem with a low purity will make you permanently fall in love with so . = ..() metabolization_rate = 1//Mostly to manage brain damage and reduce server stress if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 100u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.) - to_chat(M, "You are unable to resist your own charms anymore, and become a full blown narcissist.") + if (!M.has_status_effect(/datum/status_effect/chem/enthrall)) + to_chat(M, "You are unable to resist your own charms anymore, and become a full blown narcissist.") /*Old way of handling, left in as an option B var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers for(var/mob/living/carbon/victim in seen) @@ -288,7 +285,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(M.client?.prefs.lewdchem) to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side and protect them at all costs.") else - to_chat(M, "The might volume of chemicals in your system overwhelms your mind, and you suddenly agree with what they've been saying. Your highest priority is now to stay by their side and protect them at all costs.") + to_chat(M, "The might volume of chemicals in your system overwhelms your mind, and you suddenly agree with what [creatorName] has been saying. Your highest priority is now to stay by their side and protect them at all costs.") log_game("FERMICHEM: [M] ckey: [M.key] has been mindbroken for [creatorName] ckey: [creatorID]") M.slurring = 100 M.confused = 100 @@ -298,7 +295,7 @@ Creating a chem with a low purity will make you permanently fall in love with so SSblackbox.record_feedback("tally", "fermi_chem", 1, "Thralls mindbroken") /datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M) - M.adjustBrainLoss(0.2)//should be ~40 in total + M.adjustBrainLoss(0.2)//should be ~30 in total ..() //Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system. From f2076ba27673aa32866c0b2fd548b23140f19cc2 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 13 Jul 2019 19:18:42 +0100 Subject: [PATCH 373/608] Weird pushing error. --- .../code/modules/reagents/chemistry/recipes/fermi.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 9503b3bda2..c52c3c6bd5 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -266,10 +266,12 @@ /datum/chemical_reaction/fermi/enthrall/FermiFinish(datum/reagents/holder, var/atom/my_atom) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list + if(!B) + return if(!B.data) var/list/seen = viewers(5, get_turf(my_atom)) for(var/mob/M in seen) - to_chat(M, "The reaction splutters and fails to react.") //Just in case + to_chat(M, "The reaction splutters and fails to react properly.") //Just in case E.purity = 0 if (B.data.["gender"] == "female") E.data.["creatorGender"] = "Mistress" From 6c9f37790b813bbe317c7b523507b8b6563c6dda Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 13 Jul 2019 20:02:27 +0100 Subject: [PATCH 374/608] Fixing bugs from merge conflicts. --- code/modules/surgery/organs/tongue.dm | 4 +- .../code/modules/reagents/objects/clothes.dm | 48 ++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 539d70f8ad..2d6e2fa592 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -241,8 +241,10 @@ icon_state = "tonguefluffy" taste_sensitivity = 10 // extra sensitive and inquisitive uwu maxHealth = 35 //Sensitive tongue! + modifies_speech = TRUE -/obj/item/organ/tongue/fluffy/TongueSpeech(var/message) +/obj/item/organ/tongue/fluffy/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] if(copytext(message, 1, 2) != "*") message = replacetext(message, "ne", "nye") message = replacetext(message, "nu", "nyu") diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm index 73bd7f84d5..cb1b4f4da4 100644 --- a/modular_citadel/code/modules/reagents/objects/clothes.dm +++ b/modular_citadel/code/modules/reagents/objects/clothes.dm @@ -36,6 +36,52 @@ return ..() +/obj/item/clothing/head/hattip/equipped(mob/M, slot) + . = ..() + if (slot == SLOT_HEAD) + RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) + else + UnregisterSignal(M, COMSIG_MOB_SAY) + +/obj/item/clothing/head/hattip/dropped(mob/M) + . = ..() + UnregisterSignal(M, COMSIG_MOB_SAY) + +/obj/item/clothing/head/hattip/proc/handle_speech(datum/source, mob/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + var/mob/living/carbon/C = get_wearer()//user + var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE) + if (T.name == "fluffy tongue") + if(prob(0.01)) + message += "\" and tips their hat. \"swpy's sappin' my chem dispwencer uwu!!" + return message + message += "\" and tips their hat. \"[pick("weehaw!", "bwoy howdy.", "dawn tuutin'.", "weww don't that beat aww.", "whoooowee, wouwd ya wook at that!", "whoooowee! makin' bwacon!", "cweam gwavy!", "yippekeeyah-heeyapeeah-kwayoh!", "mwove 'em uut!", "gwiddy up!")]" + return message + if(prob(0.01)) + message += "\" and tips their hat. \"Spy's sappin' my chem dispenser!"//How did I not think of this earlier + message_admins("I really appreciate all the hard work you put into adminning citadel, I hope you're all having a good day and I hope this hidden and rare message admins brightens up your day.") + return message + message += "\" and tips their hat. \"[pick("Yeehaw!", "Boy howdy.", "Darn tootin'.", "Well don't that beat all.", "Whoooowee, would ya look at that!", "Whoooowee! Makin' bacon!", "Cream Gravy!", "Yippekeeyah-heeyapeeah-kayoh!", "Move 'em out!", "Giddy up!")]" + speech_args[SPEECH_MESSAGE] = trim(message) + /* + if(message[1] != "*") + message = " [message]" + var/list/french_words = strings("french_replacement.json", "french") + + for(var/key in french_words) + var/value = french_words[key] + if(islist(value)) + value = pick(value) + + message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]") + message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]") + message = replacetextEx(message, " [key]", " [value]") + + if(prob(3)) + message += pick(" Honh honh honh!"," Honh!"," Zut Alors!") + speech_args[SPEECH_MESSAGE] = trim(message) + */ +/* /obj/item/clothing/head/hattip/speechModification(message, /mob/living/carbon/C) ..() var/mob/living/carbon/C = get_wearer()//user @@ -52,7 +98,7 @@ return message message += "\" and tips their hat. \"[pick("Yeehaw!", "Boy howdy.", "Darn tootin'.", "Well don't that beat all.", "Whoooowee, would ya look at that!", "Whoooowee! Makin' bacon!", "Cream Gravy!", "Yippekeeyah-heeyapeeah-kayoh!", "Move 'em out!", "Giddy up!")]" return message - +*/ /obj/item/clothing/head/hattip/proc/get_wearer() return loc From 8d12d0f017a2add39489981ad1cb1e4f630d2cc6 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 13 Jul 2019 20:02:53 +0100 Subject: [PATCH 375/608] I am very smart --- code/datums/brain_damage/phobia.dm | 4 ++-- code/modules/surgery/organs/tongue.dm | 2 +- .../code/modules/reagents/objects/clothes.dm | 13 +++++++------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index e445787498..f802555c7e 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -83,8 +83,8 @@ return message /datum/brain_trauma/mild/phobia/handle_speech(datum/source, list/speech_args) - if(HAS_TRAIT(owner, TRAIT_FEARLESS)) - return message + if(HAS_TRAIT(owner, TRAIT_FEARLESS)) + return for(var/word in trigger_words) var/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i") diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 2d6e2fa592..549f0cc953 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -256,7 +256,7 @@ if(prob(20)) message += pick(" OwO", " uwu") message = lowertext(message) - return message + speech_args[SPEECH_MESSAGE] = message /obj/item/organ/tongue/cybernetic name = "cybernetic tongue" diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm index cb1b4f4da4..f925c229a3 100644 --- a/modular_citadel/code/modules/reagents/objects/clothes.dm +++ b/modular_citadel/code/modules/reagents/objects/clothes.dm @@ -54,14 +54,15 @@ if (T.name == "fluffy tongue") if(prob(0.01)) message += "\" and tips their hat. \"swpy's sappin' my chem dispwencer uwu!!" - return message - message += "\" and tips their hat. \"[pick("weehaw!", "bwoy howdy.", "dawn tuutin'.", "weww don't that beat aww.", "whoooowee, wouwd ya wook at that!", "whoooowee! makin' bwacon!", "cweam gwavy!", "yippekeeyah-heeyapeeah-kwayoh!", "mwove 'em uut!", "gwiddy up!")]" - return message + else + message += "\" and tips their hat. \"[pick("weehaw!", "bwoy howdy.", "dawn tuutin'.", "weww don't that beat aww.", "whoooowee, wouwd ya wook at that!", "whoooowee! makin' bwacon!", "cweam gwavy!", "yippekeeyah-heeyapeeah-kwayoh!", "mwove 'em uut!", "gwiddy up!")]" + speech_args[SPEECH_MESSAGE] = trim(message) + return if(prob(0.01)) message += "\" and tips their hat. \"Spy's sappin' my chem dispenser!"//How did I not think of this earlier - message_admins("I really appreciate all the hard work you put into adminning citadel, I hope you're all having a good day and I hope this hidden and rare message admins brightens up your day.") - return message - message += "\" and tips their hat. \"[pick("Yeehaw!", "Boy howdy.", "Darn tootin'.", "Well don't that beat all.", "Whoooowee, would ya look at that!", "Whoooowee! Makin' bacon!", "Cream Gravy!", "Yippekeeyah-heeyapeeah-kayoh!", "Move 'em out!", "Giddy up!")]" + message_admins("I really appreciate all the hard work you put into adminning citadel, I hope you're all having a good day and I hope this hidden and rare message_admins brightens up your day.") + else + message += "\" and tips their hat. \"[pick("Yeehaw!", "Boy howdy.", "Darn tootin'.", "Well don't that beat all.", "Whoooowee, would ya look at that!", "Whoooowee! Makin' bacon!", "Cream Gravy!", "Yippekeeyah-heeyapeeah-kayoh!", "Move 'em out!", "Giddy up!")]" speech_args[SPEECH_MESSAGE] = trim(message) /* if(message[1] != "*") From 7161870c8bcd10e8debe10d35916096d331226a1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 14 Jul 2019 04:06:06 +0100 Subject: [PATCH 376/608] Astral Tweak. --- .../code/modules/reagents/chemistry/reagents/astrogen.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index 215d82f84a..b9d57f6e71 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -58,7 +58,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die if(prob(50)) to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") do_teleport(G, M.loc) - M.reagents.remove_reagent(id, current_cycle/2, FALSE)//exponent + M.reagents.remove_reagent(id, current_cycle/6, FALSE)//exponent sleepytime+=5 if(G.stat == DEAD || !G || G.pseudo_death == TRUE) originalmind.transfer_to(M) From 570fa0cd3b7d73300a4f59fe5b24d2e4affae69e Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sun, 14 Jul 2019 03:53:15 -0700 Subject: [PATCH 377/608] fix --- code/controllers/subsystem/processing/quirks.dm | 4 ++-- code/controllers/subsystem/ticker.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index 2cc2fcb9ac..dbf41ce0c4 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -25,7 +25,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) quirk_points[initial(T.name)] = initial(T.value) quirk_names_by_path[T] = initial(T.name) -/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli, spawn_effects, roundstart = FALSE, datum/job/job, silent = FALSE) +/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli, spawn_effects, roundstart = FALSE, datum/job/job, silent = FALSE, mob/to_chat_target) GenerateQuirks(cli) var/list/quirks = cli.prefs.character_quirks.Copy() var/list/cut @@ -34,7 +34,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) for(var/V in quirks) user.add_quirk(V, spawn_effects) if(!silent) - to_chat(user, "The following quirks were cut during assignment either due to a job restriction or another reason: [english_list(cut)].") + to_chat(to_chat_target || user, "The following quirks were cut during assignment either due to a job restriction or another reason: [english_list(cut)].") /datum/controller/subsystem/processing/quirks/proc/quirk_path_by_name(name) return quirks[name] diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index ed9ccad538..94802e3ede 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -374,7 +374,7 @@ SUBSYSTEM_DEF(ticker) if(player.mind.assigned_role != player.mind.special_role) SSjob.EquipRank(N, player.mind.assigned_role, 0) if(CONFIG_GET(flag/roundstart_traits) && ishuman(N.new_character)) - SSquirks.AssignQuirks(N.new_character, N.client, TRUE, TRUE, SSjob.GetJob(player.mind.assigned_role), FALSE) + SSquirks.AssignQuirks(N.new_character, N.client, TRUE, TRUE, SSjob.GetJob(player.mind.assigned_role), FALSE, N) CHECK_TICK if(captainless) for(var/mob/dead/new_player/N in GLOB.player_list) From 67510809ef37079f686d8fc1400e72530211cb90 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 14 Jul 2019 15:14:21 +0100 Subject: [PATCH 378/608] Webedits are a bad trip. --- code/modules/reagents/reagent_containers/pill.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 819361cb4a..38880f669f 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -46,7 +46,7 @@ M.visible_message("[user] forces [M] to [apply_method] [src].", \ "[user] forces [M] to [apply_method] [src].") - var/makes_me_think = pick(strings("redpill.json", "redpill_questions")) + var/makes_me_think = pick(strings("redpill.json", "redpill_questions")) if(icon_state == "pill4" && prob(5)) //you take the red pill - you stay in Wonderland, and I show you how deep the rabbit hole goes addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, M, "[makes_me_think]"), 50) From f08e34cde676ab5ff3374d67d47b537161a19c9f Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 15 Jul 2019 22:13:34 +0100 Subject: [PATCH 379/608] Sigh. --- .../code/modules/reagents/chemistry/recipes/fermi.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 5772e30452..94de9fbf4a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -243,7 +243,8 @@ id = "enthrall" results = list("enthrall" = 0.5) //required_reagents = list("iron" = 1, "iodine" = 1) Test vars - required_reagents = list("cocoa" = 0.1, "astral" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) + //required_reagents = list("cocoa" = 0.1, "astral" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) + required_reagents = list("cocoa" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) //TEMPORARY UNTIL HEADMINS GIVE THE OKAY FOR MK USE. required_catalysts = list("blood" = 1) mix_message = "the reaction gives off a burgundy plume of smoke!" //FermiChem vars: From c746cb3078cadd8a4fc9813465c2524c1bff88e1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 15 Jul 2019 23:07:49 +0100 Subject: [PATCH 380/608] Quick fix --- modular_citadel/code/datums/status_effects/chems.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index e213a5132c..38a6a1cab8 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -598,7 +598,7 @@ //Echo (repeats message!) allows customisation, but won't display var calls! Defaults to hypnophrase. else if (lowertext(customTriggers[trigger][1]) == "echo")//trigger2 - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "[customTriggers[trigger][2]]"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "[customTriggers[trigger][2]]"), 5) //(to_chat(owner, "[customTriggers[trigger][2]]"))//trigger3 //Shocking truth! From d8a46dd0e32d4dc406fd193ba292bda16762fdd9 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 15 Jul 2019 23:10:16 +0100 Subject: [PATCH 381/608] Another fix to reduce spam. --- modular_citadel/code/datums/status_effects/chems.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 38a6a1cab8..7f13e3bf00 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -332,7 +332,7 @@ to_chat(owner, "The separation from [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") if(prob(1)) - if(owner.client?.prefs.lewdchem) + if(owner.client?.prefs.lewdchem && !customEcho) to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken if (mental_capacity >= 499 && (owner.getBrainLoss() <=0 || HAS_TRAIT(M, TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra")) From bb17af0f30ca2dbb4dc82be5fd22bcbb1b3afea3 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 15 Jul 2019 23:30:29 +0100 Subject: [PATCH 382/608] Better limit it a lil. --- .../code/modules/reagents/chemistry/recipes/fermi.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 94de9fbf4a..b9294ecc7c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -244,7 +244,7 @@ results = list("enthrall" = 0.5) //required_reagents = list("iron" = 1, "iodine" = 1) Test vars //required_reagents = list("cocoa" = 0.1, "astral" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) - required_reagents = list("cocoa" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) //TEMPORARY UNTIL HEADMINS GIVE THE OKAY FOR MK USE. + required_reagents = list("cocoa" = 0.1, "bluespace" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) //TEMPORARY UNTIL HEADMINS GIVE THE OKAY FOR MK USE. required_catalysts = list("blood" = 1) mix_message = "the reaction gives off a burgundy plume of smoke!" //FermiChem vars: From ff41020b6f344e959233210066ba8ea717db81d3 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 15 Jul 2019 23:34:55 +0100 Subject: [PATCH 383/608] aaaa No I like it like this.... --- .../code/modules/reagents/chemistry/recipes/fermi.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index b9294ecc7c..83e3e3d445 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -243,8 +243,8 @@ id = "enthrall" results = list("enthrall" = 0.5) //required_reagents = list("iron" = 1, "iodine" = 1) Test vars - //required_reagents = list("cocoa" = 0.1, "astral" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) - required_reagents = list("cocoa" = 0.1, "bluespace" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) //TEMPORARY UNTIL HEADMINS GIVE THE OKAY FOR MK USE. + required_reagents = list("cocoa" = 0.1, "astral" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) + //required_reagents = list("cocoa" = 0.1, "bluespace" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) //TEMPORARY UNTIL HEADMINS GIVE THE OKAY FOR MK USE. required_catalysts = list("blood" = 1) mix_message = "the reaction gives off a burgundy plume of smoke!" //FermiChem vars: From f343ea24dba981553a9905683f9a2d6c1094a259 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 16 Jul 2019 02:06:17 +0100 Subject: [PATCH 384/608] Ugh fine --- .../code/modules/reagents/chemistry/recipes/fermi.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 83e3e3d445..b9294ecc7c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -243,8 +243,8 @@ id = "enthrall" results = list("enthrall" = 0.5) //required_reagents = list("iron" = 1, "iodine" = 1) Test vars - required_reagents = list("cocoa" = 0.1, "astral" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) - //required_reagents = list("cocoa" = 0.1, "bluespace" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) //TEMPORARY UNTIL HEADMINS GIVE THE OKAY FOR MK USE. + //required_reagents = list("cocoa" = 0.1, "astral" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) + required_reagents = list("cocoa" = 0.1, "bluespace" = 0.1, "mindbreaker" = 0.1, "psicodine" = 0.1, "happiness" = 0.1) //TEMPORARY UNTIL HEADMINS GIVE THE OKAY FOR MK USE. required_catalysts = list("blood" = 1) mix_message = "the reaction gives off a burgundy plume of smoke!" //FermiChem vars: From 3512d5eaec7fbe50dec9c99494cfe0dc05043ae2 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 16 Jul 2019 06:00:40 +0100 Subject: [PATCH 385/608] MK only pacifies on withdrawal now. --- modular_citadel/code/datums/status_effects/chems.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 7f13e3bf00..2946040115 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -311,7 +311,6 @@ else to_chat(owner, "You are unable to put up a resistance any longer, and now are under the influence of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot follow [master] in death. ") to_chat(master, "Your [(master.client?.prefs.lewdchem?"pet":"follower")] [owner] appears to have fully fallen under your sway.") - ADD_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") //IMPORTANT log_game("FERMICHEM: MKULTRA: Status on [owner] ckey: [owner.key] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].") SSblackbox.record_feedback("tally", "fermi_chem", 1, "thralls fully enthralled.") else if (resistanceTally > 200) @@ -377,6 +376,7 @@ if(owner.getBrainLoss() >=20) owner.adjustBrainLoss(-0.2) if(withdrawal == TRUE) + REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") @@ -390,6 +390,7 @@ switch(withdrawalTick)//denial if(5)//To reduce spam to_chat(owner, "You are unable to complete [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")]'s orders without their presence, and any commands and objectives given to you prior are not in effect until you are back with them.") + ADD_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") //IMPORTANT if(10 to 35)//Gives wiggle room, so you're not SUPER needy if(prob(5)) to_chat(owner, "You're starting to miss [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")].") From 69725a902b798c91949e0732e390940d05986f10 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 17 Jul 2019 01:10:36 +0100 Subject: [PATCH 386/608] Tweak --- .../code/modules/reagents/chemistry/recipes/fermi.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index b9294ecc7c..801f1d9aae 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -146,8 +146,8 @@ OptimalTempMin = 200 OptimalTempMax = 800 ExplodeTemp = 900 - OptimalpHMin = 8 - OptimalpHMax = 12 + OptimalpHMin = 6 + OptimalpHMax = 10 ReactpHLim = 3 CatalystFact = 0 CurveSharpT = 2 From a5fcb918aa3d3a860d8ed6ab90705935e64f46d6 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 19 Jul 2019 04:11:26 +0100 Subject: [PATCH 387/608] Astrogen tweaks and cat fixes. --- .../modules/mob/living/simple_animal/astral.dm | 4 ++++ .../code/datums/status_effects/chems.dm | 2 ++ .../reagents/chemistry/reagents/astrogen.dm | 18 ++++++++++++++++-- .../reagents/chemistry/recipes/fermi.dm | 8 ++++---- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm index d58c013f10..7e0132ccd3 100644 --- a/code/modules/mob/living/simple_animal/astral.dm +++ b/code/modules/mob/living/simple_animal/astral.dm @@ -22,6 +22,10 @@ speak_emote = list("echos") movement_type = FLYING var/pseudo_death = FALSE + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + unsuitable_atmos_damage = 0 + minbodytemp = 0 + maxbodytemp = 100000 /mob/living/simple_animal/astral/death() icon_state = "shade_dead" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 2946040115..4bc83d2af6 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -576,6 +576,8 @@ /datum/status_effect/chem/enthrall/proc/owner_hear(var/hearer, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + if(owner.client?.prefs.lewdchem == FALSE) + return if (cTriggered > 0) return var/mob/living/carbon/C = owner diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index b9d57f6e71..415dfdf6f2 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -40,6 +40,18 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die ghost.mind.transfer_to(origin) qdel(src) +/datum/reagent/fermi/astral/reaction_turf(turf/T, reac_volume) + if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) + var/turf/open/floor/F = T + F.PlaceOnTop(/turf/open/floor/fakespace) + ..() + +/datum/reagent/fermi/astral/reaction_obj(obj/O, reac_volume) + if(istype(O, /obj/item/bedsheet)) + new /obj/item/bedsheet/cosmos(get_turf(O)) + qdel(O) + + /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! M.alpha = 255 originalmind = M.mind @@ -58,10 +70,12 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die if(prob(50)) to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") do_teleport(G, M.loc) - M.reagents.remove_reagent(id, current_cycle/6, FALSE)//exponent + M.reagents.remove_reagent(id, current_cycle/8, FALSE)//exponent sleepytime+=5 if(G.stat == DEAD || !G || G.pseudo_death == TRUE) - originalmind.transfer_to(M) + G.mind.transfer_to(M) + qdel(G) + if(!G) M.Sleeping(10, 0) ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 801f1d9aae..bed9569024 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -125,7 +125,7 @@ /datum/chemical_reaction/fermi/SDGF/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//Spawns an angery teratoma! var/turf/T = get_turf(my_atom) - var/mob/living/simple_animal/slime/S = new(T,"grey") + var/mob/living/simple_animal/slime/S = new(T,"green") S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) S.name = "Living teratoma" S.real_name = "Living teratoma" @@ -484,14 +484,14 @@ ExplodeTemp = (OptimalTempMax+rand(20, 200)) OptimalpHMin += rand(1, 10) OptimalpHMax = (OptimalpHMin + rand(1, 5)) - ReactpHLim += rand(-1.8, 2) + ReactpHLim += rand(-1.5, 2.5) CurveSharpT += (rand(1, 500)/100) CurveSharppH += (rand(1, 500)/100) ThermicConstant += rand(-20, 20) HIonRelease += (rand(-25, 25)/100) RateUpLim += (rand(1, 1000)/100) PurityMin += (rand(-1, 1)/10) - var/additions = list("aluminium", "silver", "gold", "plasma", "silicon", "bluespace", "uranium", "milk") + var/additions = list("aluminium", "silver", "gold", "plasma", "silicon", "uranium", "milk") required_reagents[pick(additions)] = rand(0.1, 0.5)//weird /datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom) @@ -506,7 +506,7 @@ catto.name = "Chemcat" catto.desc = "A cute chem cat, created by a lot of compicated and confusing chemistry!" catto.color = "#770000" - my_atom.reagents.remove_any(10) + my_atom.reagents.remove_all(5) /datum/chemical_reaction/fermi/yamerol//done test name = "Yamerol" From fbf542134a60fe8fde14d98433225a82a9a4c29e Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 19 Jul 2019 05:18:35 +0100 Subject: [PATCH 388/608] Cidadel makes me want to hurt myself. --- .../mob/living/simple_animal/astral.dm | 8 +++++--- .../reagents/chemistry/reagents/astrogen.dm | 20 +++++++++++-------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm index 7e0132ccd3..bf0c1f8fd8 100644 --- a/code/modules/mob/living/simple_animal/astral.dm +++ b/code/modules/mob/living/simple_animal/astral.dm @@ -10,8 +10,8 @@ response_disarm = "wafts" friendly = "communes with" loot = null - maxHealth = 5 - health = 5 + maxHealth = 10 + health = 10 melee_damage_lower = 0 melee_damage_upper = 0 obj_damage = 0 @@ -41,5 +41,7 @@ if(pseudo_death == FALSE) if(isliving(A)) var/message = html_decode(stripped_input(src, "Enter a message to send to [A]", MAX_MESSAGE_LEN)) - to_chat(A, "[src] projects into your mind, \"[message].\"") + if(!message) + return + to_chat(A, "[src] projects into your mind, \"[message]\"") log_game("FERMICHEM: [src] has astrally transmitted [message] into [A]") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index 415dfdf6f2..c7253c0b28 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -70,25 +70,29 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die if(prob(50)) to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") do_teleport(G, M.loc) - M.reagents.remove_reagent(id, current_cycle/8, FALSE)//exponent + M.reagents.remove_reagent(id, current_cycle/10, FALSE)//exponent sleepytime+=5 - if(G.stat == DEAD || !G || G.pseudo_death == TRUE) - G.mind.transfer_to(M) - qdel(G) - if(!G) - M.Sleeping(10, 0) + if(G.mind) + if(G.stat == DEAD || G.pseudo_death == TRUE) + G.mind.transfer_to(M) + qdel(G) + else + M.Sleeping(20, 0) + M.reagents.remove_reagent(id, 2, FALSE) ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) if(!G) originalmind.transfer_to(M) - else + else if(G.mind) G.mind.transfer_to(origin) - qdel(G) + qdel(G) if(overdosed) to_chat(M, "The high volume of Astrogren you just took causes you to black out momentarily as your mind snaps back to your body.") M.Sleeping(sleepytime, 0) antiGenetics = 255 + if(G)//just in case + qdel(G) ..() //Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 50-80 minutes to die from this. From d73fabffff2d6e76dd7a83c72ff9f181292dd1da Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 19 Jul 2019 05:18:56 +0100 Subject: [PATCH 389/608] . --- .../code/modules/reagents/chemistry/reagents/astrogen.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index c7253c0b28..b7e9ac3268 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -72,10 +72,11 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die do_teleport(G, M.loc) M.reagents.remove_reagent(id, current_cycle/10, FALSE)//exponent sleepytime+=5 - if(G.mind) - if(G.stat == DEAD || G.pseudo_death == TRUE) - G.mind.transfer_to(M) - qdel(G) + if(G)//This is a mess because of how slow qdel is, so this is all to stop runtimes. + if(G.mind) + if(G.stat == DEAD || G.pseudo_death == TRUE) + G.mind.transfer_to(M) + qdel(G) else M.Sleeping(20, 0) M.reagents.remove_reagent(id, 2, FALSE) From b87442e6332cce7f3be48ba12cb1679a26713254 Mon Sep 17 00:00:00 2001 From: Ghommie Date: Fri, 19 Jul 2019 20:09:16 +0200 Subject: [PATCH 390/608] Tones down some items attack stamina costs. kills hypereutactic blades copypasta. --- code/__DEFINES/citadel_defines.dm | 1 - code/__DEFINES/combat.dm | 13 +- code/_onclick/item_attack.dm | 4 + code/game/machinery/computer/arcade.dm | 4 +- code/game/objects/items.dm | 1 + code/game/objects/items/clown_items.dm | 1 + code/game/objects/items/his_grace.dm | 1 + code/game/objects/items/holy_weapons.dm | 9 +- code/game/objects/items/melee/energy.dm | 4 + code/game/objects/items/melee/misc.dm | 7 +- code/game/objects/items/melee/transforming.dm | 5 +- code/game/objects/items/singularityhammer.dm | 2 + code/game/objects/items/toys.dm | 12 +- code/game/objects/items/twohanded.dm | 17 +- code/game/objects/items/weaponry.dm | 5 + .../changeling/powers/mutations.dm | 1 + .../mining/lavaland/necropolis_chests.dm | 2 + .../human/species_types/shadowpeople.dm | 1 + .../xenobiology/crossbreeding/_weapons.dm | 1 + code/modules/zombie/items.dm | 1 + modular_citadel/code/_onclick/item_attack.dm | 6 - .../code/game/machinery/wishgranter.dm | 2 +- modular_citadel/code/game/objects/items.dm | 2 - .../code/game/objects/items/melee/energy.dm | 3 - .../objects/items/melee/eutactic_blades.dm | 147 ++++-------------- .../game/objects/items/melee/transforming.dm | 15 -- .../citadel_ghostrole_spawners.dm | 2 +- .../code/modules/client/loadout/__donator.dm | 2 +- tgstation.dme | 2 - 29 files changed, 110 insertions(+), 163 deletions(-) delete mode 100644 modular_citadel/code/game/objects/items/melee/energy.dm delete mode 100644 modular_citadel/code/game/objects/items/melee/transforming.dm diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 2abe0db04e..ed26128505 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -123,7 +123,6 @@ #define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit #define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations #define STAMINA_CRIT_TRADITIONAL -40 //ditto, but for STAMINA_CRIT -#define MIN_MELEE_STAMCOST 1.25 //Minimum cost for swinging items around. Will be extra useful when stats and skills are introduced. #define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 7cab82149d..ae7ce436ab 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -183,4 +183,15 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define BODY_ZONE_PRECISE_R_FOOT "r_foot" //We will round to this value in damage calculations. -#define DAMAGE_PRECISION 0.1 \ No newline at end of file +#define DAMAGE_PRECISION 0.1 + +//items total mass, used to calculate their attacks' stamina costs. If not defined, the cost will be (w_class * 1.25) +#define TOTAL_MASS_TINY_ITEM 1.25 +#define TOTAL_MASS_SMALL_ITEM 2.5 +#define TOTAL_MASS_NORMAL_ITEM 3.75 +#define TOTAL_MASS_BULKY_ITEM 5 +#define TOTAL_MASS_HUGE_ITEM 6.25 +#define TOTAL_MASS_GIGANTIC_ITEM 7.5 + +#define TOTAL_MASS_HAND_REPLACEMENT 5 //standard punching stamina cost. most hand replacements are huge items anyway. +#define TOTAL_MASS_MEDIEVAL_WEAPON 3.6 //very, very generic average sword/warpick/etc. weight in pounds. diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 3896c3eac3..6455b4ccb6 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -171,3 +171,7 @@ if(prob(2)) playsound(src, 'sound/weapons/dink.ogg', 30, 1) return 1 + +/obj/item/proc/getweight() + return total_mass || w_class * 1.25 + diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 8d0cfb95e8..3710072fa6 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -45,8 +45,8 @@ /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = ARCADE_WEIGHT_TRICK, /obj/item/hot_potato/harmless/toy = ARCADE_WEIGHT_RARE, /obj/item/twohanded/dualsaber/toy = ARCADE_WEIGHT_RARE, - /obj/item/twohanded/hypereutactic/toy = ARCADE_WEIGHT_RARE, - /obj/item/twohanded/hypereutactic/toy/rainbow = ARCADE_WEIGHT_RARE, + /obj/item/twohanded/dualsaber/hypereutactic/toy = ARCADE_WEIGHT_RARE, + /obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow = ARCADE_WEIGHT_RARE, /obj/item/storage/box/snappops = ARCADE_WEIGHT_TRICK, /obj/item/clothing/under/syndicate/tacticool = ARCADE_WEIGHT_TRICK, diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 384a1e4ee4..1c911d889c 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -33,6 +33,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/usesound = null var/throwhitsound = null var/w_class = WEIGHT_CLASS_NORMAL + var/total_mass //Total mass in arbitrary pound-like values. If there's no balance reasons for an item to have otherwise, this var should be the item's weight in pounds. var/slot_flags = 0 //This is used to determine on which slots an item can fit. pass_flags = PASSTABLE pressure_resistance = 4 diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 1d302b409e..0b71396d07 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -111,6 +111,7 @@ throw_speed = 3 throw_range = 7 attack_verb = list("HONKED") + total_mass = 0 /obj/item/bikehorn/Initialize() . = ..() diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index 6e977331a6..44ea5731a8 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -14,6 +14,7 @@ icon = 'icons/obj/items_and_weapons.dmi' w_class = WEIGHT_CLASS_GIGANTIC force = 12 + total_mass = TOTAL_MASS_NORMAL_ITEM // average toolbox attack_verb = list("robusted") hitsound = 'sound/weapons/smash.ogg' var/awakened = FALSE diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 0e8a9fef9e..ad4384f9f5 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -285,14 +285,12 @@ hitsound = 'sound/weapons/sear.ogg' damtype = BURN attack_verb = list("punched", "cross countered", "pummeled") - + total_mass = TOTAL_MASS_HAND_REPLACEMENT /obj/item/nullrod/godhand/Initialize() . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) - - /obj/item/nullrod/staff icon_state = "godstaff-red" item_state = "godstaff-red" @@ -330,6 +328,7 @@ sharpness = IS_SHARP hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON /obj/item/nullrod/claymore/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(attack_type == PROJECTILE_ATTACK) @@ -523,6 +522,7 @@ slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_HUGE attack_verb = list("smashed", "bashed", "hammered", "crunched") + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON /obj/item/nullrod/chainsaw name = "chainsaw hand" @@ -536,6 +536,7 @@ sharpness = IS_SHARP attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' + total_mass = TOTAL_MASS_HAND_REPLACEMENT /obj/item/nullrod/chainsaw/Initialize() . = ..() @@ -612,6 +613,7 @@ item_flags = ABSTRACT w_class = WEIGHT_CLASS_HUGE sharpness = IS_SHARP + total_mass = TOTAL_MASS_HAND_REPLACEMENT /obj/item/nullrod/armblade/Initialize() . = ..() @@ -672,6 +674,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") item_flags = SLOWS_WHILE_IN_HAND + total_mass = TOTAL_MASS_NORMAL_ITEM /obj/item/nullrod/tribal_knife/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 935d2a007e..78be502b08 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -5,9 +5,12 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) resistance_flags = FIRE_PROOF var/brightness_on = 3 + total_mass = 0.4 //Survival flashlights typically weigh around 5 ounces. + /obj/item/melee/transforming/energy/Initialize() . = ..() + total_mass_on = w_class_on * 0.75 if(active) set_light(brightness_on) START_PROCESSING(SSobj, src) @@ -79,6 +82,7 @@ attack_verb_off = list("attacked", "chopped", "cleaved", "torn", "cut") attack_verb_on = list() light_color = "#40ceff" + total_mass = null /obj/item/melee/transforming/energy/axe/suicide_act(mob/user) user.visible_message("[user] swings [src] towards [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 0d45960767..2a656f48cd 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -44,6 +44,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "impaled", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharpness = IS_SHARP + total_mass = TOTAL_MASS_HAND_REPLACEMENT /obj/item/melee/synthetic_arm_blade/Initialize() . = ..() @@ -67,6 +68,7 @@ attack_verb = list("slashed", "cut") hitsound = 'sound/weapons/rapierhit.ogg' materials = list(MAT_METAL = 1000) + total_mass = 3.4 /obj/item/melee/sabre/Initialize() . = ..() @@ -147,8 +149,9 @@ flags_1 = CONDUCT_1 obj_flags = UNIQUE_RENAME w_class = WEIGHT_CLASS_BULKY - sharpness = IS_SHARP_ACCURATE //It cant be sharpend cook -_- + sharpness = IS_SHARP_ACCURATE //It cant be sharpend cook -_- attack_verb = list("slashed", "cut", "pierces", "pokes") + total_mass = 3.4 /obj/item/melee/rapier/Initialize() . = ..() @@ -230,6 +233,7 @@ item_flags = NONE force = 0 on = FALSE + total_mass = TOTAL_MASS_SMALL_ITEM /obj/item/melee/classic_baton/telescopic/suicide_act(mob/user) var/mob/living/carbon/human/H = user @@ -390,6 +394,7 @@ var/static/list/ovens var/on = FALSE var/datum/beam/beam + total_mass = 2.5 /obj/item/melee/roastingstick/Initialize() . = ..() diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm index 0d39e6c847..aabb930bb2 100644 --- a/code/game/objects/items/melee/transforming.dm +++ b/code/game/objects/items/melee/transforming.dm @@ -13,6 +13,7 @@ var/list/nemesis_factions //Any mob with a faction that exists in this list will take bonus damage/effects var/w_class_on = WEIGHT_CLASS_BULKY var/clumsy_check = TRUE + var/total_mass_on //Total mass in ounces when transformed. Primarily for balance purposes. Don't think about it too hard. /obj/item/melee/transforming/Initialize() . = ..() @@ -46,6 +47,7 @@ active = !active if(active) force = force_on + total_mass = total_mass_on throwforce = throwforce_on hitsound = hitsound_on throw_speed = 4 @@ -62,6 +64,7 @@ attack_verb = attack_verb_off icon_state = initial(icon_state) w_class = initial(w_class) + total_mass = initial(total_mass) if(is_sharp()) var/datum/component/butchering/BT = LoadComponent(/datum/component/butchering) BT.butchering_enabled = TRUE @@ -84,4 +87,4 @@ /obj/item/melee/transforming/proc/clumsy_transform_effect(mob/living/user) if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) to_chat(user, "You accidentally cut yourself with [src], like a doofus!") - user.take_bodypart_damage(5,5) + user.take_bodypart_damage(5,5) \ No newline at end of file diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index 1fe57d151f..b6559c9091 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -16,6 +16,7 @@ armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) resistance_flags = FIRE_PROOF | ACID_PROOF force_string = "LORD SINGULOTH HIMSELF" + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON /obj/item/twohanded/singularityhammer/New() ..() @@ -84,6 +85,7 @@ throwforce = 30 throw_range = 7 w_class = WEIGHT_CLASS_HUGE + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON /obj/item/twohanded/mjollnir/proc/shock(mob/living/target) target.Stun(60) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 9ac5261e5f..46b49bac3d 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -30,6 +30,7 @@ throw_speed = 3 throw_range = 7 force = 0 + total_mass = 1.25 /* @@ -112,10 +113,6 @@ /obj/item/toy/syndicateballoon name = "syndicate balloon" desc = "There is a tag on the back that reads \"FUK NT!11!\"." - throwforce = 0 - throw_speed = 3 - throw_range = 7 - force = 0 icon = 'icons/obj/items_and_weapons.dmi' icon_state = "syndballoon" item_state = "syndballoon" @@ -225,6 +222,8 @@ w_class = WEIGHT_CLASS_SMALL attack_verb = list("attacked", "struck", "hit") var/hacked = FALSE + total_mass = 0.4 + var/total_mass_on = 2 /obj/item/toy/sword/attack_self(mob/user) active = !( active ) @@ -274,6 +273,9 @@ else return ..() +/obj/item/toy/sword/getweight() + return (active ? total_mass_on : total_mass) || w_class *1.25 + /* * Foam armblade */ @@ -327,6 +329,7 @@ force_unwielded = 0 force_wielded = 0 attack_verb = list("attacked", "struck", "hit") + total_mass_on = 2.4 /obj/item/twohanded/dualsaber/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) return 0 @@ -346,6 +349,7 @@ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK force = 5 throwforce = 5 + total_mass = null w_class = WEIGHT_CLASS_NORMAL attack_verb = list("attacked", "slashed", "stabbed", "sliced") hitsound = 'sound/weapons/bladeslice.ogg' diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index bf63a96f05..7a7c8d36b3 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -279,6 +279,7 @@ wieldsound = 'sound/weapons/saberon.ogg' unwieldsound = 'sound/weapons/saberoff.ogg' hitsound = "swing_hit" + var/hitsound_on = 'sound/weapons/blade1.ogg' armour_penetration = 35 item_color = "green" light_color = "#00ff00"//green @@ -290,8 +291,10 @@ var/hacked = FALSE var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD var/list/possible_colors = list("red", "blue", "green", "purple") - total_mass = 0.375 //Survival flashlights typically weigh around 5 ounces. - var/total_mass_on = 3.4 //The typical medieval sword, on the other hand, weighs roughly 3 pounds. //Values copied from the regular e-sword + var/list/rainbow_colors = list(LIGHT_COLOR_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER) + var/spinnable = TRUE + total_mass = 0.4 //Survival flashlights typically weigh around 5 ounces. + var/total_mass_on = 3.4 /obj/item/twohanded/dualsaber/suicide_act(mob/living/carbon/user) if(wielded) @@ -353,7 +356,7 @@ if(HAS_TRAIT(user, TRAIT_CLUMSY) && (wielded) && prob(40)) impale(user) return - if((wielded) && prob(50)) + if(spinnable && (wielded) && prob(50)) INVOKE_ASYNC(src, .proc/jedi_spin, user) /obj/item/twohanded/dualsaber/proc/jedi_spin(mob/living/user) @@ -406,11 +409,14 @@ /obj/item/twohanded/dualsaber/process() if(wielded) if(hacked) - light_color = pick(LIGHT_COLOR_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER) + rainbow_process() open_flame() else STOP_PROCESSING(SSobj, src) +/obj/item/twohanded/dualsaber/proc/rainbow_process() + light_color = pick(rainbow_colors) + /obj/item/twohanded/dualsaber/IsReflect() if(wielded) return 1 @@ -428,7 +434,8 @@ playsound(loc, hitsound, get_clamped_volume(), 1, -1) add_fingerprint(user) // Light your candles while spinning around the room - INVOKE_ASYNC(src, .proc/jedi_spin, user) + if(spinnable) + INVOKE_ASYNC(src, .proc/jedi_spin, user) /obj/item/twohanded/dualsaber/green possible_colors = list("green") diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 48681c3d6d..85af9b181f 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -69,6 +69,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON /obj/item/claymore/Initialize() . = ..() @@ -223,6 +224,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON /obj/item/katana/cursed slot_flags = null @@ -431,6 +433,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 sharpness = IS_SHARP attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' + total_mass = TOTAL_MASS_HAND_REPLACEMENT /obj/item/mounted_chainsaw/Initialize() . = ..() @@ -606,6 +609,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throwforce = 0 item_flags = DROPDEL | ABSTRACT attack_verb = list("bopped") + total_mass = 0 /obj/item/slapper name = "slapper" @@ -617,6 +621,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 item_flags = DROPDEL | ABSTRACT attack_verb = list("slapped") hitsound = 'sound/effects/snap.ogg' + total_mass = 0 /obj/item/slapper/attack(mob/M, mob/living/carbon/human/user) if(ishuman(M)) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 4e0595362c..776fe9580b 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -166,6 +166,7 @@ sharpness = IS_SHARP var/can_drop = FALSE var/fake = FALSE + total_mass = TOTAL_MASS_HAND_REPLACEMENT /obj/item/melee/arm_blade/Initialize(mapload,silent,synthetic) . = ..() diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index abcb6d5911..7add723a06 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -641,6 +641,8 @@ nemesis_factions = list("mining", "boss") var/transform_cooldown var/swiping = FALSE + total_mass = 2.75 + total_mass_on = 5 /obj/item/melee/transforming/cleaving_saw/examine(mob/user) ..() diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 11a25cea6c..754c48c3bd 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -174,6 +174,7 @@ item_flags = ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE sharpness = IS_SHARP + total_mass = TOTAL_MASS_HAND_REPLACEMENT /obj/item/light_eater/Initialize() . = ..() diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 141e6b1fe1..62efbe99a0 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -14,6 +14,7 @@ recharge_rate = 1 ammo_type = /obj/item/ammo_casing/magic/bloodchill fire_sound = 'sound/effects/attackblob.ogg' + total_mass = TOTAL_MASS_HAND_REPLACEMENT /obj/item/gun/magic/bloodchill/Initialize() . = ..() diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 9a2455f56d..ae53f29a55 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -13,6 +13,7 @@ hitsound = 'sound/hallucinations/growl1.ogg' force = 21 // Just enough to break airlocks with melee attacks damtype = "brute" + total_mass = TOTAL_MASS_HAND_REPLACEMENT /obj/item/zombie_hand/Initialize() . = ..() diff --git a/modular_citadel/code/_onclick/item_attack.dm b/modular_citadel/code/_onclick/item_attack.dm index dcc9f567e2..80281ee084 100644 --- a/modular_citadel/code/_onclick/item_attack.dm +++ b/modular_citadel/code/_onclick/item_attack.dm @@ -17,9 +17,3 @@ /obj/item/proc/altafterattack(atom/target, mob/user, proximity_flag, click_parameters) return FALSE - -/obj/item/proc/getweight() - if(total_mass) - return max(total_mass,MIN_MELEE_STAMCOST) - else - return w_class*1.25 diff --git a/modular_citadel/code/game/machinery/wishgranter.dm b/modular_citadel/code/game/machinery/wishgranter.dm index f7c2c57d08..f24062a126 100644 --- a/modular_citadel/code/game/machinery/wishgranter.dm +++ b/modular_citadel/code/game/machinery/wishgranter.dm @@ -95,7 +95,7 @@ killwish.grasp_range = 6 killwish.melee_damage_upper = 30 killwish.grasp_chance = 50 - killwish.loot = list(/obj/item/twohanded/hypereutactic) + killwish.loot = list(/obj/item/twohanded/dualsaber/hypereutactic) charges-- insisting = FALSE if(!charges) diff --git a/modular_citadel/code/game/objects/items.dm b/modular_citadel/code/game/objects/items.dm index 337db986b0..c94923f9de 100644 --- a/modular_citadel/code/game/objects/items.dm +++ b/modular_citadel/code/game/objects/items.dm @@ -1,6 +1,4 @@ /obj/item - var/total_mass //Total mass in arbitrary pound-like values. If there's no balance reasons for an item to have otherwise, this var should be the item's weight in pounds. - var/list/alternate_screams = list() //REEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE // lazy for screaming. diff --git a/modular_citadel/code/game/objects/items/melee/energy.dm b/modular_citadel/code/game/objects/items/melee/energy.dm deleted file mode 100644 index c37f88eacf..0000000000 --- a/modular_citadel/code/game/objects/items/melee/energy.dm +++ /dev/null @@ -1,3 +0,0 @@ -/obj/item/melee/transforming/energy/sword - total_mass = 0.375 //Survival flashlights typically weigh around 5 ounces. - total_mass_on = 3.4 //The typical medieval sword, on the other hand, weighs roughly 3 pounds. diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm index 6e28a3115f..8be60107cf 100644 --- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm +++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm @@ -124,7 +124,7 @@ return else to_chat(user, "You combine the two light swords, making a single supermassive blade! You're cool.") - new /obj/item/twohanded/hypereutactic(user.drop_location()) + new /obj/item/twohanded/dualsaber/hypereutactic(user.drop_location()) qdel(W) qdel(src) else @@ -233,7 +233,7 @@ return else to_chat(user, "You combine the two plastic swords, making a single supermassive toy! You're fake-cool.") - new /obj/item/twohanded/hypereutactic/toy(user.loc) + new /obj/item/twohanded/dualsaber/hypereutactic/toy(user.loc) qdel(W) qdel(src) else @@ -247,7 +247,7 @@ // HYPEREUTACTIC Blades ///////////////////////// ///////////////////////////////////////////////////// -/obj/item/twohanded/hypereutactic +/obj/item/twohanded/dualsaber/hypereutactic icon = 'modular_citadel/icons/eutactic/item/hypereutactic.dmi' icon_state = "hypereutactic" lefthand_file = 'modular_citadel/icons/eutactic/mob/hypereutactic_left.dmi' @@ -258,58 +258,37 @@ name = "hypereutactic blade" desc = "A supermassive weapon envisioned to cleave the very fabric of space and time itself in twain, the hypereutactic blade dynamically flash-forges a hypereutactic crystaline nanostructure capable of passing through most known forms of matter like a hot knife through butter." force = 7 - throwforce = 5 - throw_speed = 3 - throw_range = 5 - w_class = WEIGHT_CLASS_SMALL - var/w_class_on = WEIGHT_CLASS_BULKY force_unwielded = 7 force_wielded = 40 wieldsound = 'sound/weapons/nebon.ogg' unwieldsound = 'sound/weapons/neboff.ogg' - hitsound = "swing_hit" + hitsound_on = 'sound/weapons/nebhit.ogg' armour_penetration = 60 light_color = "#37FFF7" + rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00") attack_verb = list("attacked", "slashed", "stabbed", "sliced", "destroyed", "ripped", "devastated", "shredded") - block_chance = 75 - max_integrity = 200 - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70) - resistance_flags = FIRE_PROOF - var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD item_flags = SLOWS_WHILE_IN_HAND + spinnable = FALSE + total_mass_on = 4 -/obj/item/twohanded/hypereutactic/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes +/obj/item/twohanded/dualsaber/hypereutactic/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes altafterattack(A, user, TRUE, params) return TRUE -/obj/item/twohanded/hypereutactic/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) //does right click memes +/obj/item/twohanded/dualsaber/hypereutactic/altafterattack(atom/target, mob/living/user, proximity_flag, click_parameters) //does right click memes if(istype(user)) user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].") return TRUE -/obj/item/twohanded/hypereutactic/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds. - if(M.has_dna()) - if(M.dna.check_mutation(HULK)) - to_chat(M, "You lack the grace to wield this!") - return - ..() - if(wielded) - sharpness = IS_SHARP - w_class = w_class_on - hitsound = 'sound/weapons/nebhit.ogg' - START_PROCESSING(SSobj, src) - set_light(brightness_on) +/obj/item/twohanded/dualsaber/hypereutactic/wield() + . = ..() + slowdown = 0.5 -/obj/item/twohanded/hypereutactic/unwield() //Specific unwield () to switch hitsounds. - sharpness = initial(sharpness) - w_class = initial(w_class) - ..() - hitsound = "swing_hit" - STOP_PROCESSING(SSobj, src) - set_light(0) +/obj/item/twohanded/dualsaber/hypereutactic/unwield() + . = ..() slowdown = initial(slowdown) -/obj/item/twohanded/hypereutactic/update_icon() +/obj/item/twohanded/dualsaber/hypereutactic/update_icon() var/mutable_appearance/blade_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/hypereutactic.dmi', "hypereutactic_blade") var/mutable_appearance/gem_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/hypereutactic.dmi', "hypereutactic_gem") @@ -329,21 +308,21 @@ SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)//blood overlays get weird otherwise, because the sprite changes. (retained from original desword because I have no idea what this is) -/obj/item/twohanded/hypereutactic/AltClick(mob/living/user) - if(!in_range(src, user)) //Basic checks to prevent abuse +/obj/item/twohanded/dualsaber/hypereutactic/AltClick(mob/living/user) + if(!user.canUseTopic(src, BE_CLOSE, FALSE) || hacked) return if(user.incapacitated() || !istype(user)) to_chat(user, "You can't do that right now!") return - if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes") var/energy_color_input = input(usr,"","Choose Energy Color",light_color) as color|null - if(energy_color_input) - light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) + if(!energy_color_input || !user.canUseTopic(src, BE_CLOSE, FALSE) || hacked) + return + light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) update_icon() update_light() -/obj/item/twohanded/hypereutactic/worn_overlays(isinhands, icon_file) +/obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file) . = ..() if(isinhands) var/mutable_appearance/gem_inhand = mutable_appearance(icon_file, "hypereutactic_gem") @@ -354,70 +333,19 @@ blade_inhand.color = light_color . += blade_inhand -/obj/item/twohanded/hypereutactic/examine(mob/user) +/obj/item/twohanded/dualsaber/hypereutactic/examine(mob/user) ..() - to_chat(user, "Alt-click to recolor it.") + if(!hacked) + to_chat(user, "Alt-click to recolor it.") -////////// stuff beneath this is all taken from the desword //////////// wow very professional such OOP wow - -/obj/item/twohanded/hypereutactic/attack(mob/target, mob/living/carbon/human/user) - if(user.has_dna()) - if(user.dna.check_mutation(HULK)) - to_chat(user, "You grip the blade too hard and accidentally close it!") - unwield() - return - ..() - if(HAS_TRAIT(user, TRAIT_CLUMSY) && (wielded) && prob(40)) - impale(user) - return - -/obj/item/twohanded/hypereutactic/Destroy() - STOP_PROCESSING(SSobj, src) +/obj/item/twohanded/dualsaber/hypereutactic/rainbow_process() . = ..() - -/obj/item/twohanded/hypereutactic/proc/impale(mob/living/user) - to_chat(user, "You spin around a bit before losing your balance and impaling yourself on [src].") - if (force_wielded) - user.take_bodypart_damage(20,25) - else - user.adjustStaminaLoss(25) - -/obj/item/twohanded/hypereutactic/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(wielded) - return ..() - return FALSE - -/obj/item/twohanded/hypereutactic/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up - if(wielded) - to_chat(user, "You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!") - return TRUE - -/obj/item/twohanded/hypereutactic/process() - if(wielded) - open_flame() - else - STOP_PROCESSING(SSobj, src) - -/obj/item/twohanded/hypereutactic/IsReflect() - if(wielded) - return TRUE - -/obj/item/twohanded/hypereutactic/ignition_effect(atom/A, mob/user) - // same as /obj/item/melee/transforming/energy, mostly - if(!wielded) - return "" - var/in_mouth = "" - if(iscarbon(user)) - var/mob/living/carbon/C = user - if(C.wear_mask == src) - in_mouth = ", barely missing their nose" - . = "[user] swings [user.p_their()] [src][in_mouth]. [user.p_they()] light[user.p_s()] [A] in the process." - playsound(loc, hitsound, get_clamped_volume(), 1, -1) - add_fingerprint(user) + update_icon() + update_light() ////////////////// TOY VERSION ///////////////////////////// -/obj/item/twohanded/hypereutactic/toy +/obj/item/twohanded/dualsaber/hypereutactic/toy name = "\improper DX Hyper-Euplastic LightSword" desc = "A supermassive toy envisioned to cleave the very fabric of space and time itself in twain. Realistic visuals and sounds! Ages 8 and up." force = 0 @@ -427,11 +355,12 @@ force_unwielded = 0 force_wielded = 0 attack_verb = list("attacked", "struck", "hit") + total_mass_on = 2.4 -/obj/item/twohanded/hypereutactic/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/twohanded/dualsaber/hypereutactic/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) return FALSE -/obj/item/twohanded/hypereutactic/toy/IsReflect()//Stops it from reflecting energy projectiles +/obj/item/twohanded/dualsaber/hypereutactic/toy/IsReflect()//Stops it from reflecting energy projectiles return FALSE //////// Tatortot NEB /////////////// (same stats as regular esword) @@ -455,17 +384,7 @@ //RAINBOW MEMES -/obj/item/twohanded/hypereutactic/toy/rainbow +/obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow name = "\improper Hyper-Euclidean Reciprocating Trigonometric Zweihander" desc = "A custom-built toy with fancy rainbow lights built-in." - var/list/rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00") - -/obj/item/twohanded/hypereutactic/toy/rainbow/process() - . = ..() - var/set_color = pick(rainbow_colors) - light_color = set_color - update_light() - update_icon() - -/obj/item/twohanded/hypereutactic/toy/rainbow/AltClick(mob/living/user) - return + hacked = TRUE \ No newline at end of file diff --git a/modular_citadel/code/game/objects/items/melee/transforming.dm b/modular_citadel/code/game/objects/items/melee/transforming.dm deleted file mode 100644 index 46610f4e54..0000000000 --- a/modular_citadel/code/game/objects/items/melee/transforming.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/item/melee/transforming - var/total_mass_on //Total mass in ounces when transformed. Primarily for balance purposes. Don't think about it too hard. - -/obj/item/melee/transforming/getweight() - if(total_mass && total_mass_on) - if(active) - return max(total_mass_on,MIN_MELEE_STAMCOST) - else - return max(total_mass,MIN_MELEE_STAMCOST) - else - return initial(w_class)*1.25 - -/obj/item/melee/transforming/cleaving_saw - total_mass = 2.75 - total_mass_on = 5 diff --git a/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm b/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm index f6991f1d9f..ccbf9a42fe 100644 --- a/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm +++ b/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm @@ -49,7 +49,7 @@ /datum/outfit/lavaknight/captain name ="Cydonian Knight Captain" - l_pocket = /obj/item/twohanded/hypereutactic + l_pocket = /obj/item/twohanded/dualsaber/hypereutactic /datum/outfit/lavaknight/captain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 90172bbf43..ce28145dc2 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -220,7 +220,7 @@ /datum/gear/torisword name = "Rainbow Zweihander" category = SLOT_IN_BACKPACK - path = /obj/item/twohanded/hypereutactic/toy/rainbow + path = /obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow ckeywhitelist = list("annoymous35") /datum/gear/darksabre diff --git a/tgstation.dme b/tgstation.dme index 6aee7dffa1..05cd66987b 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2892,10 +2892,8 @@ #include "modular_citadel\code\game\objects\items\devices\radio\encryptionkey.dm" #include "modular_citadel\code\game\objects\items\devices\radio\headset.dm" #include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm" -#include "modular_citadel\code\game\objects\items\melee\energy.dm" #include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm" #include "modular_citadel\code\game\objects\items\melee\misc.dm" -#include "modular_citadel\code\game\objects\items\melee\transforming.dm" #include "modular_citadel\code\game\objects\items\robot\robot_upgrades.dm" #include "modular_citadel\code\game\objects\items\storage\firstaid.dm" #include "modular_citadel\code\game\objects\structures\tables_racks.dm" From 12f2b767ab8bf345b0f87cc7bff2513fe7daaa10 Mon Sep 17 00:00:00 2001 From: Ghommie Date: Fri, 19 Jul 2019 21:23:07 +0200 Subject: [PATCH 391/608] removes stamina-free spammability. --- code/game/objects/items/clown_items.dm | 1 - code/game/objects/items/weaponry.dm | 2 -- 2 files changed, 3 deletions(-) diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 0b71396d07..1d302b409e 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -111,7 +111,6 @@ throw_speed = 3 throw_range = 7 attack_verb = list("HONKED") - total_mass = 0 /obj/item/bikehorn/Initialize() . = ..() diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 85af9b181f..560731edfd 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -609,7 +609,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throwforce = 0 item_flags = DROPDEL | ABSTRACT attack_verb = list("bopped") - total_mass = 0 /obj/item/slapper name = "slapper" @@ -621,7 +620,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 item_flags = DROPDEL | ABSTRACT attack_verb = list("slapped") hitsound = 'sound/effects/snap.ogg' - total_mass = 0 /obj/item/slapper/attack(mob/M, mob/living/carbon/human/user) if(ishuman(M)) From 94f5573e3a95d749d67a663605ff18c5f4b4bc6a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 19 Jul 2019 17:45:44 -0700 Subject: [PATCH 392/608] Update nanites.dm --- code/datums/diseases/advance/symptoms/nanites.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/diseases/advance/symptoms/nanites.dm b/code/datums/diseases/advance/symptoms/nanites.dm index f288b24068..b18e089a41 100644 --- a/code/datums/diseases/advance/symptoms/nanites.dm +++ b/code/datums/diseases/advance/symptoms/nanites.dm @@ -25,7 +25,7 @@ if(!..()) return var/mob/living/carbon/M = A.affected_mob - SEND_SIGNAL(M, COMSIG_NANITE_ADJUST_VOLUME, src, power) + SEND_SIGNAL(M, COMSIG_NANITE_ADJUST_VOLUME, power) if(reverse_boost && SEND_SIGNAL(M, COMSIG_HAS_NANITES)) if(prob(A.stage_prob)) A.stage = min(A.stage + 1,A.max_stages) From 85f87b667984c4bd7809faf697eb800a643d5453 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sat, 20 Jul 2019 21:26:18 +0200 Subject: [PATCH 393/608] Update code/game/objects/items/melee/energy.dm Co-Authored-By: deathride58 --- code/game/objects/items/melee/energy.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 78be502b08..d854ab9f5a 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -10,7 +10,7 @@ /obj/item/melee/transforming/energy/Initialize() . = ..() - total_mass_on = w_class_on * 0.75 + total_mass_on = (total_mass_on ? total_mass_on : (w_class_on * 0.75)) if(active) set_light(brightness_on) START_PROCESSING(SSobj, src) From f8fdbfc211b2f7221d652a19aa4a8bca2a1d0b64 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sun, 21 Jul 2019 02:30:19 -0700 Subject: [PATCH 394/608] Update quirks.dm --- code/controllers/subsystem/processing/quirks.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index dbf41ce0c4..bd939cf977 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -34,7 +34,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) for(var/V in quirks) user.add_quirk(V, spawn_effects) if(!silent) - to_chat(to_chat_target || user, "The following quirks were cut during assignment either due to a job restriction or another reason: [english_list(cut)].") + to_chat(to_chat_target || user, "All of your non-neutral character quirks have been cut due to these quirks conflicting with your job assignment: [english_list(cut)].") /datum/controller/subsystem/processing/quirks/proc/quirk_path_by_name(name) return quirks[name] @@ -81,7 +81,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) if(cut.len) for(var/i in quirks) if(quirk_points_by_name(i) != 0) - cut += i + //cut += i -- Commented out: Only show the ones that triggered the quirk purge. quirks -= i return cut From 6c712a69319f5da6911b04b0801d1ba477966e6b Mon Sep 17 00:00:00 2001 From: Ghommie Date: Wed, 24 Jul 2019 17:58:24 +0200 Subject: [PATCH 395/608] Implementing nerfs. --- code/__DEFINES/combat.dm | 1 + code/game/objects/items/toys.dm | 10 +++++----- code/game/objects/items/twohanded.dm | 6 ++++-- code/modules/antagonists/cult/cult_items.dm | 1 - code/modules/awaymissions/capture_the_flag.dm | 1 - .../game/objects/items/melee/eutactic_blades.dm | 13 +++---------- 6 files changed, 13 insertions(+), 19 deletions(-) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index ae7ce436ab..e31d2a278e 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -195,3 +195,4 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define TOTAL_MASS_HAND_REPLACEMENT 5 //standard punching stamina cost. most hand replacements are huge items anyway. #define TOTAL_MASS_MEDIEVAL_WEAPON 3.6 //very, very generic average sword/warpick/etc. weight in pounds. +#define TOTAL_MASS_TOY_SWORD 1.5 diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 46b49bac3d..46fabea8b0 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -30,7 +30,7 @@ throw_speed = 3 throw_range = 7 force = 0 - total_mass = 1.25 + total_mass = TOTAL_MASS_TINY_ITEM /* @@ -223,7 +223,7 @@ attack_verb = list("attacked", "struck", "hit") var/hacked = FALSE total_mass = 0.4 - var/total_mass_on = 2 + var/total_mass_on = TOTAL_MASS_TOY_SWORD /obj/item/toy/sword/attack_self(mob/user) active = !( active ) @@ -329,13 +329,13 @@ force_unwielded = 0 force_wielded = 0 attack_verb = list("attacked", "struck", "hit") - total_mass_on = 2.4 + total_mass_on = TOTAL_MASS_TOY_SWORD /obj/item/twohanded/dualsaber/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - return 0 + return FALSE /obj/item/twohanded/dualsaber/toy/IsReflect()//Stops Toy Dualsabers from reflecting energy projectiles - return 0 + return FALSE /obj/item/toy/katana name = "replica katana" diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index 7a7c8d36b3..781a82513e 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -28,6 +28,8 @@ var/force_wielded = 0 var/wieldsound = null var/unwieldsound = null + var/slowdown_wielded = 0 + item_flags = SLOWS_WHILE_IN_HAND /obj/item/twohanded/proc/unwield(mob/living/carbon/user, show_message = TRUE) if(!wielded || !user) @@ -55,7 +57,7 @@ var/obj/item/twohanded/offhand/O = user.get_inactive_held_item() if(O && istype(O)) O.unwield() - return + slowdown -= slowdown_wielded /obj/item/twohanded/proc/wield(mob/living/carbon/user) if(wielded) @@ -85,7 +87,7 @@ O.desc = "Your second grip on [src]." O.wielded = TRUE user.put_in_inactive_hand(O) - return + slowdown += slowdown_wielded /obj/item/twohanded/dropped(mob/user) . = ..() diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 9a17c3270b..9c429dd777 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -105,7 +105,6 @@ inhand_x_dimension = 64 inhand_y_dimension = 64 actions_types = list() - item_flags = SLOWS_WHILE_IN_HAND var/datum/action/innate/dash/cult/jaunt var/datum/action/innate/cult/spin2win/linked_action var/spinning = FALSE diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index fcfdd7c455..84f08197b4 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -24,7 +24,6 @@ armour_penetration = 1000 resistance_flags = INDESTRUCTIBLE anchored = TRUE - item_flags = SLOWS_WHILE_IN_HAND var/team = WHITE_TEAM var/reset_cooldown = 0 var/anyonecanpickup = TRUE diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm index 8be60107cf..68ab229f0a 100644 --- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm +++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm @@ -263,11 +263,11 @@ wieldsound = 'sound/weapons/nebon.ogg' unwieldsound = 'sound/weapons/neboff.ogg' hitsound_on = 'sound/weapons/nebhit.ogg' + slowdown_wielded = 1 armour_penetration = 60 light_color = "#37FFF7" rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00") attack_verb = list("attacked", "slashed", "stabbed", "sliced", "destroyed", "ripped", "devastated", "shredded") - item_flags = SLOWS_WHILE_IN_HAND spinnable = FALSE total_mass_on = 4 @@ -280,14 +280,6 @@ user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].") return TRUE -/obj/item/twohanded/dualsaber/hypereutactic/wield() - . = ..() - slowdown = 0.5 - -/obj/item/twohanded/dualsaber/hypereutactic/unwield() - . = ..() - slowdown = initial(slowdown) - /obj/item/twohanded/dualsaber/hypereutactic/update_icon() var/mutable_appearance/blade_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/hypereutactic.dmi', "hypereutactic_blade") var/mutable_appearance/gem_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/hypereutactic.dmi', "hypereutactic_gem") @@ -355,7 +347,8 @@ force_unwielded = 0 force_wielded = 0 attack_verb = list("attacked", "struck", "hit") - total_mass_on = 2.4 + total_mass_on = TOTAL_MASS_TOY_SWORD + slowdown_wielded = 0 /obj/item/twohanded/dualsaber/hypereutactic/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) return FALSE From c3e4fa8802a01a7ae5105e678b0a7f880e40bbaf Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Thu, 25 Jul 2019 13:32:42 -0400 Subject: [PATCH 396/608] Update facehugger.dm --- code/modules/mob/living/carbon/alien/special/facehugger.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index c2c8904aa1..1127f15f48 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -38,11 +38,13 @@ /obj/item/clothing/mask/facehugger/dead icon_state = "facehugger_dead" item_state = "facehugger_inactive" + sterile = 1 stat = DEAD /obj/item/clothing/mask/facehugger/impregnated icon_state = "facehugger_impregnated" item_state = "facehugger_impregnated" + sterile = 1 stat = DEAD /obj/item/clothing/mask/facehugger/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) From 123c9199ba77d996e9c65fbc66c3b64d1be0f269 Mon Sep 17 00:00:00 2001 From: Thalpy Date: Thu, 25 Jul 2019 20:51:09 +0100 Subject: [PATCH 397/608] Added Eigenlockers. I love them. --- .../structures/crates_lockers/closets.dm | 9 +++++- .../chemistry/reagents/eigentstasium.dm | 29 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 2c4463928c..f44f954a31 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -34,6 +34,8 @@ var/delivery_icon = "deliverycloset" //which icon to use when packagewrapped. null to be unwrappable. var/anchorable = TRUE var/icon_welded = "welded" + var/eigen_teleport = FALSE //If the closet leads to Mr Tumnus. + var/obj/structure/closet/eigen_target //Where you go to. /obj/structure/closet/Initialize(mapload) @@ -148,7 +150,12 @@ if(contents.len >= storage_capacity) return -1 if(insertion_allowed(AM)) - AM.forceMove(src) + if(eigen_teleport) // For teleporting people with linked lockers. + do_teleport(AM, get_turf(eigen_target), 0) + if(eigen_target.opened == FALSE) + eigen_target.open() + else + AM.forceMove(src) return TRUE else return FALSE diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index 399d9eeb1a..bf915d5b6f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -171,4 +171,33 @@ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[id]_overdose")//holdover until above fix works ..() +/datum/reagent/fermi/eigenstate/reaction_turf(turf/T, reac_volume) + //if(cached_purity < 0.99) To add with next batch of fixes and tweaks. + var/obj/structure/closet/First + var/obj/structure/closet/Previous + for(var/obj/structure/closet/C in T.contents) + if(C.eigen_teleport == TRUE) + C.visible_message("[C] fizzes, it's already linked to something else!") + continue + if(!Previous) + First = C + Previous = C + continue + C.eigen_teleport = TRUE + C.eigen_target = Previous + C.color = "#9999FF" //Tint the locker slightly. + C.alpha = 200 + do_sparks(5,FALSE,C) + Previous = C + if(!First) + return + if(Previous == First) + return + First.eigen_teleport = TRUE + First.eigen_target = Previous + First.color = "#9999FF" + First.alpha = 200 + do_sparks(5,FALSE,First) + First.visible_message("The lockers' eigenstates spilt and merge, linking each of their contents together.") + //eigenstate END From 175b69e86895e1518ad903be1ab63045e519810c Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 25 Jul 2019 23:18:31 -0700 Subject: [PATCH 398/608] headmins have decided --- code/modules/jobs/job_types/captain.dm | 4 ++-- code/modules/jobs/job_types/cargo_service.dm | 2 +- code/modules/jobs/job_types/engineering.dm | 2 +- code/modules/jobs/job_types/medical.dm | 2 +- code/modules/jobs/job_types/science.dm | 2 +- code/modules/jobs/job_types/security.dm | 5 ++++- 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index af9e57ff2c..6e09ced0e5 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -21,7 +21,7 @@ Captain access = list() //See get_access() minimal_access = list() //See get_access() - blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) /datum/job/captain/get_access() return get_all_accesses() @@ -96,7 +96,7 @@ Head of Personnel ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) - blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/prosopagnosia) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/prosopagnosia, /datum/quirk/insanity) /datum/outfit/job/hop name = "Head of Personnel" diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm index a8d64e8013..c07520570c 100644 --- a/code/modules/jobs/job_types/cargo_service.dm +++ b/code/modules/jobs/job_types/cargo_service.dm @@ -17,7 +17,7 @@ Quartermaster access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) - blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) /datum/outfit/job/quartermaster name = "Quartermaster" diff --git a/code/modules/jobs/job_types/engineering.dm b/code/modules/jobs/job_types/engineering.dm index 0477bdf43e..4381fe2613 100644 --- a/code/modules/jobs/job_types/engineering.dm +++ b/code/modules/jobs/job_types/engineering.dm @@ -29,7 +29,7 @@ Chief Engineer ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) - blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity) /datum/outfit/job/ce name = "Chief Engineer" diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index 2f48f89ce4..1dc35f40db 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -27,7 +27,7 @@ Chief Medical Officer ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) - blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) /datum/outfit/job/cmo name = "Chief Medical Officer" diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm index 846403b279..99591f37f6 100644 --- a/code/modules/jobs/job_types/science.dm +++ b/code/modules/jobs/job_types/science.dm @@ -31,7 +31,7 @@ Research Director ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) - blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) /datum/outfit/job/rd name = "Research Director" diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm index d216320d2d..121c9b7017 100644 --- a/code/modules/jobs/job_types/security.dm +++ b/code/modules/jobs/job_types/security.dm @@ -37,7 +37,7 @@ Head of Security mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) - blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/insanity) /datum/outfit/job/hos name = "Head of Security" @@ -97,6 +97,7 @@ Warden minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //SEE /DATUM/JOB/WARDEN/GET_ACCESS() mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic) /datum/job/warden/get_access() var/list/L = list() @@ -152,6 +153,7 @@ Detective minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic) /datum/outfit/job/detective name = "Detective" @@ -207,6 +209,7 @@ Security Officer minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //BUT SEE /DATUM/JOB/WARDEN/GET_ACCESS() mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic) /datum/job/officer/get_access() var/list/L = list() From 4a6982658f17a7994f62b9fa5b62206a4d013850 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Fri, 26 Jul 2019 22:04:21 -0400 Subject: [PATCH 399/608] true --- code/modules/mob/living/carbon/alien/special/facehugger.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 1127f15f48..62a31965ec 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -33,18 +33,18 @@ /obj/item/clothing/mask/facehugger/lamarr name = "Lamarr" - sterile = 1 + sterile = TRUE /obj/item/clothing/mask/facehugger/dead icon_state = "facehugger_dead" item_state = "facehugger_inactive" - sterile = 1 + sterile = TRUE stat = DEAD /obj/item/clothing/mask/facehugger/impregnated icon_state = "facehugger_impregnated" item_state = "facehugger_impregnated" - sterile = 1 + sterile = TRUE stat = DEAD /obj/item/clothing/mask/facehugger/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) From 5055cd73b91f143899b313e11e755701eec93121 Mon Sep 17 00:00:00 2001 From: Chayse Ramsay Date: Sun, 28 Jul 2019 17:31:59 +0100 Subject: [PATCH 400/608] Hardsuit Helmets can now be used as internals masks. Rejoice, CE mains. Also reworks internals code a little to be much more friendly. Any head or mask item with the flag should now function as an internals mask if it has the ALLOWSINTERNALS flag. --- code/__DEFINES/obj_flags.dm | 2 +- code/_globalvars/bitfields.dm | 2 +- code/_onclick/hud/screen_objects.dm | 23 +++++++++++-------- code/game/objects/items/tanks/tanks.dm | 20 ++++++++++------ code/modules/clothing/chameleon.dm | 2 +- code/modules/clothing/masks/breath.dm | 4 ++-- code/modules/clothing/masks/gasmask.dm | 14 +++++------ code/modules/clothing/masks/hailer.dm | 4 ++-- .../clothing/spacesuits/_spacesuits.dm | 2 +- .../modules/mining/equipment/explorer_gear.dm | 2 +- .../living/carbon/alien/special/facehugger.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 4 ++-- .../mob/living/carbon/human/inventory.dm | 6 +++++ code/modules/mob/living/carbon/life.dm | 12 +++++++++- 14 files changed, 62 insertions(+), 37 deletions(-) diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 5c21fbbc71..01d95d7ff9 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -33,7 +33,7 @@ #define LAVAPROTECT (1<<0) #define STOPSPRESSUREDAMAGE (1<<1) //SUIT and HEAD items which stop pressure damage. To stop you taking all pressure damage you must have both a suit and head item with this flag. #define BLOCK_GAS_SMOKE_EFFECT (1<<2) // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! -#define MASKINTERNALS (1<<3) // mask allows internals +#define ALLOWINTERNALS (1<<3) // mask allows internals #define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc #define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. #define VOICEBOX_TOGGLABLE (1<<6) // The voicebox in this clothing can be toggled. diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index bb9fc98b8e..3b32745b5c 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -136,7 +136,7 @@ GLOBAL_LIST_INIT(bitfields, list( "LAVAPROTECT" = LAVAPROTECT, "STOPSPRESSUREDAMAGE" = STOPSPRESSUREDAMAGE, "BLOCK_GAS_SMOKE_EFFECT" = BLOCK_GAS_SMOKE_EFFECT, - "MASKINTERNALS" = MASKINTERNALS, + "ALLOWINTERNALS" = ALLOWINTERNALS, "NOSLIP" = NOSLIP, "THICKMATERIAL" = THICKMATERIAL, "VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE, diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 5ee4ae0f8a..caa8d23df4 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -280,7 +280,7 @@ /obj/screen/internals/Click() if(!iscarbon(usr)) return - var/mob/living/carbon/C = usr + var/mob/living/carbon/human/C = usr if(C.incapacitated()) return @@ -290,16 +290,19 @@ icon_state = "internal0" else if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE)) - if(!istype(C.wear_mask, /obj/item/clothing/mask)) + var/obj/item/clothing/check + var/internals = FALSE + + for(check in C.get_internal_slots()) + if(istype(check, /obj/item/clothing/mask)) + var/obj/item/clothing/mask/M = check + if(M.mask_adjusted) + M.adjustmask(C) + if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS)) + internals = TRUE + if(!internals) to_chat(C, "You are not wearing an internals mask!") - return 1 - else - var/obj/item/clothing/mask/M = C.wear_mask - if(M.mask_adjusted) // if mask on face but pushed down - M.adjustmask(C) // adjust it back - if( !(M.clothing_flags & MASKINTERNALS) ) - to_chat(C, "You are not wearing an internals mask!") - return + return var/obj/item/I = C.is_holding_item_of_type(/obj/item/tank) if(I) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 1245b7de94..3cc5249b56 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -33,13 +33,19 @@ H.update_internals_hud_icon(0) else if(!H.getorganslot(ORGAN_SLOT_BREATHING_TUBE)) - if(!H.wear_mask) - to_chat(H, "You need a mask!") - return - if(H.wear_mask.mask_adjusted) - H.wear_mask.adjustmask(H) - if(!(H.wear_mask.clothing_flags & MASKINTERNALS)) - to_chat(H, "[H.wear_mask] can't use [src]!") + var/obj/item/clothing/check + var/internals = FALSE + + for(check in H.get_internal_slots()) + if(istype(check, /obj/item/clothing/mask)) + var/obj/item/clothing/mask/M = check + if(M.mask_adjusted) + M.adjustmask(H) + if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS)) + internals = TRUE + + if(!internals) + to_chat(H, "You are not wearing an internals mask!") return if(H.internal) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 04a8e17b7b..775bbabdfd 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -437,7 +437,7 @@ item_state = "gas_alt" resistance_flags = NONE armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index ed0ef27174..947aa048c4 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -4,8 +4,8 @@ icon_state = "breath" item_state = "m_mask" body_parts_covered = 0 - clothing_flags = MASKINTERNALS - visor_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS + visor_flags = ALLOWINTERNALS w_class = WEIGHT_CLASS_SMALL gas_transfer_coefficient = 0.1 permeability_coefficient = 0.5 diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index bcf3064c49..c613d1a91e 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -2,7 +2,7 @@ name = "gas mask" desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate icon_state = "gas_alt" - clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT w_class = WEIGHT_CLASS_NORMAL item_state = "gas_alt" @@ -59,7 +59,7 @@ /obj/item/clothing/mask/gas/clown_hat name = "clown wig and mask" desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask." - clothing_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS icon_state = "clown" item_state = "clown_hat" flags_cover = MASKCOVERSEYES @@ -91,7 +91,7 @@ /obj/item/clothing/mask/gas/sexyclown name = "sexy-clown wig and mask" desc = "A feminine clown mask for the dabbling crossdressers or female entertainers." - clothing_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS icon_state = "sexyclown" item_state = "sexyclown" flags_cover = MASKCOVERSEYES @@ -100,7 +100,7 @@ /obj/item/clothing/mask/gas/mime name = "mime mask" desc = "The traditional mime's mask. It has an eerie facial posture." - clothing_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS icon_state = "mime" item_state = "mime" flags_cover = MASKCOVERSEYES @@ -132,7 +132,7 @@ /obj/item/clothing/mask/gas/monkeymask name = "monkey mask" desc = "A mask used when acting as a monkey." - clothing_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS icon_state = "monkeymask" item_state = "monkeymask" flags_cover = MASKCOVERSEYES @@ -141,7 +141,7 @@ /obj/item/clothing/mask/gas/sexymime name = "sexy mime mask" desc = "A traditional female mime's mask." - clothing_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS icon_state = "sexymime" item_state = "sexymime" flags_cover = MASKCOVERSEYES @@ -162,7 +162,7 @@ name = "owl mask" desc = "Twoooo!" icon_state = "owl" - clothing_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS flags_cover = MASKCOVERSEYES resistance_flags = FLAMMABLE diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index 8860650fbc..f004f07bf5 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -7,10 +7,10 @@ actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust) icon_state = "sechailer" item_state = "sechailer" - clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS flags_inv = HIDEFACIALHAIR|HIDEFACE w_class = WEIGHT_CLASS_SMALL - visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + visor_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS visor_flags_inv = HIDEFACE flags_cover = MASKCOVERSMOUTH visor_flags_cover = MASKCOVERSMOUTH diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 9d3918ed84..662a91c80c 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -4,7 +4,7 @@ name = "space helmet" icon_state = "spaceold" desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays." - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS item_state = "spaceold" permeability_coefficient = 0.01 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70) diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index 2c35c3148f..23ec02976d 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -43,7 +43,7 @@ name = "explorer gas mask" desc = "A military-grade gas mask that can be connected to an air supply." icon_state = "gas_mining" - visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + visor_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS visor_flags_inv = HIDEFACIALHAIR visor_flags_cover = MASKCOVERSMOUTH actions_types = list(/datum/action/item_action/adjust) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index c2c8904aa1..96e7c4310b 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -15,7 +15,7 @@ icon_state = "facehugger" item_state = "facehugger" w_class = WEIGHT_CLASS_TINY //note: can be picked up by aliens unlike most other items of w_class below 4 - clothing_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS throw_range = 5 tint = 3 flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index aa87a6e46d..2a074df420 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -238,7 +238,7 @@ if(href_list["internal"]) var/slot = text2num(href_list["internal"]) var/obj/item/ITEM = get_item_by_slot(slot) - if(ITEM && istype(ITEM, /obj/item/tank) && wear_mask && (wear_mask.clothing_flags & MASKINTERNALS)) + if(ITEM && istype(ITEM, /obj/item/tank) && wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS)) visible_message("[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].", \ "[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].") if(do_mob(usr, src, POCKET_STRIP_DELAY)) @@ -246,7 +246,7 @@ internal = null update_internals_hud_icon(0) else if(ITEM && istype(ITEM, /obj/item/tank)) - if((wear_mask && (wear_mask.clothing_flags & MASKINTERNALS)) || getorganslot(ORGAN_SLOT_BREATHING_TUBE)) + if((wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS)) || getorganslot(ORGAN_SLOT_BREATHING_TUBE)) internal = ITEM update_internals_hud_icon(1) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index d35df6b789..3dd4807251 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -77,6 +77,12 @@ s_store, ) +/mob/living/carbon/human/proc/get_internal_slots() + return list( + head, + wear_mask, + ) + //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() /mob/living/carbon/human/equip_to_slot(obj/item/I, slot) if(!..()) //a check failed or the item has already found its slot diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 9dd55c361e..999544d1f7 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -304,11 +304,21 @@ return /mob/living/carbon/proc/get_breath_from_internal(volume_needed) + var/obj/item/clothing/check + var/internals = FALSE + var/internalslots = list( + head, + wear_mask, + ) + + for(check in internalslots) + if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS)) + internals = TRUE if(internal) if(internal.loc != src) internal = null update_internals_hud_icon(0) - else if ((!wear_mask || !(wear_mask.clothing_flags & MASKINTERNALS)) && !getorganslot(ORGAN_SLOT_BREATHING_TUBE)) + else if (internals == FALSE && !getorganslot(ORGAN_SLOT_BREATHING_TUBE)) internal = null update_internals_hud_icon(0) else From 31709938c6ce4739ee4b241c5d631c90c8a83f30 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Jul 2019 23:23:45 +0100 Subject: [PATCH 401/608] Pushing a buncha stuff so I can fix things. --- code/game/objects/items/devices/scanners.dm | 30 ++++++--- code/modules/reagents/chemistry/holder.dm | 8 +-- .../reagents/chemistry/reagents/SDGF.dm | 66 +++++++++++++++++-- .../reagents/chemistry/reagents/astrogen.dm | 3 +- .../chemistry/reagents/enlargement.dm | 16 +++-- .../chemistry/reagents/fermi_reagents.dm | 13 ++++ .../reagents/chemistry/reagents/healing.dm | 4 +- .../reagents/chemistry/recipes/fermi.dm | 2 +- 8 files changed, 115 insertions(+), 27 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 3cf230457f..2585e9b1ee 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -137,15 +137,6 @@ SLIME SCANNER to_chat(user, "Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!") if(H.undergoing_liver_failure() && H.stat != DEAD) to_chat(user, "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!") - var/obj/item/organ/liver/L = M.getorganslot("liver") - if(L.swelling > 20) - to_chat(user, "Subject is suffering from an enlarged liver.") //i.e. shrink their liver or give them a transplant. - var/obj/item/organ/tongue/T = M.getorganslot("tongue") - if(!T || T.damage > 40) - to_chat(user, "Subject is suffering from necrotic tissue on their tongue./span>") //i.e. their tongue is shot - var/obj/item/organ/lungs/Lung = M.getorganslot("lungs") - if(Lung.damage > 150) - to_chat(user, "Subject is suffering from acute emphysema leading to trouble breathing.") //i.e. Their lungs are shot var/msg = "*---------*\nAnalyzing results for [M]:\n\tOverall status: [mob_status]\n" @@ -173,6 +164,26 @@ SLIME SCANNER else if (M.getBrainLoss() >= 45) msg += "\tBrain damage detected.\n" if(iscarbon(M)) + var/obj/item/organ/liver/L = M.getorganslot("liver") + if(L) + if(L.swelling > 20) + msg += "\tSubject is suffering from an enlarged liver.\n" //i.e. shrink their liver or give them a transplant. + var/obj/item/organ/tongue/T = M.getorganslot("tongue") + if(!T || T.damage > 40) + msg += "\tSubject is suffering from severe burn tissue on their tongue.\n" //i.e. their tongue is shot + var/obj/item/organ/lungs/Lung = M.getorganslot("lungs") + if(L) + if(Lung.damage > 150) + msg += "\tSubject is suffering from acute emphysema leading to trouble breathing.\n" //i.e. Their lungs are shot + var/obj/item/organ/genital/penis/P = M.getorganslot("penis") + if(P) + if(P.length>20) + msg += "\tSubject has a sizeable gentleman's organ at [P.length] inches.\n" + var/obj/item/organ/genital/breasts/Br = M.getorganslot("breasts") + if(Br) + if(Br.cached_size>5) + msg += "\tSubject has a sizeable bosom with a [Br.size] cup.\n" + var/mob/living/carbon/C = M if(LAZYLEN(C.get_traumas())) var/list/trauma_text = list() @@ -268,6 +279,7 @@ SLIME SCANNER for(var/obj/item/bodypart/org in damaged) msg += "\t\t[capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]-[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]\n" + // Species and body temperature if(ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 2bca1fc031..300e73a6fd 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -692,12 +692,8 @@ return //Make sure things are limited. - if (pH > 14) - pH = 14 - else if (pH < 0) - pH = 0 - //some beakers melt at extremes. This proc is called in add_reagent - + pH = CLAMP(pH, 0, 14) + //return said amount to compare for next step. return (reactedVol) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index f57bfdaa9c..cb222fd967 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -68,7 +68,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING startHunger = M.nutrition if(pollStarted == FALSE) pollStarted = TRUE - candies = pollGhostCandidates("Do you want to play as a clone of [M], and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you and it will likely earn you a bwoink.") + candies = pollGhostCandidates("Do you want to play as a clone of [M], and do you agree to respect their character and act in a similar manner to them? Do not engage in ERP as them unless you have LOOC permission from them, and ensure it is permission from the original, not a clone.") log_game("FERMICHEM: [M] ckey: [M.key] has taken SDGF, and ghosts have been polled.") if(20 to INFINITY) if(LAZYLEN(candies) && playerClone == FALSE) //If there's candidates, clone the person and put them in there! @@ -82,7 +82,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.dna.transfer_identity(SM) SM.updateappearance(mutcolor_update=1) var/mob/dead/observer/C = pick(candies) - message_admins("Ghost candidate found! [C] is becoming a clone of [M] (They agreed to respect the character they're becoming. If they don't, then they agreed to a a bwoinking.) (Hee~!! Exciting!!)") + message_admins("Ghost candidate found! [C] key [C.key] is becoming a clone of [M] key: [M.key] (They agreed to respect the character they're becoming, and agreed to not ERP without express permission from the original.)") SM.key = C.key SM.mind.enslave_mind_to_creator(M) @@ -94,10 +94,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ZI.Insert(SM) log_game("FERMICHEM: [M] ckey: [M.key]'s zombie_infection has been transferred to their clone") - to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.") + to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with your original, a perfect clone of your origin.") if(prob(50)) - to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original") + to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original.") log_game("FERMICHEM: [SM] ckey: [SM.key]'s is not bound by [M] ckey [M.key]'s will, and is free to determine their own goals, while respecting and acting as their origin.") else to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.") @@ -210,6 +210,64 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if (M.nutrition < 1500) M.nutrition += 500 +/datum/reagent/fermi/SDGF/reaction_mob(mob/living/carbon/human/M, method=TOUCH, reac_volume) + if(volume<5) + M.visible_message("The growth factor froths upon [M]'s body, failing to do anything of note.") + return + if(M.stat == DEAD) + if(M.suiciding || (HAS_TRAIT(M, TRAIT_NOCLONE)) || M.hellbound) + M.visible_message("The growth factor inertly sticks to [M]'s body, failing to do anything of note.") + return + if(!M.mind) + M.visible_message("The growth factor shudders, merging with [M]'s body, but is unable to replicate properly.") + + var/bodydamage = (M.getBruteLoss() + M.getFireLoss()) + var/typepath = M.type + volume =- 5 + + var/mob/living/carbon/human/fermi_Gclone = new typepath(M.loc) + var/mob/living/carbon/human/SM = fermi_Gclone + if(istype(SM) && istype(M)) + SM.real_name = M.real_name + M.dna.transfer_identity(SM) + SM.updateappearance(mutcolor_update=1) + M.mind.transfer_to(SM) + M.visible_message("[M]'s body shudders, the growth factor rapidly splitting into a new clone of [M].") + + if(bodydamage>50) + SM.adjustOxyLoss(-(bodydamage/10), 0) + SM.adjustToxLoss(-(bodydamage/10), 0) + SM.blood_volume = (BLOOD_VOLUME_NORMAL*SM.blood_ratio)/1.5 + SM.adjustCloneLoss((bodydamage/10), 0) + SM.setBrainLoss((bodydamage/10)) + SM.nutrition = 400 + if(bodydamage>200) + SM.gain_trauma_type(BRAIN_TRAUMA_MILD) + if(bodydamage>300) + var/obj/item/bodypart/l_arm = SM.get_bodypart(BODY_ZONE_L_ARM) //We get the body parts we want this way. + var/obj/item/bodypart/r_arm = SM.get_bodypart(BODY_ZONE_R_ARM) + l_arm.drop_limb() + r_arm.drop_limb() + if(bodydamage>400) + var/obj/item/bodypart/l_leg = SM.get_bodypart(BODY_ZONE_L_LEG) //We get the body parts we want this way. + var/obj/item/bodypart/r_leg = SM.get_bodypart(BODY_ZONE_R_LEG) + l_leg.drop_limb() + r_leg.drop_limb() + if(bodydamage>500) + SM.gain_trauma_type(BRAIN_TRAUMA_SEVERE) + if(bodydamage>600) + var/datum/species/mutation = pick(subtypesof(/datum/species)) + SM.set_species(mutation) + + //Transfer remaining reagent to clone. I think around 30u will make a healthy clone, otherwise they'll have clone damage, blood loss, brain damage and hunger. + SM.reagents.add_reagent("SDGFheal", volume) + M.reagents.remove_reagent(id, volume) + + SM.updatehealth() + SM.emote("gasp") + log_combat(M, M, "SDGF clone-vived", src) + ..() + //Unobtainable, used in clone spawn. /datum/reagent/fermi/SDGFheal name = "synthetic-derived growth factor" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index b7e9ac3268..d16db2aaf8 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -119,6 +119,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die M.alpha-- antiGenetics-- ADD_TRAIT(M, TRAIT_NOCLONE, "astral") //So you can't scan yourself, then die, to metacomm. You can only use your memories if you come back as something else. + M.hellbound = TRUE if(180) to_chat(M, "You feel fear build up in yourself as more and more of your body and consciousness begins to fade.") M.alpha-- @@ -135,7 +136,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.") M.alpha-- antiGenetics-- - if(0 to 30) + if(-INFINITY to 30) to_chat(M, "Your body disperses from existence, as you become one with the universe.") to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag, you do not remember the afterlife IC)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. deadchat_broadcast("[M] has become one with the universe, meaning that their IC conciousness is continuous in a new life. If they find a way back to life, they are allowed to remember their previous life. Be careful what you say. If they abuse this, bwoink the FUCK outta them.") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 70283a7edc..39cc5824d1 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -71,8 +71,12 @@ //If they have Acute hepatic pharmacokinesis, then route processing though liver. if(HAS_TRAIT(M, TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") - L.swelling+= 0.05 - return..() + if(L) + L.swelling+= 0.05 + return..() + else + M.adjustToxLoss(1) + return..() //otherwise proceed as normal var/obj/item/organ/genital/breasts/nB = new @@ -245,8 +249,12 @@ //If they have Acute hepatic pharmacokinesis, then route processing though liver. if(HAS_TRAIT(M, TRAIT_PHARMA)) var/obj/item/organ/liver/L = M.getorganslot("liver") - L.swelling+= 0.05 - return..() + if(L) + L.swelling+= 0.05 + return..() + else + M.adjustToxLoss(1) + return..() //otherwise proceed as normal var/obj/item/organ/genital/penis/nP = new diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index c683624e06..8535b9498e 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -129,6 +129,19 @@ var/obj/item/organ/tongue/T can_synth = TRUE +/datum/reagent/fermi/furranium/reaction_mob(mob/living/carbon/human/M, method=INJECT, reac_volume) + var/turf/T = get_turf(M) + var/obj/item/toy/plush/random/P = new /obj/item/toy/plush/random + var/list/seen = viewers(8, T) + for(var/mob/S in seen) + to_chat(S, "A [P] suddenly flies out of [M]!") + var/T2 = get_random_station_turf() + M.adjustBruteLoss(5) + M.Knockdown(50) + M.Stun(50) + P.throw_at(T2, 8, 1) + ..() + /datum/reagent/fermi/furranium/on_mob_life(mob/living/carbon/M) switch(current_cycle) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index 7dd61df462..0c1707d5fb 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -7,7 +7,7 @@ pH = 8.6 overdose_threshold = 35 ImpureChem = "yamerol_tox" - InverseChemVal = 0.3 + InverseChemVal = 0.4 InverseChem = "yamerol_tox" can_synth = TRUE @@ -76,7 +76,7 @@ T.adjustTongueLoss(C, 1) if(L) L.adjustLungLoss(4, C) - C.adjustOxyLoss(2) + C.adjustOxyLoss(3) else C.adjustOxyLoss(10) ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index bed9569024..2b01707576 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -512,7 +512,7 @@ name = "Yamerol" id = "yamerol" results = list("yamerol" = 1.5) - required_reagents = list("perfluorodecalin" = 0.5, "furranium" = 0.5, "water" = 0.5) + required_reagents = list("perfluorodecalin" = 0.5, "salbutamol" = 0.5, "water" = 0.5) //FermiChem vars: OptimalTempMin = 300 OptimalTempMax = 500 From 87b412a8c4b0dfbec4472521e3da3343ebfdd2cb Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Jul 2019 23:38:10 +0100 Subject: [PATCH 402/608] Recompiling gui stuff. --- tgui/assets/tgui.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index 8af16f52bf..7e1c48003f 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -9,13 +9,13 @@ name:"css",extend:function(t,e,n){if(n.css){var a=Up++,r=n.noCssTransform?n.css: return t.replace(/-([a-zA-Z])/g,function(t,e){return e.toUpperCase()})};Xi?(uf={},cf=co("div").style,pf=function(t){var e,n,a;if(t=mf(t),!uf[t])if(void 0!==cf[t])uf[t]=t;else for(a=t.charAt(0).toUpperCase()+t.substring(1),e=ro.length;e--;)if(n=ro[e],void 0!==cf[n+a]){uf[t]=n+a;break}return uf[t]}):pf=null;var gf,vf,bf=pf;Xi?(vf=window.getComputedStyle||Po.getComputedStyle,gf=function(t){var e,n,a,r,o;if(e=vf(this.node),"string"==typeof t)return o=e[bf(t)],"0px"===o&&(o=0),o;if(!i(t))throw Error("Transition$getStyle must be passed a string, or an array of strings representing CSS properties");for(n={},a=t.length;a--;)r=t[a],o=e[bf(r)],"0px"===o&&(o=0),n[r]=o;return n}):gf=null;var yf=gf,_f=function(t,e){var n;if("string"==typeof t)this.node.style[bf(t)]=e;else for(n in t)t.hasOwnProperty(n)&&(this.node.style[bf(n)]=t[n]);return this},xf=function(t){var e;this.duration=t.duration,this.step=t.step,this.complete=t.complete,"string"==typeof t.easing?(e=t.root.easing[t.easing],e||(g(Io(t.easing,"easing")),e=qa)):e="function"==typeof t.easing?t.easing:qa,this.easing=e,this.start=ns(),this.end=this.start+this.duration,this.running=!0,xs.add(this)};xf.prototype={tick:function(t){var e,n;return this.running?t>this.end?(this.step&&this.step(1),this.complete&&this.complete(1),!1):(e=t-this.start,n=this.easing(e/this.duration),this.step&&this.step(n),!0):!1},stop:function(){this.abort&&this.abort(),this.running=!1}};var wf,kf,Sf,Ef,Cf,Pf,Af,Of,Tf=xf,Rf=RegExp("^-(?:"+ro.join("|")+")-"),Mf=function(t){return t.replace(Rf,"")},Lf=RegExp("^(?:"+ro.join("|")+")([A-Z])"),jf=function(t){var e;return t?(Lf.test(t)&&(t="-"+t),e=t.replace(/[A-Z]/g,function(t){return"-"+t.toLowerCase()})):""},Df={},Nf={};Xi?(kf=co("div").style,function(){void 0!==kf.transition?(Sf="transition",Ef="transitionend",Cf=!0):void 0!==kf.webkitTransition?(Sf="webkitTransition",Ef="webkitTransitionEnd",Cf=!0):Cf=!1}(),Sf&&(Pf=Sf+"Duration",Af=Sf+"Property",Of=Sf+"TimingFunction"),wf=function(t,e,n,a,r){setTimeout(function(){var i,o,s,p,u;p=function(){o&&s&&(t.root.fire(t.name+":end",t.node,t.isIntro),r())},i=(t.node.namespaceURI||"")+t.node.tagName,t.node.style[Af]=a.map(bf).map(jf).join(","),t.node.style[Of]=jf(n.easing||"linear"),t.node.style[Pf]=n.duration/1e3+"s",u=function(e){var n;n=a.indexOf(mf(Mf(e.propertyName))),-1!==n&&a.splice(n,1),a.length||(t.node.removeEventListener(Ef,u,!1),s=!0,p())},t.node.addEventListener(Ef,u,!1),setTimeout(function(){for(var r,c,l,d,f,h=a.length,g=[];h--;)d=a[h],r=i+d,Cf&&!Nf[r]&&(t.node.style[bf(d)]=e[d],Df[r]||(c=t.getStyle(d),Df[r]=t.getStyle(d)!=e[d],Nf[r]=!Df[r],Nf[r]&&(t.node.style[bf(d)]=c))),(!Cf||Nf[r])&&(void 0===c&&(c=t.getStyle(d)),l=a.indexOf(d),-1===l?m("Something very strange happened with transitions. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!",{node:t.node}):a.splice(l,1),f=/[^\d]*$/.exec(e[d])[0],g.push({name:bf(d),interpolator:qo(parseFloat(c),parseFloat(e[d])),suffix:f}));g.length?new Tf({root:t.root,duration:n.duration,easing:mf(n.easing||""),step:function(e){var n,a;for(a=g.length;a--;)n=g[a],t.node.style[n.name]=n.interpolator(e)+n.suffix},complete:function(){o=!0,p()}}):o=!0,a.length||(t.node.removeEventListener(Ef,u,!1),s=!0,p())},0)},n.delay||0)}):wf=null;var Ff,If,Bf,qf,Uf,Vf=wf;if("undefined"!=typeof document){if(Ff="hidden",Uf={},Ff in document)Bf="";else for(qf=ro.length;qf--;)If=ro[qf],Ff=If+"Hidden",Ff in document&&(Bf=If);void 0!==Bf?(document.addEventListener(Bf+"visibilitychange",Ua),Ua()):("onfocusout"in document?(document.addEventListener("focusout",Va),document.addEventListener("focusin",Ga)):(window.addEventListener("pagehide",Va),window.addEventListener("blur",Va),window.addEventListener("pageshow",Ga),window.addEventListener("focus",Ga)),Uf.hidden=!1)}var Gf,zf,Wf,Hf=Uf;Xi?(zf=window.getComputedStyle||Po.getComputedStyle,Gf=function(t,e,n){var a,r=this;if(4===arguments.length)throw Error("t.animateStyle() returns a promise - use .then() instead of passing a callback");if(Hf.hidden)return this.setStyle(t,e),Wf||(Wf=us.resolve());"string"==typeof t?(a={},a[t]=e):(a=t,n=e),n||(g('The "%s" transition does not supply an options object to `t.animateStyle()`. This will break in a future version of Ractive. For more info see https://github.com/RactiveJS/Ractive/issues/340',this.name),n=this);var i=new us(function(t){var e,i,o,s,p,u,c;if(!n.duration)return r.setStyle(a),void t();for(e=Object.keys(a),i=[],o=zf(r.node),p={},u=e.length;u--;)c=e[u],s=o[bf(c)],"0px"===s&&(s=0),s!=a[c]&&(i.push(c),r.node.style[bf(c)]=s);return i.length?void Vf(r,a,n,i,t):void t()});return i}):Gf=null;var Kf=Gf,Qf=function(t,e){return"number"==typeof t?t={duration:t}:"string"==typeof t?t="slow"===t?{duration:600}:"fast"===t?{duration:200}:{duration:400}:t||(t={}),r({},t,e)},Yf=za,$f=function(t,e,n){this.init(t,e,n)};$f.prototype={init:hf,start:Yf,getStyle:yf,setStyle:_f,animateStyle:Kf,processParams:Qf};var Jf,Xf,Zf=$f,th=Ha;Jf=function(){var t=this.node,e=this.fragment.toString(!1);if(window&&window.appearsToBeIELessEqual8&&(t.type="text/css"),t.styleSheet)t.styleSheet.cssText=e;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}},Xf=function(){this.node.type&&"text/javascript"!==this.node.type||m("Script tag was updated. This does not cause the code to be re-evaluated!",{ractive:this.root}),this.node.text=this.fragment.toString(!1)};var eh=function(){var t,e;return this.template.y?"":(t="<"+this.template.e,t+=this.attributes.map(Xa).join("")+this.conditionalAttributes.map(Xa).join(""),"option"===this.name&&$a(this)&&(t+=" selected"),"input"===this.name&&Ja(this)&&(t+=" checked"),t+=">","textarea"===this.name&&void 0!==this.getAttribute("value")?t+=Se(this.getAttribute("value")):void 0!==this.getAttribute("contenteditable")&&(t+=this.getAttribute("value")||""),this.fragment&&(e="script"!==this.name&&"style"!==this.name,t+=this.fragment.toString(e)),ic.test(this.template.e)||(t+=""),t)},nh=Za,ah=tr,rh=function(t){this.init(t)};rh.prototype={bubble:Tl,detach:Rl,find:Ml,findAll:Ll,findAllComponents:jl,findComponent:Dl,findNextNode:Nl,firstNode:Fl,getAttribute:Il,init:df,rebind:ff,render:th,toString:eh,unbind:nh,unrender:ah};var ih=rh,oh=/^\s*$/,sh=/^\s*/,ph=function(t){var e,n,a,r;return e=t.split("\n"),n=e[0],void 0!==n&&oh.test(n)&&e.shift(),a=D(e),void 0!==a&&oh.test(a)&&e.pop(),r=e.reduce(nr,null),r&&(t=e.map(function(t){return t.replace(r,"")}).join("\n")),t},uh=ar,ch=function(t,e){var n;return e?n=t.split("\n").map(function(t,n){return n?e+t:t}).join("\n"):t},lh='Could not find template for partial "%s"',dh=function(t){var e,n;e=this.parentFragment=t.parentFragment,this.root=e.root,this.type=Au,this.index=t.index,this.name=t.template.r,this.rendered=!1,this.fragment=this.fragmentToRender=this.fragmentToUnrender=null,Gc.init(this,t),this.keypath||((n=uh(this.root,this.name,e))?(_c.call(this),this.isNamed=!0,this.setTemplate(n)):g(lh,this.name))};dh.prototype={bubble:function(){this.parentFragment.bubble()},detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},firstNode:function(){return this.fragment.firstNode()},findNextNode:function(){return this.parentFragment.findNextNode(this)},getPartialName:function(){return this.isNamed&&this.name?this.name:void 0===this.value?this.name:this.value},getValue:function(){return this.fragment.getValue()},rebind:function(t,e){this.isNamed||Vc.call(this,t,e),this.fragment&&this.fragment.rebind(t,e)},render:function(){return this.docFrag=document.createDocumentFragment(),this.update(),this.rendered=!0,this.docFrag},resolve:Gc.resolve,setValue:function(t){var e;(void 0===t||t!==this.value)&&(void 0!==t&&(e=uh(this.root,""+t,this.parentFragment)),!e&&this.name&&(e=uh(this.root,this.name,this.parentFragment))&&(_c.call(this),this.isNamed=!0),e||g(lh,this.name,{ractive:this.root}),this.value=t,this.setTemplate(e||[]),this.bubble(),this.rendered&&bs.addView(this))},setTemplate:function(t){this.fragment&&(this.fragment.unbind(),this.rendered&&(this.fragmentToUnrender=this.fragment)),this.fragment=new rg({template:t,root:this.root,owner:this,pElement:this.parentFragment.pElement}),this.fragmentToRender=this.fragment},toString:function(t){var e,n,a,r;return e=this.fragment.toString(t),n=this.parentFragment.items[this.index-1],n&&n.type===ku?(a=n.text.split("\n").pop(),(r=/^\s+$/.exec(a))?ch(e,r[0]):e):e},unbind:function(){this.isNamed||_c.call(this),this.fragment&&this.fragment.unbind()},unrender:function(t){this.rendered&&(this.fragment&&this.fragment.unrender(t),this.rendered=!1)},update:function(){var t,e;this.fragmentToUnrender&&(this.fragmentToUnrender.unrender(!0),this.fragmentToUnrender=null),this.fragmentToRender&&(this.docFrag.appendChild(this.fragmentToRender.render()),this.fragmentToRender=null),this.rendered&&(t=this.parentFragment.getNode(),e=this.parentFragment.findNextNode(this),t.insertBefore(this.docFrag,e))}};var fh,hh,mh,gh=dh,vh=pr,bh=ur,yh=new is("detach"),_h=cr,xh=lr,wh=dr,kh=fr,Sh=hr,Eh=mr,Ch=function(t,e,n,a){var r=t.root,i=t.keypath;a?r.viewmodel.smartUpdate(i,e,a):r.viewmodel.mark(i)},Ph=[],Ah=["pop","push","reverse","shift","sort","splice","unshift"];Ah.forEach(function(t){var e=function(){for(var e=arguments.length,n=Array(e),a=0;e>a;a++)n[a]=arguments[a];var r,i,o,s;for(r=bp(this,t,n),i=Array.prototype[t].apply(this,arguments),bs.start(),this._ractive.setting=!0,s=this._ractive.wrappers.length;s--;)o=this._ractive.wrappers[s],bs.addRactive(o.root),Ch(o,this,t,r);return bs.end(),this._ractive.setting=!1,i};Eo(Ph,t,{value:e})}),fh={},fh.__proto__?(hh=function(t){t.__proto__=Ph},mh=function(t){t.__proto__=Array.prototype}):(hh=function(t){var e,n;for(e=Ah.length;e--;)n=Ah[e],Eo(t,n,{value:Ph[n],configurable:!0})},mh=function(t){var e;for(e=Ah.length;e--;)delete t[Ah[e]]}),hh.unpatch=mh;var Oh,Th,Rh,Mh=hh;Oh={filter:function(t){return i(t)&&(!t._ractive||!t._ractive.setting)},wrap:function(t,e,n){return new Th(t,e,n)}},Th=function(t,e,n){this.root=t,this.value=e,this.keypath=S(n),e._ractive||(Eo(e,"_ractive",{value:{wrappers:[],instances:[],setting:!1},configurable:!0}),Mh(e)),e._ractive.instances[t._guid]||(e._ractive.instances[t._guid]=0,e._ractive.instances.push(t)),e._ractive.instances[t._guid]+=1,e._ractive.wrappers.push(this)},Th.prototype={get:function(){return this.value},teardown:function(){var t,e,n,a,r;if(t=this.value,e=t._ractive,n=e.wrappers,a=e.instances,e.setting)return!1;if(r=n.indexOf(this),-1===r)throw Error(Rh);if(n.splice(r,1),n.length){if(a[this.root._guid]-=1,!a[this.root._guid]){if(r=a.indexOf(this.root),-1===r)throw Error(Rh);a.splice(r,1)}}else delete t._ractive,Mh.unpatch(this.value)}},Rh="Something went wrong in a rather interesting way";var Lh,jh,Dh=Oh,Nh=/^\s*[0-9]+\s*$/,Fh=function(t){return Nh.test(t)?[]:{}};try{Object.defineProperty({},"test",{value:0}),Lh={filter:function(t,e,n){var a,r;return e?(e=S(e),(a=n.viewmodel.wrapped[e.parent.str])&&!a.magic?!1:(r=n.viewmodel.get(e.parent),i(r)&&/^[0-9]+$/.test(e.lastKey)?!1:r&&("object"==typeof r||"function"==typeof r))):!1},wrap:function(t,e,n){return new jh(t,e,n)}},jh=function(t,e,n){var a,r,i;return n=S(n),this.magic=!0,this.ractive=t,this.keypath=n,this.value=e,this.prop=n.lastKey,a=n.parent,this.obj=a.isRoot?t.viewmodel.data:t.viewmodel.get(a),r=this.originalDescriptor=Object.getOwnPropertyDescriptor(this.obj,this.prop),r&&r.set&&(i=r.set._ractiveWrappers)?void(-1===i.indexOf(this)&&i.push(this)):void gr(this,e,r)},jh.prototype={get:function(){return this.value},reset:function(t){return this.updating?void 0:(this.updating=!0,this.obj[this.prop]=t,bs.addRactive(this.ractive),this.ractive.viewmodel.mark(this.keypath,{keepExistingWrapper:!0}),this.updating=!1,!0)},set:function(t,e){this.updating||(this.obj[this.prop]||(this.updating=!0,this.obj[this.prop]=Fh(t),this.updating=!1),this.obj[this.prop][t]=e)},teardown:function(){var t,e,n,a,r;return this.updating?!1:(t=Object.getOwnPropertyDescriptor(this.obj,this.prop),e=t&&t.set,void(e&&(a=e._ractiveWrappers,r=a.indexOf(this),-1!==r&&a.splice(r,1),a.length||(n=this.obj[this.prop],Object.defineProperty(this.obj,this.prop,this.originalDescriptor||{writable:!0,enumerable:!0,configurable:!0}),this.obj[this.prop]=n))))}}}catch(Ao){Lh=!1}var Ih,Bh,qh=Lh;qh&&(Ih={filter:function(t,e,n){return qh.filter(t,e,n)&&Dh.filter(t)},wrap:function(t,e,n){return new Bh(t,e,n)}},Bh=function(t,e,n){this.value=e,this.magic=!0,this.magicWrapper=qh.wrap(t,e,n),this.arrayWrapper=Dh.wrap(t,e,n)},Bh.prototype={get:function(){return this.value},teardown:function(){this.arrayWrapper.teardown(),this.magicWrapper.teardown()},reset:function(t){return this.magicWrapper.reset(t)}});var Uh=Ih,Vh=vr,Gh={},zh=_r,Wh=xr,Hh=Sr,Kh=Or,Qh=Tr,Yh=function(t,e){this.computation=t,this.viewmodel=t.viewmodel,this.ref=e,this.root=this.viewmodel.ractive,this.parentFragment=this.root.component&&this.root.component.parentFragment};Yh.prototype={resolve:function(t){this.computation.softDeps.push(t),this.computation.unresolvedDeps[t.str]=null,this.viewmodel.register(t,this.computation,"computed")}};var $h=Yh,Jh=function(t,e){this.key=t,this.getter=e.getter,this.setter=e.setter,this.hardDeps=e.deps||[],this.softDeps=[],this.unresolvedDeps={},this.depValues={},this._dirty=this._firstRun=!0};Jh.prototype={constructor:Jh,init:function(t){var e,n=this;this.viewmodel=t,this.bypass=!0,e=t.get(this.key),t.clearCache(this.key.str),this.bypass=!1,this.setter&&void 0!==e&&this.set(e),this.hardDeps&&this.hardDeps.forEach(function(e){return t.register(e,n,"computed")})},invalidate:function(){this._dirty=!0},get:function(){var t,e,n=this,a=!1;if(this.getting){var r="The "+this.key.str+" computation indirectly called itself. This probably indicates a bug in the computation. It is commonly caused by `array.sort(...)` - if that's the case, clone the array first with `array.slice().sort(...)`";return h(r),this.value}if(this.getting=!0,this._dirty){if(this._firstRun||!this.hardDeps.length&&!this.softDeps.length?a=!0:[this.hardDeps,this.softDeps].forEach(function(t){var e,r,i;if(!a)for(i=t.length;i--;)if(e=t[i],r=n.viewmodel.get(e),!s(r,n.depValues[e.str]))return n.depValues[e.str]=r,void(a=!0)}),a){this.viewmodel.capture();try{this.value=this.getter()}catch(i){m('Failed to compute "%s"',this.key.str),d(i.stack||i),this.value=void 0}t=this.viewmodel.release(),e=this.updateDependencies(t),e&&[this.hardDeps,this.softDeps].forEach(function(t){t.forEach(function(t){n.depValues[t.str]=n.viewmodel.get(t)})})}this._dirty=!1}return this.getting=this._firstRun=!1,this.value},set:function(t){if(this.setting)return void(this.value=t);if(!this.setter)throw Error("Computed properties without setters are read-only. (This may change in a future version of Ractive!)");this.setter(t)},updateDependencies:function(t){var e,n,a,r,i;for(n=this.softDeps,e=n.length;e--;)a=n[e],-1===t.indexOf(a)&&(r=!0,this.viewmodel.unregister(a,this,"computed"));for(e=t.length;e--;)a=t[e],-1!==n.indexOf(a)||this.hardDeps&&-1!==this.hardDeps.indexOf(a)||(r=!0,Rr(this.viewmodel,a)&&!this.unresolvedDeps[a.str]?(i=new $h(this,a.str),t.splice(e,1),this.unresolvedDeps[a.str]=i,bs.addUnresolved(i)):this.viewmodel.register(a,this,"computed"));return r&&(this.softDeps=t.slice()),r}};var Xh=Jh,Zh=Mr,tm={FAILED_LOOKUP:!0},em=Lr,nm={},am=Dr,rm=Nr,im=function(t,e){this.localKey=t,this.keypath=e.keypath,this.origin=e.origin,this.deps=[],this.unresolved=[],this.resolved=!1};im.prototype={forceResolution:function(){this.keypath=this.localKey,this.setup()},get:function(t,e){return this.resolved?this.origin.get(this.map(t),e):void 0},getValue:function(){return this.keypath?this.origin.get(this.keypath):void 0},initViewmodel:function(t){this.local=t,this.setup()},map:function(t){return void 0===typeof this.keypath?this.localKey:t.replace(this.localKey,this.keypath)},register:function(t,e,n){this.deps.push({keypath:t,dep:e,group:n}),this.resolved&&this.origin.register(this.map(t),e,n)},resolve:function(t){void 0!==this.keypath&&this.unbind(!0),this.keypath=t,this.setup()},set:function(t,e){this.resolved||this.forceResolution(),this.origin.set(this.map(t),e)},setup:function(){var t=this;void 0!==this.keypath&&(this.resolved=!0,this.deps.length&&(this.deps.forEach(function(e){var n=t.map(e.keypath);if(t.origin.register(n,e.dep,e.group),e.dep.setValue)e.dep.setValue(t.origin.get(n));else{if(!e.dep.invalidate)throw Error("An unexpected error occurred. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");e.dep.invalidate()}}),this.origin.mark(this.keypath)))},setValue:function(t){if(!this.keypath)throw Error("Mapping does not have keypath, cannot set value. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");this.origin.set(this.keypath,t)},unbind:function(t){var e=this;t||delete this.local.mappings[this.localKey],this.resolved&&(this.deps.forEach(function(t){e.origin.unregister(e.map(t.keypath),t.dep,t.group)}),this.tracker&&this.origin.unregister(this.keypath,this.tracker))},unregister:function(t,e,n){var a,r;if(this.resolved){for(a=this.deps,r=a.length;r--;)if(a[r].dep===e){a.splice(r,1);break}this.origin.unregister(this.map(t),e,n)}}};var om=Fr,sm=function(t,e){var n,a,r,i;return n={},a=0,r=t.map(function(t,r){var o,s,p;s=a,p=e.length;do{if(o=e.indexOf(t,s),-1===o)return i=!0,-1;s=o+1}while(n[o]&&p>s);return o===a&&(a+=1),o!==r&&(i=!0),n[o]=!0,o})},pm=Ir,um={},cm=Ur,lm=Gr,dm=zr,fm=Wr,hm=Kr,mm={implicit:!0},gm={noCascade:!0},vm=Yr,bm=$r,ym=function(t){var e,n,a=t.adapt,r=t.data,i=t.ractive,o=t.computed,s=t.mappings;this.ractive=i,this.adaptors=a,this.onchange=t.onchange,this.cache={},this.cacheMap=So(null),this.deps={computed:So(null),"default":So(null)},this.depsMap={computed:So(null),"default":So(null)},this.patternObservers=[],this.specials=So(null),this.wrapped=So(null),this.computations=So(null),this.captureGroups=[],this.unresolvedImplicitDependencies=[],this.changes=[],this.implicitChanges={},this.noCascade={},this.data=r,this.mappings=So(null);for(e in s)this.map(S(e),s[e]);if(r)for(e in r)(n=this.mappings[e])&&void 0===n.getValue()&&n.setValue(r[e]);for(e in o)s&&e in s&&l("Cannot map to a computed property ('%s')",e),this.compute(S(e),o[e]);this.ready=!0};ym.prototype={adapt:Vh,applyChanges:Hh,capture:Kh,clearCache:Qh,compute:Zh,get:em,init:am,map:rm,mark:om,merge:pm,register:cm,release:lm,reset:dm,set:fm,smartUpdate:hm,teardown:vm,unregister:bm};var _m=ym;Xr.prototype={constructor:Xr,begin:function(t){this.inProcess[t._guid]=!0},end:function(t){var e=t.parent;e&&this.inProcess[e._guid]?Zr(this.queue,e).push(t):ti(this,t),delete this.inProcess[t._guid]}};var xm=Xr,wm=ei,km=/\$\{([^\}]+)\}/g,Sm=new is("construct"),Em=new is("config"),Cm=new xm("init"),Pm=0,Am=["adaptors","components","decorators","easing","events","interpolators","partials","transitions"],Om=ii,Tm=ci;ci.prototype={bubble:function(){this.dirty||(this.dirty=!0,bs.addView(this))},update:function(){this.callback(this.fragment.getValue()),this.dirty=!1},rebind:function(t,e){this.fragment.rebind(t,e)},unbind:function(){this.fragment.unbind()}};var Rm=function(t,e,n,r,o){var s,p,u,c,l,d,f={},h={},g={},v=[];for(p=t.parentFragment,u=t.root,o=o||{},a(f,o),o.content=r||[],f[""]=o.content,e.defaults.el&&m("The <%s/> component has a default `el` property; it has been disregarded",t.name),c=p;c;){if(c.owner.type===Mu){l=c.owner.container;break}c=c.parent}return n&&Object.keys(n).forEach(function(e){var a,r,o=n[e];if("string"==typeof o)a=dc(o),h[e]=a?a.value:o;else if(0===o)h[e]=!0;else{if(!i(o))throw Error("erm wut");di(o)?(g[e]={origin:t.root.viewmodel,keypath:void 0},r=li(t,o[0],function(t){t.isSpecial?d?s.set(e,t.value):(h[e]=t.value,delete g[e]):d?s.viewmodel.mappings[e].resolve(t):g[e].keypath=t})):r=new Tm(t,o,function(t){d?s.set(e,t):h[e]=t}),v.push(r)}}),s=So(e.prototype),Om(s,{el:null,append:!0,data:h,partials:o,magic:u.magic||e.defaults.magic,modifyArrays:u.modifyArrays,adapt:u.adapt},{parent:u,component:t,container:l,mappings:g,inlinePartials:f,cssIds:p.cssIds}),d=!0,t.resolvers=v,s},Mm=fi,Lm=function(t){var e,n;for(e=t.root;e;)(n=e._liveComponentQueries["_"+t.name])&&n.push(t.instance),e=e.parent},jm=mi,Dm=gi,Nm=vi,Fm=bi,Im=yi,Bm=new is("teardown"),qm=xi,Um=function(t,e){this.init(t,e)};Um.prototype={detach:bh,find:_h,findAll:xh,findAllComponents:wh,findComponent:kh,findNextNode:Sh,firstNode:Eh,init:jm,rebind:Dm,render:Nm,toString:Fm,unbind:Im,unrender:qm};var Vm=Um,Gm=function(t){this.type=Ou,this.value=t.template.c};Gm.prototype={detach:vc,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createComment(this.value)),this.node},toString:function(){return""},unrender:function(t){t&&this.node.parentNode.removeChild(this.node)}};var zm=Gm,Wm=function(t){var e,n;this.type=Mu,this.container=e=t.parentFragment.root,this.component=n=e.component,this.container=e,this.containerFragment=t.parentFragment,this.parentFragment=n.parentFragment;var a=this.name=t.template.n||"",r=e._inlinePartials[a];r||(m('Could not find template for partial "'+a+'"',{ractive:t.root}),r=[]),this.fragment=new rg({owner:this,root:e.parent,template:r,pElement:this.containerFragment.pElement}),i(n.yielders[a])?n.yielders[a].push(this):n.yielders[a]=[this],bs.scheduleTask(function(){if(n.yielders[a].length>1)throw Error("A component template can only have one {{yield"+(a?" "+a:"")+"}} declaration at a time")})};Wm.prototype={detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},findNextNode:function(){return this.containerFragment.findNextNode(this)},firstNode:function(){return this.fragment.firstNode()},getValue:function(t){return this.fragment.getValue(t)},render:function(){return this.fragment.render()},unbind:function(){this.fragment.unbind()},unrender:function(t){this.fragment.unrender(t),N(this.component.yielders[this.name],this)},rebind:function(t,e){this.fragment.rebind(t,e)},toString:function(){return""+this.fragment}};var Hm=Wm,Km=function(t){this.declaration=t.template.a};Km.prototype={init:ko,render:ko,unrender:ko,teardown:ko,toString:function(){return""}};var Qm=Km,Ym=wi,$m=Si,Jm=Ei,Xm=Ci,Zm=Oi,tg=Ri,eg=function(t){this.init(t)};eg.prototype={bubble:cu,detach:lu,find:du,findAll:fu,findAllComponents:hu,findComponent:mu,findNextNode:gu,firstNode:vu,getArgsList:hc,getNode:mc,getValue:gc,init:Ym,rebind:$m,registerIndexRef:function(t){var e=this.registeredIndexRefs;-1===e.indexOf(t)&&e.push(t)},render:Jm,toString:Xm,unbind:Zm,unregisterIndexRef:function(t){var e=this.registeredIndexRefs;e.splice(e.indexOf(t),1)},unrender:tg};var ng,ag,rg=eg,ig=Mi,og=["template","partials","components","decorators","events"],sg=new is("reset"),pg=function(t,e){function n(e,a,r){r&&r.partials[t]||e.forEach(function(e){e.type===Au&&e.getPartialName()===t&&a.push(e),e.fragment&&n(e.fragment.items,a,r),i(e.fragments)?n(e.fragments,a,r):i(e.items)?n(e.items,a,r):e.type===Ru&&e.instance&&n(e.instance.fragment.items,a,e.instance),e.type===Pu&&(i(e.attributes)&&n(e.attributes,a,r),i(e.conditionalAttributes)&&n(e.conditionalAttributes,a,r))})}var a,r=[];return n(this.fragment.items,r),this.partials[t]=e,a=bs.start(this,!0),r.forEach(function(e){e.value=void 0,e.setValue(t)}),bs.end(),a},ug=Li,cg=_p("reverse"),lg=ji,dg=_p("shift"),fg=_p("sort"),hg=_p("splice"),mg=Ni,gg=Fi,vg=new is("teardown"),bg=Bi,yg=qi,_g=Ui,xg=new is("unrender"),wg=_p("unshift"),kg=Vi,Sg=new is("update"),Eg=Gi,Cg={add:Zo,animate:Ss,detach:Cs,find:As,findAll:Fs,findAllComponents:Is,findComponent:Bs,findContainer:qs,findParent:Us,fire:Ws,get:Hs,insert:Qs,merge:$s,observe:lp,observeOnce:dp,off:mp,on:gp,once:vp,pop:xp,push:wp,render:Tp,reset:ig,resetPartial:pg,resetTemplate:ug,reverse:cg,set:lg,shift:dg,sort:fg,splice:hg,subtract:mg,teardown:gg,toggle:bg,toHTML:yg,toHtml:yg,unrender:_g,unshift:wg,update:kg,updateModel:Eg},Pg=function(t,e,n){return n||Wi(t,e)?function(){var n,a="_super"in this,r=this._super;return this._super=e,n=t.apply(this,arguments),a&&(this._super=r),n}:t},Ag=Hi,Og=$i,Tg=function(t){var e,n,a={};return t&&(e=t._ractive)?(a.ractive=e.root,a.keypath=e.keypath.str,a.index={},(n=Oc(e.proxy.parentFragment))&&(a.index=Oc.resolve(n)),a):a};ng=function(t){return this instanceof ng?void Om(this,t):new ng(t)},ag={DEBUG:{writable:!0,value:!0},DEBUG_PROMISES:{writable:!0,value:!0},extend:{value:Og},getNodeInfo:{value:Tg},parse:{value:Hp},Promise:{value:us},svg:{value:ao},magic:{value:eo},VERSION:{value:"0.7.3"},adaptors:{writable:!0,value:{}},components:{writable:!0,value:{}},decorators:{writable:!0,value:{}},easing:{writable:!0,value:po},events:{writable:!0,value:{}},interpolators:{writable:!0,value:Vo},partials:{writable:!0,value:{}},transitions:{writable:!0,value:{}}},Co(ng,ag),ng.prototype=a(Cg,so),ng.prototype.constructor=ng,ng.defaults=ng.prototype;var Rg="function";if(typeof Date.now!==Rg||typeof String.prototype.trim!==Rg||typeof Object.keys!==Rg||typeof Array.prototype.indexOf!==Rg||typeof Array.prototype.forEach!==Rg||typeof Array.prototype.map!==Rg||typeof Array.prototype.filter!==Rg||"undefined"!=typeof window&&typeof window.addEventListener!==Rg)throw Error("It looks like you're attempting to use Ractive.js in an older browser. You'll need to use one of the 'legacy builds' in order to continue - see http://docs.ractivejs.org/latest/legacy-builds for more information.");var Mg=ng;return Mg})},{}],342:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.observe("value",function(e,n,a){var r=t.get(),i=r.min,o=r.max,s=Math.clamp(i,o,e);t.animate("percentage",Math.round((s-i)/(o-i)*100))})}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,305],t:7,e:"div",a:{"class":"bar"},f:[{p:[14,3,326],t:7,e:"div",a:{"class":["barFill ",{t:2,r:"state",p:[14,23,346]}],style:["width: ",{t:2,r:"percentage",p:[14,48,371]},"%"]}}," ",{p:[15,3,398],t:7,e:"span",a:{"class":"barText"},f:[{t:16,p:[15,25,420]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],343:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(482),a=t(481);e.exports={computed:{clickable:function(){return!this.get("enabled")||this.get("state")&&"toggle"!=this.get("state")?!1:!0},enabled:function(){return this.get("config.status")===n.UI_INTERACTIVE?!0:!1},styles:function(){var t="";if(this.get("class")&&(t+=" "+this.get("class")),this.get("tooltip-side")&&(t=" tooltip-"+this.get("tooltip-side")),this.get("grid")&&(t+=" gridable"),this.get("enabled")){var e=this.get("state"),n=this.get("style");return e?"inactive "+e+" "+t:"active normal "+n+" "+t}return"inactive disabled "+t}},oninit:function(){var t=this;this.on("press",function(e){var n=t.get(),r=n.action,i=n.params;(0,a.act)(t.get("config.ref"),r,i),e.node.blur()})},data:{iconStackToHTML:function(t){var e="",n=t.split(",");if(n.length){e+='';for(var a=n,r=Array.isArray(a),i=0,a=r?a:a[Symbol.iterator]();;){var o;if(r){if(i>=a.length)break;o=a[i++]}else{if(i=a.next(),i.done)break;o=i.value}var s=o,p=/([\w\-]+)\s*(\dx)/g,u=p.exec(s),c=u[1],l=u[2];e+=''}}return e&&(e+=""),e}}}}(r),r.exports.template={v:3,t:[" ",{p:[70,1,2019],t:7,e:"span",a:{"class":["button ",{t:2,r:"styles",p:[70,21,2039]}],unselectable:"on","data-tooltip":[{t:2,r:"tooltip",p:[73,17,2124]}]},m:[{t:4,f:["tabindex='0'"],r:"clickable",p:[72,3,2075]}],v:{"mouseover-mousemove":"hover",mouseleave:"unhover","click-enter":{n:[{t:4,f:["press"],r:"clickable",p:[76,19,2217]}],d:[]}},f:[{t:4,f:[{p:[78,5,2265],t:7,e:"i",a:{"class":["fa fa-",{t:2,r:"icon",p:[78,21,2281]}]}}],n:50,r:"icon",p:[77,3,2247]}," ",{t:4,f:[{t:3,x:{r:["iconStackToHTML","icon_stack"],s:"_0(_1)"},p:[81,6,2335]}],n:50,r:"icon_stack",p:[80,3,2310]}," ",{t:16,p:[83,3,2383]}]}]},e.exports=a.extend(r.exports)},{341:341,481:481,482:482}],344:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"display"},f:[{t:4,f:[{p:[3,5,44],t:7,e:"header",f:[{p:[4,7,60],t:7,e:"h3",f:[{t:2,r:"title",p:[4,11,64]}]}," ",{t:4,f:[{p:[6,9,110],t:7,e:"div",a:{"class":"buttonRight"},f:[{t:16,n:"button",p:[6,34,135]}]}],n:50,r:"button",p:[5,7,86]}]}],n:50,r:"title",p:[2,3,25]}," ",{p:[10,3,202],t:7,e:"article",f:[{t:16,p:[11,5,217]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],345:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.on("clear",function(){t.set("value",""),t.find("input").focus()})}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,170],t:7,e:"input",a:{type:"text",value:[{t:2,r:"value",p:[12,27,196]}],placeholder:[{t:2,r:"placeholder",p:[12,51,220]}]}}," ",{p:[13,1,240],t:7,e:"ui-button",a:{icon:"refresh"},v:{press:"clear"}}]},e.exports=a.extend(r.exports)},{341:341}],346:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";e.exports={data:{graph:t(338),xaccessor:function(t){return t.x},yaccessor:function(t){return t.y}},computed:{size:function(){var t=this.get("points");return t[0].length},scale:function(){var t=this.get("points");return Math.max.apply(Math,Array.map(t,function(t){return Math.max.apply(Math,Array.map(t,function(t){return t.y}))}))},xaxis:function(){var t=this.get("xinc"),e=this.get("size");return Array.from(Array(e).keys()).filter(function(e){return e&&e%t==0})},yaxis:function(){var t=this.get("yinc"),e=this.get("scale");return Array.from(Array(t).keys()).map(function(t){return Math.round(e*(++t/100)*10)})}},oninit:function(){var t=this;this.on({enter:function(t){this.set("selected",t.index.count)},exit:function(t){this.set("selected")}}),window.addEventListener("resize",function(e){t.set("width",t.el.clientWidth)})},onrender:function(){this.set("width",this.el.clientWidth)}}}(r),r.exports.template={v:3,t:[" ",{p:[47,1,1269],t:7,e:"svg",a:{"class":"linegraph",width:"100%",height:[{t:2,x:{r:["height"],s:"_0+10"},p:[47,45,1313]}]},f:[{p:[48,3,1334],t:7,e:"g",a:{transform:"translate(0, 5)"},f:[{t:4,f:[{t:4,f:[{p:[51,9,1504],t:7,e:"line",a:{x1:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,19,1514]}],x2:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,38,1533]}],y1:"0",y2:[{t:2,r:"height",p:[51,64,1559]}],stroke:"darkgray"}}," ",{t:4,f:[{p:[53,11,1635],t:7,e:"text",a:{x:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[53,20,1644]}],y:[{t:2,x:{r:["height"],s:"_0-5"},p:[53,38,1662]}],"text-anchor":"middle",fill:"white"},f:[{t:2,x:{r:["size",".","xfactor"],s:"(_0-_1)*_2"},p:[53,88,1712]}," ",{t:2,r:"xunit",p:[53,113,1737]}]}],n:50,x:{r:["@index"],s:"_0%2==0"},p:[52,9,1600]}],n:52,r:"xaxis",p:[50,7,1479]}," ",{t:4,f:[{p:[57,9,1820],t:7,e:"line",a:{x1:"0",x2:[{t:2,r:"width",p:[57,26,1837]}],y1:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,41,1852]}],y2:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,60,1871]}],stroke:"darkgray"}}," ",{p:[58,9,1915],t:7,e:"text",a:{x:"0",y:[{t:2,x:{r:["yscale","."],s:"_0(_1)-5"},p:[58,24,1930]}],"text-anchor":"begin",fill:"white"},f:[{t:2,x:{r:[".","yfactor"],s:"_0*_1"},p:[58,76,1982]}," ",{t:2,r:"yunit",p:[58,92,1998]}]}],n:52,r:"yaxis",p:[56,7,1795]}," ",{t:4,f:[{p:[61,9,2071],t:7,e:"path",a:{d:[{t:2,x:{r:["area.path"],s:"_0.print()"},p:[61,18,2080]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[61,47,2109]}],opacity:"0.1"}}],n:52,i:"curve",r:"curves",p:[60,7,2039]}," ",{t:4,f:[{p:[64,9,2200],t:7,e:"path",a:{d:[{t:2,x:{r:["line.path"],s:"_0.print()"},p:[64,18,2209]}],stroke:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[64,49,2240]}],fill:"none"}}],n:52, i:"curve",r:"curves",p:[63,7,2168]}," ",{t:4,f:[{t:4,f:[{p:[68,11,2375],t:7,e:"circle",a:{transform:["translate(",{t:2,r:".",p:[68,40,2404]},")"],r:[{t:2,x:{r:["selected","count"],s:"_0==_1?10:4"},p:[68,51,2415]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[68,89,2453]}]},v:{mouseenter:"enter",mouseleave:"exit"}}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[67,9,2329]}],n:52,i:"curve",r:"curves",p:[66,7,2297]}," ",{t:4,f:[{t:4,f:[{t:4,f:[{p:[74,13,2678],t:7,e:"text",a:{transform:["translate(",{t:2,r:".",p:[74,40,2705]},") ",{t:2,x:{r:["count","size"],s:'_0<=_1/2?"translate(15, 4)":"translate(-15, 4)"'},p:[74,47,2712]}],"text-anchor":[{t:2,x:{r:["count","size"],s:'_0<=_1/2?"start":"end"'},p:[74,126,2791]}],fill:"white"},f:[{t:2,x:{r:["count","item","yfactor"],s:"_1[_0].y*_2"},p:[75,15,2861]}," ",{t:2,r:"yunit",p:[75,43,2889]}," @ ",{t:2,x:{r:["size","count","item","xfactor"],s:"(_0-_2[_1].x)*_3"},p:[75,55,2901]}," ",{t:2,r:"xunit",p:[75,92,2938]}]}],n:50,x:{r:["selected","count"],s:"_0==_1"},p:[73,11,2638]}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[72,9,2592]}],n:52,i:"curve",r:"curves",p:[71,7,2560]}," ",{t:4,f:[{p:[81,9,3063],t:7,e:"g",a:{transform:["translate(",{t:2,x:{r:["width","curves.length","@index"],s:"(_0/(_1+1))*(_2+1)"},p:[81,33,3087]},", 10)"]},f:[{p:[82,11,3154],t:7,e:"circle",a:{r:"4",fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[82,31,3174]}]}}," ",{p:[83,11,3206],t:7,e:"text",a:{x:"8",y:"4",fill:"white"},f:[{t:2,rx:{r:"legend",m:[{t:30,n:"curve"}]},p:[83,42,3237]}]}]}],n:52,i:"curve",r:"curves",p:[80,7,3031]}],x:{r:["graph","points","xaccessor","yaccessor","width","height"],s:"_0({data:_1,xaccessor:_2,yaccessor:_3,width:_4,height:_5})"},p:[49,5,1371]}]}]}]},e.exports=a.extend(r.exports)},{338:338,341:341}],347:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"notice"},f:[{t:16,p:[2,3,24]}]}]},e.exports=a.extend(r.exports)},{341:341}],348:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(481),a=t(483);e.exports={oninit:function(){var t=this,e=a.resize.bind(this),r=function(){return t.set({resize:!1,x:null,y:null})};this.observe("config.fancy",function(a,i,o){(0,n.winset)(t.get("config.window"),"can-resize",!a),a?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",r)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",r))}),this.on("resize",function(){return t.toggle("resize")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[28,3,766],t:7,e:"div",a:{"class":"resize"},v:{mousedown:"resize"}}],n:50,r:"config.fancy",p:[27,1,742]}]},e.exports=a.extend(r.exports)},{341:341,481:481,483:483}],349:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"section",a:{"class":[{t:4,f:["candystripe"],r:"candystripe",p:[1,17,16]}]},f:[{t:4,f:[{p:[3,5,84],t:7,e:"span",a:{"class":"label",style:[{t:4,f:["color:",{t:2,r:"labelcolor",p:[3,53,132]}],r:"labelcolor",p:[3,32,111]}]},f:[{t:2,r:"label",p:[3,84,163]},":"]}],n:50,r:"label",p:[2,3,65]}," ",{t:4,f:[{t:16,p:[6,5,215]}],n:50,r:"nowrap",p:[5,3,195]},{t:4,n:51,f:[{p:[8,5,242],t:7,e:"div",a:{"class":"content",style:[{t:4,f:["float:right;"],r:"right",p:[8,33,270]}]},f:[{t:16,p:[9,7,312]}]}],r:"nowrap"}]}]},e.exports=a.extend(r.exports)},{341:341}],350:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"subdisplay"},f:[{t:4,f:[{p:[3,5,47],t:7,e:"header",f:[{p:[4,7,63],t:7,e:"h4",f:[{t:2,r:"title",p:[4,11,67]}]}," ",{t:4,f:[{t:16,n:"button",p:[5,21,103]}],n:50,r:"button",p:[5,7,89]}]}],n:50,r:"title",p:[2,3,28]}," ",{p:[8,3,156],t:7,e:"article",f:[{t:16,p:[9,5,171]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],351:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.set("active",this.findComponent("tab").get("name")),this.on("switch",function(e){t.set("active",e.node.textContent.trim())}),this.observe("active",function(e,n,a){for(var r=t.findAllComponents("tab"),i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;p.set("shown",p.get("name")===e)}})}}}(r),r.exports.template={v:3,t:[" "," ",{p:[20,1,524],t:7,e:"header",f:[{t:4,f:[{p:[22,5,556],t:7,e:"ui-button",a:{pane:[{t:2,r:".",p:[22,22,573]}]},v:{press:"switch"},f:[{t:2,r:".",p:[22,47,598]}]}],n:52,r:"tabs",p:[21,3,536]}]}," ",{p:[25,1,641],t:7,e:"ui-display",f:[{t:8,r:"content",p:[26,3,657]}]}]},r.exports.components=r.exports.components||{};var i={tab:t(352)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,352:352}],352:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:16,p:[2,3,17]}],n:50,r:"shown",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],353:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(482),a=t(481),r=t(483);e.exports={computed:{visualStatus:function(){switch(this.get("config.status")){case n.UI_INTERACTIVE:return"good";case n.UI_UPDATE:return"average";case n.UI_DISABLED:return"bad";default:return"bad"}}},oninit:function(){var t=this,e=r.drag.bind(this),n=function(e){return t.set({drag:!1,x:null,y:null})};this.observe("config.fancy",function(r,i,o){(0,a.winset)(t.get("config.window"),"titlebar",!r&&t.get("config.titlebar")),r?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",n)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",n))}),this.on({drag:function(){this.toggle("drag")},close:function(){(0,a.winset)(this.get("config.window"),"is-visible",!1),window.location.href=(0,a.href)({command:"uiclose "+this.get("config.ref")},"winset")},minimize:function(){(0,a.winset)(this.get("config.window"),"is-minimized",!0)}})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[50,3,1440],t:7,e:"header",a:{"class":"titlebar"},v:{mousedown:"drag"},f:[{p:[51,5,1491],t:7,e:"i",a:{"class":["statusicon fa fa-eye fa-2x ",{t:2,r:"visualStatus",p:[51,42,1528]}]}}," ",{p:[52,5,1556],t:7,e:"span",a:{"class":"title"},f:[{t:16,p:[52,25,1576]}]}," ",{t:4,f:[{p:[54,7,1626],t:7,e:"i",a:{"class":"minimize fa fa-minus fa-2x"},v:{click:"minimize"}}," ",{p:[55,7,1696],t:7,e:"i",a:{"class":"close fa fa-close fa-2x"},v:{click:"close"}}],n:50,r:"config.fancy",p:[53,5,1598]}]}],n:50,r:"config.titlebar",p:[49,1,1413]}]},e.exports=a.extend(r.exports)},{341:341,481:481,482:482,483:483}],354:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";var e=[11,10,9,8];t.exports={data:{userAgent:navigator.userAgent},computed:{ie:function(){if(document.documentMode)return document.documentMode;for(var t in e){var n=document.createElement("div");if(n.innerHTML="",n.getElementsByTagName("span").length)return t}}},oninit:function(){var t=this;this.on("debug",function(){return t.toggle("debug")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[27,3,662],t:7,e:"ui-notice",f:[{p:[28,5,679],t:7,e:"span",f:["You have an old (IE",{t:2,r:"ie",p:[28,30,704]},"), end-of-life (click 'EOL Info' for more information) version of Internet Explorer installed."]},{p:[28,137,811],t:7,e:"br"}," ",{p:[29,5,822],t:7,e:"span",f:["To upgrade, click 'Upgrade IE' to download IE11 from Microsoft."]},{p:[29,81,898],t:7,e:"br"}," ",{p:[30,5,909],t:7,e:"span",f:["If you are unable to upgrade directly, click 'IE VMs' to download a VM with IE11 or Edge from Microsoft."]},{p:[30,122,1026],t:7,e:"br"}," ",{p:[31,5,1037],t:7,e:"span",f:["Otherwise, click 'No Frills' below to disable potentially incompatible features (and this message)."]}," ",{p:[32,5,1155],t:7,e:"hr"}," ",{p:[33,5,1166],t:7,e:"ui-button",a:{icon:"close",action:"tgui:nofrills"},f:["No Frills"]}," ",{p:[34,5,1240],t:7,e:"ui-button",a:{icon:"internet-explorer",action:"tgui:link",params:'{"url": "http://windows.microsoft.com/en-us/internet-explorer/download-ie"}'},f:["Upgrade IE"]}," ",{p:[36,5,1416],t:7,e:"ui-button",a:{icon:"edge",action:"tgui:link",params:'{"url": "https://dev.windows.com/en-us/microsoft-edge/tools/vms"}'},f:["IE VMs"]}," ",{p:[38,5,1565],t:7,e:"ui-button",a:{icon:"info",action:"tgui:link",params:'{"url": "https://support.microsoft.com/en-us/lifecycle#gp/Microsoft-Internet-Explorer"}'},f:["EOL Info"]}," ",{p:[40,5,1738],t:7,e:"ui-button",a:{icon:"bug"},v:{press:"debug"},f:["Debug Info"]}," ",{t:4,f:[{p:[42,7,1826],t:7,e:"hr"}," ",{p:[43,7,1839],t:7,e:"span",f:["Detected: IE",{t:2,r:"ie",p:[43,25,1857]}]},{p:[43,38,1870],t:7,e:"br"}," ",{p:[44,7,1883],t:7,e:"span",f:["User Agent: ",{t:2,r:"userAgent",p:[44,25,1901]}]}],n:50,r:"debug",p:[41,5,1805]}]}],n:50,x:{r:["config.fancy","ie"],s:"_0&&_1&&_1<11"},p:[26,1,621]}]},e.exports=a.extend(r.exports)},{341:341}],355:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},shockState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[22,1,348],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[23,2,384],t:7,e:"ui-section",a:{label:"Main"},f:[{p:[24,3,413],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.power.main"],s:"_0(_1)"},p:[24,16,426]}]},f:[{t:2,x:{r:["data.power.main"],s:'_0?"Online":"Offline"'},p:[24,49,459]}]}," ",{t:4,f:["[ ",{p:[26,6,567],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.main_1","data.wires.main_2"],s:"!_0||!_1"},p:[25,3,512]},{t:4,n:51,f:[{t:4,f:["[ ",{t:2,r:"data.power.main_timeleft",p:[29,7,674]}," seconds left ]"],n:50,x:{r:["data.power.main_timeleft"],s:"_0>0"},p:[28,4,630]}],x:{r:["data.wires.main_1","data.wires.main_2"],s:"!_0||!_1"}}," ",{p:[32,3,744],t:7,e:"div",a:{style:"float:right"},f:[{p:[33,4,774],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"disrupt-main",state:[{t:2,x:{r:["data.power.main"],s:'_0?null:"disabled"'},p:[33,63,833]}]},f:["Disrupt"]}]}]}," ",{p:[36,2,922],t:7,e:"ui-section",a:{label:"Backup"},f:[{p:[37,3,953],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.power.backup"],s:"_0(_1)"},p:[37,16,966]}]},f:[{t:2,x:{r:["data.power.backup"],s:'_0?"Online":"Offline"'},p:[37,51,1001]}]}," ",{t:4,f:["[ ",{p:[39,6,1115],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.backup_1","data.wires.backup_2"],s:"!_0||!_1"},p:[38,3,1056]},{t:4,n:51,f:[{t:4,f:["[ ",{t:2,r:"data.power.backup_timeleft",p:[42,7,1224]}," seconds left ]"],n:50,x:{r:["data.power.backup_timeleft"],s:"_0>0"},p:[41,4,1178]}],x:{r:["data.wires.backup_1","data.wires.backup_2"],s:"!_0||!_1"}}," ",{p:[45,3,1296],t:7,e:"div",a:{style:"float:right"},f:[{p:[46,4,1326],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"disrupt-backup",state:[{t:2,x:{r:["data.power.backup"],s:'_0?null:"disabled"'},p:[46,65,1387]}]},f:["Disrupt"]}]}]}," ",{p:[49,2,1478],t:7,e:"ui-section",a:{label:"Electrify"},f:[{p:[50,3,1512],t:7,e:"span",a:{"class":[{t:2,x:{r:["shockState","data.shock"],s:"_0(_1)"},p:[50,16,1525]}]},f:[{t:2,x:{r:["data.shock"],s:'_0==2?"Safe":"Electrified"'},p:[50,44,1553]}]}," ",{t:4,f:["[ ",{p:[52,6,1640],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.shock"],s:"!_0"},p:[51,3,1608]},{t:4,n:51,f:[{t:4,f:["[ ",{p:[55,7,1742],t:7,e:"span",a:{"class":"bad"},f:[{t:2,r:"data.shock_timeleft",p:[55,25,1760]}," seconds left"]}," ]"],n:50,x:{r:["data.shock_timeleft"],s:"_0>0"},p:[54,4,1703]}," ",{t:4,f:["[ ",{p:[58,7,1863],t:7,e:"span",a:{"class":"bad"},f:["Permanent"]}," ]"],n:50,x:{r:["data.shock_timeleft"],s:"_0==-1"},p:[57,4,1822]}],x:{r:["data.wires.shock"],s:"!_0"}}," ",{p:[61,3,1926],t:7,e:"div",a:{style:"float:right"},f:[{p:[62,4,1956],t:7,e:"ui-button",a:{icon:"wrench",action:"shock-restore",state:[{t:2,x:{r:["data.wires.shock","data.shock"],s:'_0&&_1==0?null:"disabled"'},p:[62,59,2011]}]},f:["Restore"]}," ",{p:[63,4,2094],t:7,e:"ui-button",a:{icon:"bolt",action:"shock-temp",state:[{t:2,x:{r:["data.wires.shock"],s:"!_0"},p:[63,54,2144]}]},f:["Set (Temporary)"]}," ",{p:[64,4,2199],t:7,e:"ui-button",a:{icon:"bolt",action:"shock-perm",state:[{t:2,x:{r:["data.wires.shock"],s:"!_0"},p:[64,53,2248]}]},f:["Set (Permanent)"]}]}]}]}," ",{p:[68,1,2341],t:7,e:"ui-display",a:{title:"Access & Door Control"},f:[{p:[69,2,2386],t:7,e:"ui-section",a:{label:"ID Scan"},f:[{t:4,f:["[ ",{p:[71,6,2455],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[70,3,2418]}," ",{p:[73,3,2516],t:7,e:"div",a:{style:"float:right"},f:[{p:[74,4,2546],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[74,22,2564]}],icon:"power-off",action:"idscan-on",style:[{t:2,x:{r:["data.id_scanner"],s:'_0?"selected":""'},p:[74,93,2635]}]},f:["Enabled"]}," ",{p:[75,4,2698],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[75,22,2716]}],icon:"close",action:"idscan-off",style:[{t:2,x:{r:["data.id_scanner"],s:'_0?"":"selected"'},p:[75,90,2784]}]},f:["Disabled"]}]}]}," ",{p:[78,2,2872],t:7,e:"ui-section",a:{label:"Emergency Access"},f:[{p:[79,3,2913],t:7,e:"div",a:{style:"float:right"},f:[{p:[80,4,2943],t:7,e:"ui-button",a:{icon:"power-off",action:"emergency-on",style:[{t:2,x:{r:["data.emergency"],s:'_0?"selected":""'},p:[80,61,3e3]}]},f:["Enabled"]}," ",{p:[81,4,3062],t:7,e:"ui-button",a:{icon:"close",action:"emergency-off",style:[{t:2,x:{r:["data.emergency"],s:'_0?"":"selected"'},p:[81,58,3116]}]},f:["Disabled"]}]}]}," ",{p:[84,2,3203],t:7,e:"br"}," ",{p:[85,2,3212],t:7,e:"ui-section",a:{label:"Door bolts"},f:[{t:4,f:["[ ",{p:[87,6,3279],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.bolts"],s:"!_0"},p:[86,3,3247]}," ",{p:[89,3,3340],t:7,e:"div",a:{style:"float:right"},f:[{p:[90,4,3370],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.bolts"],s:"!_0"},p:[90,22,3388]}],icon:"unlock",action:"bolt-raise",style:[{t:2,x:{r:["data.locked"],s:'_0?"":"selected"'},p:[90,85,3451]}]},f:["Raised"]}," ",{p:[91,4,3509],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.bolts"],s:"!_0"},p:[91,22,3527]}],icon:"lock",action:"bolt-drop",style:[{t:2,x:{r:["data.locked"],s:'_0?"selected":""'},p:[91,82,3587]}]},f:["Dropped"]}]}]}," ",{p:[94,2,3670],t:7,e:"ui-section",a:{label:"Door bolt lights"},f:[{t:4,f:["[ ",{p:[96,6,3744],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.lights"],s:"!_0"},p:[95,3,3711]}," ",{p:[98,3,3805],t:7,e:"div",a:{style:"float:right"},f:[{p:[99,4,3835],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.lights"],s:"!_0"},p:[99,22,3853]}],icon:"power-off",action:"light-on",style:[{t:2,x:{r:["data.lights"],s:'_0?"selected":""'},p:[99,88,3919]}]},f:["Enabled"]}," ",{p:[100,4,3978],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.lights"],s:"!_0"},p:[100,22,3996]}],icon:"close",action:"light-off",style:[{t:2,x:{r:["data.lights"],s:'_0?"":"selected"'},p:[100,85,4059]}]},f:["Disabled"]}]}]}," ",{p:[103,2,4143],t:7,e:"ui-section",a:{label:"Door force sensors"},f:[{t:4,f:["[ ",{p:[105,6,4217],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.safe"],s:"!_0"},p:[104,3,4186]}," ",{p:[107,3,4278],t:7,e:"div",a:{style:"float:right"},f:[{p:[108,4,4308],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.safe"],s:"!_0"},p:[108,22,4326]}],icon:"power-off",action:"safe-on",style:[{t:2,x:{r:["data.safe"],s:'_0?"selected":""'},p:[108,85,4389]}]},f:["Enabled"]}," ",{p:[109,4,4446],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.safe"],s:"!_0"},p:[109,22,4464]}],icon:"close",action:"safe-off",style:[{t:2,x:{r:["data.safe"],s:'_0?"":"selected"'},p:[109,82,4524]}]},f:["Disabled"]}]}]}," ",{p:[112,2,4606],t:7,e:"ui-section",a:{label:"Door timing safety"},f:[{t:4,f:["[ ",{p:[114,6,4682],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.timing"],s:"!_0"},p:[113,3,4649]}," ",{p:[116,3,4743],t:7,e:"div",a:{style:"float:right"},f:[{p:[117,4,4773],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.timing"],s:"!_0"},p:[117,22,4791]}],icon:"power-off",action:"speed-on",style:[{t:2,x:{r:["data.speed"],s:'_0?"selected":""'},p:[117,88,4857]}]},f:["Enabled"]}," ",{p:[118,4,4915],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.timing"],s:"!_0"},p:[118,22,4933]}],icon:"close",action:"speed-off",style:[{t:2,x:{r:["data.speed"],s:'_0?"":"selected"'},p:[118,85,4996]}]},f:["Disabled"]}]}]}," ",{p:[121,2,5079],t:7,e:"br"}," ",{p:[122,2,5088],t:7,e:"ui-section",a:{label:"Door control"},f:[{t:4,f:["[ ",{p:[124,6,5166],t:7,e:"span",a:{"class":"bad"},f:["Door is ",{t:2,x:{r:["data.locked","data.welded"],s:'(_0?"bolted":"")+(_0&&_1?" and ":"")+(_1?"welded":"")'},p:[124,32,5192]}]}," ]"],n:50,x:{r:["data.locked","data.welded"],s:"_0||_1"},p:[123,3,5125]}," ",{p:[126,3,5327],t:7,e:"div",a:{style:"float:right"},f:[{p:[127,4,5357],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.locked","data.welded","data.opened"],s:'(_0||_1)||(_2&&"disabled")'},p:[127,22,5375]}],icon:"sign-out",action:"open-close"},f:["Open door"]}," ",{p:[128,4,5502],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.locked","data.welded","data.opened"],s:'(_0||_1)||(!_2&&"disabled")'},p:[128,22,5520]}],icon:"sign-in",action:"open-close"},f:["Close door"]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],356:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," ",{p:[7,1,267],t:7,e:"ui-notice",f:[{t:4,f:[{p:[9,5,312],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[10,7,355],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[10,24,372]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[10,75,423]}]}]}],n:50,r:"data.siliconUser",p:[8,3,282]},{t:4,n:51,f:[{p:[13,5,514],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,31,540]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[16,1,625],t:7,e:"status"}," ",{t:4,f:[{t:4,f:[{p:[19,7,719],t:7,e:"ui-display",a:{title:"Air Controls"},f:[{p:[20,9,762],t:7,e:"ui-section",f:[{p:[21,11,786],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"exclamation-triangle":"exclamation"'},p:[21,28,803]}],style:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"caution":null'},p:[21,98,873]}],action:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"reset":"alarm"'},p:[22,23,937]}]},f:["Area Atmosphere Alarm"]}]}," ",{p:[24,9,1045],t:7,e:"ui-section",f:[{p:[25,11,1069],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==3?"exclamation-triangle":"exclamation"'},p:[25,28,1086]}],style:[{t:2,x:{r:["data.mode"],s:'_0==3?"danger":null'},p:[25,96,1154]}],action:"mode",params:['{"mode": ',{t:2,x:{r:["data.mode"],s:"_0==3?1:3"},p:[26,44,1236]},"}"]},f:["Panic Siphon"]}]}," ",{p:[28,9,1322],t:7,e:"br"}," ",{p:[29,9,1337],t:7,e:"ui-section",f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:"sign-out",action:"tgui:view",params:'{"screen": "vents"}'},f:["Vent Controls"]}]}," ",{p:[32,9,1494],t:7,e:"ui-section",f:[{p:[33,11,1518],t:7,e:"ui-button",a:{icon:"filter",action:"tgui:view",params:'{"screen": "scrubbers"}'},f:["Scrubber Controls"]}]}," ",{p:[35,9,1657],t:7,e:"ui-section",f:[{p:[36,11,1681],t:7,e:"ui-button",a:{icon:"cog",action:"tgui:view",params:'{"screen": "modes"}'},f:["Operating Mode"]}]}," ",{p:[38,9,1810],t:7,e:"ui-section",f:[{p:[39,11,1834],t:7,e:"ui-button",a:{icon:"bar-chart",action:"tgui:view",params:'{"screen": "thresholds"}'},f:["Alarm Thresholds"]}]}]}],n:50,x:{r:["config.screen"],s:'_0=="home"'},p:[18,3,680]},{t:4,n:51,f:[{t:4,n:50,x:{r:["config.screen"],s:'_0=="vents"'},f:[{p:[43,5,2032],t:7,e:"vents"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&(_0=="scrubbers")'},f:[" ",{p:[45,5,2089],t:7,e:"scrubbers"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&(_0=="modes"))'},f:[" ",{p:[47,5,2146],t:7,e:"modes"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&((!(_0=="modes"))&&(_0=="thresholds")))'},f:[" ",{p:[49,5,2204],t:7,e:"thresholds"}]}],x:{r:["config.screen"],s:'_0=="home"'}}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[17,1,636]}]},r.exports.components=r.exports.components||{};var i={vents:t(362),modes:t(358),thresholds:t(361),status:t(360),scrubbers:t(359)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,358:358,359:359,360:360,361:361,362:362}],357:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-button",a:{icon:"arrow-left",action:"tgui:view",params:'{"screen": "home"}'},f:["Back"]}]},e.exports=a.extend(r.exports)},{341:341}],358:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,115],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Operating Modes",button:0},f:[" ",{t:4,f:[{p:[8,5,168],t:7,e:"ui-section",f:[{p:[9,7,188],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["selected"],s:'_0?"check-square-o":"square-o"'},p:[9,24,205]}],state:[{t:2,x:{r:["selected","danger"],s:'_0?_1?"danger":"selected":null'},p:[10,16,267]}],action:"mode",params:['{"mode": ',{t:2,r:"mode",p:[11,40,361]},"}"]},f:[{t:2,r:"name",p:[11,51,372]}]}]}],n:52,r:"data.modes",p:[7,3,142]}]}]},r.exports.components=r.exports.components||{};var i={back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357}],359:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," ",{p:{button:[{p:[6,5,185],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Scrubber Controls",button:0},f:[" ",{t:4,f:[{p:[9,5,242],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[9,27,264]}]},f:[{p:[10,7,287],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,323],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[11,26,340]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[11,68,382]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[12,46,459]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[12,66,479]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[12,80,493]}]}]}," ",{p:[14,7,558],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[15,9,593],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["scrubbing"],s:'_0?"filter":"sign-in"'},p:[15,26,610]}],style:[{t:2,x:{r:["scrubbing"],s:'_0?null:"danger"'},p:[15,71,655]}],action:"scrubbing",params:['{"id_tag": "',{t:2,r:"id_tag",p:[16,50,738]},'", "val": ',{t:2,x:{r:["scrubbing"],s:"+!_0"},p:[16,70,758]},"}"]},f:[{t:2,x:{r:["scrubbing"],s:'_0?"Scrubbing":"Siphoning"'},p:[16,88,776]}]}]}," ",{p:[18,7,858],t:7,e:"ui-section",a:{label:"Range"},f:[{p:[19,9,894],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["widenet"],s:'_0?"expand":"compress"'},p:[19,26,911]}],style:[{t:2,x:{r:["widenet"],s:'_0?"selected":null'},p:[19,70,955]}],action:"widenet",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,1036]},'", "val": ',{t:2,x:{r:["widenet"],s:"+!_0"},p:[20,68,1056]},"}"]},f:[{t:2,x:{r:["widenet"],s:'_0?"Expanded":"Normal"'},p:[20,84,1072]}]}]}," ",{p:[22,7,1148],t:7,e:"ui-section",a:{label:"Filters"},f:[{p:[23,9,1186],t:7,e:"filters"}]}]}],n:52,r:"data.scrubbers",p:[8,3,212]},{t:4,n:51,f:[{p:[27,5,1257],t:7,e:"span",a:{"class":"bad"},f:["Error: No scrubbers connected."]}],r:"data.scrubbers"}]}]},r.exports.components=r.exports.components||{};var i={filters:t(457),back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357,457:457}],360:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Air Status"},f:[{t:4,f:[{t:4,f:[{p:[4,7,110],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[4,26,129]}]},f:[{p:[5,6,146],t:7,e:"span",a:{"class":[{t:2,x:{r:["danger_level"],s:'_0==2?"bad":_0==1?"average":"good"'},p:[5,19,159]}]},f:[{t:2,x:{r:["value"],s:"Math.fixed(_0,2)"},p:[6,5,237]},{t:2,r:"unit",p:[6,29,261]}]}]}],n:52,r:"adata.environment_data",p:[3,5,70]}," ",{p:[10,5,322],t:7,e:"ui-section",a:{label:"Local Status"},f:[{p:[11,7,363],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.danger_level"],s:'_0==2?"bad bold":_0==1?"average bold":"good"'},p:[11,20,376]}]},f:[{t:2,x:{r:["data.danger_level"],s:'_0==2?"Danger (Internals Required)":_0==1?"Caution":"Optimal"'},p:[12,6,475]}]}]}," ",{p:[15,5,619],t:7,e:"ui-section",a:{label:"Area Status"},f:[{p:[16,7,659],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.atmos_alarm","data.fire_alarm"],s:'_0||_1?"bad bold":"good"'},p:[16,20,672]}]},f:[{t:2,x:{r:["data.atmos_alarm","fire_alarm"],s:'_0?"Atmosphere Alarm":_1?"Fire Alarm":"Nominal"'},p:[17,8,744]}]}]}],n:50,r:"data.environment_data",p:[2,3,35]},{t:4,n:51,f:[{p:[21,5,876],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[22,7,912],t:7,e:"span",a:{"class":"bad bold"},f:["Cannot obtain air sample for analysis."]}]}],r:"data.environment_data"}," ",{t:4,f:[{p:[26,5,1040],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[27,7,1076],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[25,3,1014]}]}]},e.exports=a.extend(r.exports)},{341:341}],361:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.css=" th, td {\r\n padding-right: 16px;\r\n text-align: left;\r\n }",r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,116],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Alarm Thresholds",button:0},f:[" ",{p:[7,3,143],t:7,e:"table",f:[{p:[8,5,156],t:7,e:"thead",f:[{p:[8,12,163],t:7,e:"tr",f:[{p:[9,7,175],t:7,e:"th"}," ",{p:[10,7,192],t:7,e:"th",f:[{p:[10,11,196],t:7,e:"span",a:{"class":"bad"},f:["min2"]}]}," ",{p:[11,7,238],t:7,e:"th",f:[{p:[11,11,242],t:7,e:"span",a:{"class":"average"},f:["min1"]}]}," ",{p:[12,7,288],t:7,e:"th",f:[{p:[12,11,292],t:7,e:"span",a:{"class":"average"},f:["max1"]}]}," ",{p:[13,7,338],t:7,e:"th",f:[{p:[13,11,342],t:7,e:"span",a:{"class":"bad"},f:["max2"]}]}]}]}," ",{p:[15,5,401],t:7,e:"tbody",f:[{t:4,f:[{p:[16,32,441],t:7,e:"tr",f:[{p:[17,9,455],t:7,e:"th",f:[{t:3,r:"name",p:[17,13,459]}]}," ",{t:4,f:[{p:[18,27,502],t:7,e:"td",f:[{p:[19,11,518],t:7,e:"ui-button",a:{action:"threshold",params:['{"env": "',{t:2,r:"env",p:[19,58,565]},'", "var": "',{t:2,r:"val",p:[19,76,583]},'"}']},f:[{t:2,x:{r:["selected"],s:"Math.fixed(_0,2)"},p:[19,87,594]}]}]}],n:52,r:"settings",p:[18,9,484]}]}],n:52,r:"data.thresholds",p:[16,7,416]}]}," ",{p:[23,3,697],t:7,e:"table",f:[]}]}]}," "]},r.exports.components=r.exports.components||{};var i={back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357}],362:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,113],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Vent Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,166],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,188]}]},f:[{p:[9,7,211],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,264]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,306]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,383]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,403]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,417]}]}]}," ",{p:[13,7,482],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,517],t:7,e:"span",f:[{t:2,x:{r:["direction"],s:'_0=="release"?"Pressurizing":"Siphoning"'},p:[14,15,523]}]}]}," ",{p:[16,7,616],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[17,9,665],t:7,e:"ui-button",a:{icon:"sign-in",style:[{t:2,x:{r:["incheck"],s:'_0?"selected":null'},p:[17,42,698]}],action:"incheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[18,48,779]},'", "val": ',{t:2,r:"checks",p:[18,68,799]},"}"]},f:["Internal"]}," ",{p:[19,9,842],t:7,e:"ui-button",a:{icon:"sign-out",style:[{t:2,x:{r:["excheck"],s:'_0?"selected":null'},p:[19,43,876]}],action:"excheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,957]},'", "val": ',{t:2,r:"checks",p:[20,68,977]},"}"]},f:["External"]}]}," ",{t:4,f:[{p:[23,9,1064],t:7,e:"ui-section",a:{label:"Internal Target Pressure"},f:[{p:[24,11,1121],t:7,e:"ui-button",a:{icon:"pencil",action:"set_internal_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[25,33,1210]},'"}']},f:[{t:2,x:{r:["internal"],s:"Math.fixed(_0)"},p:[25,47,1224]}]}," ",{p:[26,11,1272],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["intdefault"],s:'_0?"disabled":null'},p:[26,44,1305]}],action:"reset_internal_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[27,33,1407]},'"}']},f:["Reset"]}]}],n:50,r:"incheck",p:[22,7,1039]}," ",{t:4,f:[{p:[31,11,1511],t:7,e:"ui-section",a:{label:"External Target Pressure"},f:[{p:[32,13,1570],t:7,e:"ui-button",a:{icon:"pencil",action:"set_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[33,35,1661]},'"}']},f:[{t:2,x:{r:["external"],s:"Math.fixed(_0)"},p:[33,49,1675]}]}," ",{p:[34,13,1725],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["extdefault"],s:'_0?"disabled":null'},p:[34,46,1758]}],action:"reset_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[35,35,1862]},'"}']},f:["Reset"]}]}],n:50,r:"excheck",p:[30,7,1484]}]}],n:52,r:"data.vents",p:[7,3,140]},{t:4,n:51,f:[{p:[40,5,1973],t:7,e:"span",a:{"class":"bad"},f:["Error: No vents connected."]}],r:"data.vents"}]}]},r.exports.components=r.exports.components||{};var i={back:t(357)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,357:357}],363:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.css=" table {\r\n width: 100%;\r\n border-spacing: 2px;\r\n }\r\n th {\r\n text-align: left;\r\n }\r\n td {\r\n vertical-align: top;\r\n }\r\n td .button {\r\n margin-top: 4px\r\n }",r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",f:[{p:[3,5,34],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oneAccess"],s:'_0?"unlock":"lock"'},p:[3,22,51]}],action:"one_access"},f:[{t:2,x:{r:["data.oneAccess"],s:'_0?"One":"All"'},p:[3,82,111]}," Required"]}," ",{p:[4,5,172],t:7,e:"ui-button",a:{icon:"refresh",action:"clear"},f:["Clear"]}]}," ",{p:[6,3,251],t:7,e:"hr"}," ",{p:[7,3,260],t:7,e:"table",f:[{p:[8,3,271],t:7,e:"thead",f:[{p:[9,4,283],t:7,e:"tr",f:[{t:4,f:[{p:[10,5,315],t:7,e:"th",f:[{p:[10,9,319],t:7,e:"span",a:{"class":"highlight bold"},f:[{t:2,r:"name",p:[10,38,348]}]}]}],n:52,r:"data.regions",p:[9,8,287]}]}]}," ",{p:[13,3,403],t:7,e:"tbody",f:[{p:[14,4,415],t:7,e:"tr",f:[{t:4,f:[{p:[15,5,447],t:7,e:"td",f:[{t:4,f:[{p:[16,11,481],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["req"],s:'_0?"check-square-o":"square-o"'},p:[16,28,498]}],style:[{t:2,x:{r:["req"],s:'_0?"selected":null'},p:[16,76,546]}],action:"set",params:['{"access": "',{t:2,r:"id",p:[17,46,621]},'"}']},f:[{t:2,r:"name",p:[17,56,631]}]}," ",{p:[18,9,661],t:7,e:"br"}],n:52,r:"accesses",p:[15,9,451]}]}],n:52,r:"data.regions",p:[14,8,419]}]}]}]}," ",{p:[23,2,731],t:7,e:"hr"}," ",{p:[24,2,739],t:7,e:"span",a:{"class":"highlight bold"},f:["Unrestricted Access:"]}," ",{p:[25,2,798],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&1?"check-square-o":"square-o"'},p:[25,19,815]}],style:[{t:2,x:{r:["data.unres_direction"],s:'_0&1?"selected":null'},p:[25,88,884]}],action:"direc_set",params:'{"unres_direction": "1"}'},f:["North"]}," ",{p:[26,2,1007],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&4?"check-square-o":"square-o"'},p:[26,19,1024]}],style:[{t:2,x:{r:["data.unres_direction"],s:'_0&4?"selected":null'},p:[26,88,1093]}],action:"direc_set",params:'{"unres_direction": "4"}'},f:["East"]}," ",{p:[27,2,1215],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&2?"check-square-o":"square-o"'},p:[27,19,1232]}],style:[{t:2,x:{r:["data.unres_direction"], s:'_0&2?"selected":null'},p:[27,88,1301]}],action:"direc_set",params:'{"unres_direction": "2"}'},f:["South"]}," ",{p:[28,2,1424],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.unres_direction"],s:'_0&8?"check-square-o":"square-o"'},p:[28,19,1441]}],style:[{t:2,x:{r:["data.unres_direction"],s:'_0&8?"selected":null'},p:[28,88,1510]}],action:"direc_set",params:'{"unres_direction": "8"}'},f:["West"]}]}," "]},e.exports=a.extend(r.exports)},{341:341}],364:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}},computed:{malfAction:function(){switch(this.get("data.malfStatus")){case 1:return"hack";case 2:return"occupy";case 3:return"deoccupy"}},malfButton:function(){switch(this.get("data.malfStatus")){case 1:return"Override Programming";case 2:case 4:return"Shunt Core Process";case 3:return"Return to Main Core"}},malfIcon:function(){switch(this.get("data.malfStatus")){case 1:return"terminal";case 2:case 4:return"caret-square-o-down";case 3:return"caret-square-o-left"}},powerCellStatusState:function(){var t=this.get("data.powerCellStatus");return t>50?"good":t>25?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[46,2,1206],t:7,e:"ui-notice",f:[{p:[47,3,1221],t:7,e:"b",f:[{p:[47,6,1224],t:7,e:"h3",f:["SYSTEM FAILURE"]}]}," ",{p:[48,3,1255],t:7,e:"i",f:["I/O regulators malfunction detected! Waiting for system reboot..."]},{p:[48,75,1327],t:7,e:"br"}," Automatic reboot in ",{t:2,r:"data.failTime",p:[49,23,1355]}," seconds... ",{p:[50,3,1387],t:7,e:"ui-button",a:{icon:"refresh",action:"reboot"},f:["Reboot Now"]},{p:[50,67,1451],t:7,e:"br"},{p:[50,71,1455],t:7,e:"br"},{p:[50,75,1459],t:7,e:"br"}]}],n:50,r:"data.failTime",p:[45,1,1182]},{t:4,n:51,f:[{p:[53,2,1491],t:7,e:"ui-notice",f:[{t:4,f:[{p:[55,3,1535],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[56,5,1576],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[56,22,1593]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[56,73,1644]}]}]}],n:50,r:"data.siliconUser",p:[54,4,1507]},{t:4,n:51,f:[{p:[59,3,1732],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[59,29,1758]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[62,2,1846],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[63,4,1884],t:7,e:"ui-section",a:{label:"Main Breaker"},f:[{t:4,f:[{p:[65,5,1967],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isOperating"],s:'_0?"good":"bad"'},p:[65,18,1980]}]},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[65,57,2019]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[64,3,1921]},{t:4,n:51,f:[{p:[67,5,2079],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[67,22,2096]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[67,75,2149]}],action:"breaker"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[68,21,2212]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}," ",{p:[71,4,2293],t:7,e:"ui-section",a:{label:"External Power"},f:[{p:[72,3,2332],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.externalPower"],s:"_0(_1)"},p:[72,16,2345]}]},f:[{t:2,x:{r:["data.externalPower"],s:'_0==2?"Good":_0==1?"Low":"None"'},p:[72,52,2381]}]}]}," ",{p:[74,4,2490],t:7,e:"ui-section",a:{label:"Power Cell"},f:[{t:4,f:[{p:[76,5,2567],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerCellStatus",p:[76,38,2600]}],state:[{t:2,r:"powerCellStatusState",p:[76,71,2633]}]},f:[{t:2,x:{r:["adata.powerCellStatus"],s:"Math.fixed(_0)"},p:[76,97,2659]},"%"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[75,3,2525]},{t:4,n:51,f:[{p:[78,5,2724],t:7,e:"span",a:{"class":"bad"},f:["Removed"]}],x:{r:["data.powerCellStatus"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[82,3,2830],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{t:4,f:[{p:[84,4,2913],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.chargeMode"],s:'_0?"good":"bad"'},p:[84,17,2926]}]},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[84,55,2964]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[83,5,2868]},{t:4,n:51,f:[{p:[86,4,3026],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.chargeMode"],s:'_0?"refresh":"close"'},p:[86,21,3043]}],style:[{t:2,x:{r:["data.chargeMode"],s:'_0?"selected":null'},p:[86,71,3093]}],action:"charge"},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[87,22,3156]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}," [",{p:[90,6,3236],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.chargingStatus"],s:"_0(_1)"},p:[90,19,3249]}]},f:[{t:2,x:{r:["data.chargingStatus"],s:'_0==2?"Fully Charged":_0==1?"Charging":"Not Charging"'},p:[90,56,3286]}]},"]"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[81,4,2790]}]}," ",{p:[94,2,3445],t:7,e:"ui-display",a:{title:"Power Channels"},f:[{t:4,f:[{p:[96,3,3517],t:7,e:"ui-section",a:{label:[{t:2,r:"title",p:[96,22,3536]}],nowrap:0},f:[{p:[97,5,3560],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.powerChannels",m:[{t:30,n:"@index"},"powerLoad"]},p:[97,26,3581]}]}," ",{p:[98,5,3634],t:7,e:"div",a:{"class":"content"},f:[{p:[98,26,3655],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0>=2?"good":"bad"'},p:[98,39,3668]}]},f:[{t:2,x:{r:["status"],s:'_0>=2?"On":"Off"'},p:[98,73,3702]}]}]}," ",{p:[99,5,3751],t:7,e:"div",a:{"class":"content"},f:["[",{p:[99,27,3773],t:7,e:"span",f:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"Auto":"Manual"'},p:[99,33,3779]}]},"]"]}," ",{p:[100,5,3849],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{t:4,f:[{p:[102,6,3942],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"selected":null'},p:[102,39,3975]}],action:"channel",params:[{t:2,r:"topicParams.auto",p:[103,30,4057]}]},f:["Auto"]}," ",{p:[104,6,4102],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["status"],s:'_0==2?"selected":null'},p:[104,41,4137]}],action:"channel",params:[{t:2,r:"topicParams.on",p:[105,13,4204]}]},f:["On"]}," ",{p:[106,6,4245],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["status"],s:'_0==0?"selected":null'},p:[106,37,4276]}],action:"channel",params:[{t:2,r:"topicParams.off",p:[107,13,4343]}]},f:["Off"]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[101,4,3895]}]}]}],n:52,r:"data.powerChannels",p:[95,4,3485]}," ",{p:[112,4,4439],t:7,e:"ui-section",a:{label:"Total Load"},f:[{p:[113,3,4474],t:7,e:"span",a:{"class":"bold"},f:[{t:2,r:"adata.totalLoad",p:[113,22,4493]}]}]}]}," ",{t:4,f:[{p:[117,4,4585],t:7,e:"ui-display",a:{title:"System Overrides"},f:[{p:[118,3,4626],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"overload"},f:["Overload"]}," ",{t:4,f:[{p:[120,5,4727],t:7,e:"ui-button",a:{icon:[{t:2,r:"malfIcon",p:[120,22,4744]}],state:[{t:2,x:{r:["data.malfStatus"],s:'_0==4?"disabled":null'},p:[120,43,4765]}],action:[{t:2,r:"malfAction",p:[120,97,4819]}]},f:[{t:2,r:"malfButton",p:[120,113,4835]}]}],n:50,r:"data.malfStatus",p:[119,3,4698]}]}],n:50,r:"data.siliconUser",p:[116,2,4556]}," ",{p:[124,2,4903],t:7,e:"ui-notice",f:[{p:[125,4,4919],t:7,e:"ui-section",a:{label:"Emergency Light Fallback"},f:[{t:4,f:[{p:[127,8,5020],t:7,e:"span",f:[{t:2,x:{r:["data.emergencyLights"],s:'_0?"Enabled":"Disabled"'},p:[127,14,5026]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[126,6,4971]},{t:4,n:51,f:[{p:[129,8,5106],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"emergency_lighting"},f:[{t:2,x:{r:["data.emergencyLights"],s:'_0?"Enabled":"Disabled"'},p:[129,66,5164]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}," ",{p:[133,2,5275],t:7,e:"ui-notice",f:[{p:[134,4,5291],t:7,e:"ui-section",a:{label:"Night Shift Lighting"},f:[{t:4,f:[{p:[136,8,5388],t:7,e:"span",f:[{t:2,x:{r:["data.nightshiftLights"],s:'_0?"Enabled":"Disabled"'},p:[136,14,5394]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[135,6,5339]},{t:4,n:51,f:[{p:[138,8,5475],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"toggle_nightshift"},f:[{t:2,x:{r:["data.nightshiftLights"],s:'_0?"Enabled":"Disabled"'},p:[138,65,5532]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}," ",{p:[142,2,5644],t:7,e:"ui-notice",f:[{p:[143,4,5660],t:7,e:"ui-section",a:{label:"Cover Lock"},f:[{t:4,f:[{p:[145,5,5741],t:7,e:"span",f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[145,11,5747]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[144,3,5695]},{t:4,n:51,f:[{p:[147,5,5819],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.coverLocked"],s:'_0?"lock":"unlock"'},p:[147,22,5836]}],action:"cover"},f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[147,79,5893]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}],r:"data.failTime"}]},e.exports=a.extend(r.exports)},{341:341}],365:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Alarms"},f:[{p:[2,3,31],t:7,e:"ul",f:[{t:4,f:[{p:[4,7,72],t:7,e:"li",f:[{p:[4,11,76],t:7,e:"ui-button",a:{icon:"close",style:"danger",action:"clear",params:['{"zone": "',{t:2,r:".",p:[4,83,148]},'"}']},f:[{t:2,r:".",p:[4,92,157]}]}]}],n:52,r:"data.priority",p:[3,5,41]},{t:4,n:51,f:[{p:[6,7,201],t:7,e:"li",f:[{p:[6,11,205],t:7,e:"span",a:{"class":"good"},f:["No Priority Alerts"]}]}],r:"data.priority"}," ",{t:4,f:[{p:[9,7,303],t:7,e:"li",f:[{p:[9,11,307],t:7,e:"ui-button",a:{icon:"close",style:"caution",action:"clear",params:['{"zone": "',{t:2,r:".",p:[9,84,380]},'"}']},f:[{t:2,r:".",p:[9,93,389]}]}]}],n:52,r:"data.minor",p:[8,5,275]},{t:4,n:51,f:[{p:[11,7,433],t:7,e:"li",f:[{p:[11,11,437],t:7,e:"span",a:{"class":"good"},f:["No Minor Alerts"]}]}],r:"data.minor"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],366:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.tank","data.sensors.0.long_name"],s:"_0?_1:null"},p:[1,20,19]}]},f:[{t:4,f:[{p:[3,5,102],t:7,e:"ui-subdisplay",a:{title:[{t:2,x:{r:["data.tank","long_name"],s:"!_0?_1:null"},p:[3,27,124]}]},f:[{p:[4,7,167],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[5,3,200],t:7,e:"span",f:[{t:2,x:{r:["pressure"],s:"Math.fixed(_0,2)"},p:[5,9,206]}," kPa"]}]}," ",{t:4,f:[{p:[8,9,302],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[9,11,346],t:7,e:"span",f:[{t:2,x:{r:["temperature"],s:"Math.fixed(_0,2)"},p:[9,17,352]}," K"]}]}],n:50,r:"temperature",p:[7,7,273]}," ",{t:4,f:[{p:[13,9,462],t:7,e:"ui-section",a:{label:[{t:2,r:"id",p:[13,28,481]}]},f:[{p:[14,5,495],t:7,e:"span",f:[{t:2,x:{r:["."],s:"Math.fixed(_0,2)"},p:[14,11,501]},"%"]}]}],n:52,i:"id",r:"gases",p:[12,4,434]}]}],n:52,r:"adata.sensors",p:[2,3,73]}]}," ",{t:4,f:[{p:{button:[{p:[23,5,704],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[25,5,792],t:7,e:"ui-section",a:{label:"Input Injector"},f:[{p:[26,7,835],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputting"],s:'_0?"power-off":"close"'},p:[26,24,852]}],style:[{t:2,x:{r:["data.inputting"],s:'_0?"selected":null'},p:[26,75,903]}],action:"input"},f:[{t:2,x:{r:["data.inputting"],s:'_0?"Injecting":"Off"'},p:[27,9,968]}]}]}," ",{p:[29,5,1044],t:7,e:"ui-section",a:{label:"Input Rate"},f:[{p:[30,7,1083],t:7,e:"span",f:[{t:2,x:{r:["adata.inputRate"],s:"Math.fixed(_0)"},p:[30,13,1089]}," L/s"]}]}," ",{p:[32,5,1156],t:7,e:"ui-section",a:{label:"Output Regulator"},f:[{p:[33,7,1201],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputting"],s:'_0?"power-off":"close"'},p:[33,24,1218]}],style:[{t:2,x:{r:["data.outputting"],s:'_0?"selected":null'},p:[33,76,1270]}],action:"output"},f:[{t:2,x:{r:["data.outputting"],s:'_0?"Open":"Closed"'},p:[34,9,1337]}]}]}," ",{p:[36,5,1412],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[37,7,1456],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure"},f:[{t:2,x:{r:["adata.outputPressure"],s:"Math.round(_0)"},p:[37,50,1499]}," kPa"]}]}]}],n:50,r:"data.tank",p:[20,1,618]}]},e.exports=a.extend(r.exports)},{341:341}],367:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,518],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[9,11,524]}," kPa"]}]}," ",{p:[11,3,586],t:7,e:"ui-section",a:{label:"Filter"},f:[{t:4,f:[{p:[13,7,654],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[13,25,672]}],action:"filter",params:['{"mode": ',{t:2,r:"id",p:[14,42,748]},"}"]},f:[{t:2,r:"name",p:[14,51,757]}]}],n:52,r:"data.filter_types",p:[12,5,619]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],368:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,522],t:7,e:"span",f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,11,528]}," kPa"]}]}," ",{p:[11,3,594],t:7,e:"ui-section",a:{label:"Node 1"},f:[{p:[12,5,627],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[12,44,666]}],action:"node1",params:'{"concentration": -0.1}'}}," ",{p:[14,5,783],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[14,39,817]}],action:"node1",params:'{"concentration": -0.01}'}}," ",{p:[16,5,935],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[16,38,968]}],action:"node1",params:'{"concentration": 0.01}'}}," ",{p:[18,5,1087],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[18,43,1125]}],action:"node1",params:'{"concentration": 0.1}'}}," ",{p:[20,5,1243],t:7,e:"span",f:[{t:2,x:{r:["adata.node1_concentration"],s:"Math.round(_0)"},p:[20,11,1249]},"%"]}]}," ",{p:[22,3,1319],t:7,e:"ui-section",a:{label:"Node 2"},f:[{p:[23,5,1352],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[23,44,1391]}],action:"node2",params:'{"concentration": -0.1}'}}," ",{p:[25,5,1508],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[25,39,1542]}],action:"node2",params:'{"concentration": -0.01}'}}," ",{p:[27,5,1660],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[27,38,1693]}],action:"node2",params:'{"concentration": 0.01}'}}," ",{p:[29,5,1812],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[29,43,1850]}],action:"node2",params:'{"concentration": 0.1}'}}," ",{p:[31,5,1968],t:7,e:"span",f:[{t:2,x:{r:["adata.node2_concentration"],s:"Math.round(_0)"},p:[31,11,1974]},"%"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],369:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{t:4,f:[{p:[7,5,250],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{p:[8,7,292],t:7,e:"ui-button",a:{icon:"pencil",action:"rate",params:'{"rate": "input"}'},f:["Set"]}," ",{p:[9,7,381],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.rate","data.max_rate"],s:'_0==_1?"disabled":null'},p:[9,37,411]}],action:"rate",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,525],t:7,e:"span",f:[{t:2,x:{r:["adata.rate"],s:"Math.round(_0)"},p:[10,13,531]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,223]},{t:4,n:51,f:[{p:[13,5,605],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,649],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,746],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,776]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,906],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,912]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=a.extend(r.exports)},{341:341}],370:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,72],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"data.borg.name",p:[1,20,19]}],button:0},f:[" ",{p:[5,2,149],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[6,4,181],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.emagged"],s:'_0?"check-square-o":"square-o"'},p:[6,21,198]}],style:[{t:2,x:{r:["data.borg.emagged"],s:'_0?"selected":null'},p:[6,83,260]}],action:"toggle_emagged"},f:["Emagged"]}," ",{p:[7,4,351],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.lockdown"],s:'_0?"check-square-o":"square-o"'},p:[7,21,368]}],style:[{t:2,x:{r:["data.borg.lockdown"],s:'_0?"selected":null'},p:[7,84,431]}],action:"toggle_lockdown"},f:["Locked down"]}," ",{p:[8,4,528],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.scrambledcodes"],s:'_0?"check-square-o":"square-o"'},p:[8,21,545]}],style:[{t:2,x:{r:["data.borg.scrambledcodes"],s:'_0?"selected":null'},p:[8,90,614]}],action:"toggle_scrambledcodes"},f:["Scrambled codes"]}]}," ",{p:[10,2,741],t:7,e:"ui-section",a:{label:"Charge"},f:[{t:4,f:[{p:[12,4,803],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.cell.maxcharge",p:[12,25,824]}],value:[{t:2,r:"data.cell.charge",p:[12,57,856]}]},f:[{t:2,x:{r:["data.cell.charge"],s:"Math.round(_0)"},p:[12,79,878]}," / ",{t:2,x:{r:["data.cell.maxcharge"],s:"Math.round(_0)"},p:[12,114,913]}]}],n:50,x:{r:["data.cell.missing"],s:"!_0"},p:[11,3,772]},{t:4,n:51,f:[{p:[14,4,974],t:7,e:"span",a:{"class":"warning"},f:["Cell missing"]},{p:[14,45,1015],t:7,e:"br"}],x:{r:["data.cell.missing"],s:"!_0"}}," ",{p:[16,3,1035],t:7,e:"ui-button",a:{icon:"pencil",action:"set_charge"},f:["Set"]},{p:[16,63,1095],t:7,e:"ui-button",a:{icon:"eject",action:"change_cell"},f:["Change"]},{p:[16,126,1158],t:7,e:"ui-button",a:{icon:"trash","class":"bad",action:"remove_cell"},f:["Remove"]}]}," ",{p:[18,2,1252],t:7,e:"ui-section",a:{label:"Radio channels"},f:[{t:4,f:[{p:[20,4,1319],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["installed"],s:'_0?"check-square-o":"square-o"'},p:[20,21,1336]}],style:[{t:2,x:{r:["installed"],s:'_0?"selected":null'},p:[20,75,1390]}],action:"toggle_radio",params:['{"channel": "',{t:2,r:"name",p:[20,154,1469]},'"}']},f:[{t:2,r:"name",p:[20,166,1481]}]}],n:52,r:"data.channels",p:[19,3,1291]}]}," ",{p:[23,2,1533],t:7,e:"ui-section",a:{label:"Module"},f:[{t:4,f:[{p:[25,4,1591],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.active_module","type"],s:'_0==_1?"check-square-o":"square-o"'},p:[25,21,1608]}],style:[{t:2,x:{r:["data.borg.active_module","type"],s:'_0==_1?"selected":null'},p:[25,97,1684]}],action:"setmodule",params:['{"module": "',{t:2,r:"type",p:[25,193,1780]},'"}']},f:[{t:2,r:"name",p:[25,205,1792]}]}],n:52,r:"data.modules",p:[24,3,1564]}]}," ",{p:[28,2,1844],t:7,e:"ui-section",a:{label:"Upgrades"},f:[{t:4,f:[{p:[30,4,1905],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["installed"],s:'_0?"check-square-o":"square-o"'},p:[30,21,1922]}],style:[{t:2,x:{r:["installed"],s:'_0?"selected":null'},p:[30,75,1976]}],action:"toggle_upgrade",params:['{"upgrade": "',{t:2,r:"type",p:[30,155,2056]},'"}']},f:[{t:2,r:"name",p:[30,167,2068]}]}],n:52,r:"data.upgrades",p:[29,3,1877]}]}," ",{p:[33,2,2120],t:7,e:"ui-section",a:{label:"Master AI"},f:[{t:4,f:[{p:[35,4,2177],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["connected"],s:'_0?"check-square-o":"square-o"'},p:[35,21,2194]}],style:[{t:2,x:{r:["connected"],s:'_0?"selected":null'},p:[35,75,2248]}],action:"slavetoai",params:['{"slavetoai": "',{t:2,r:"ref",p:[35,152,2325]},'"}']},f:[{t:2,r:"name",p:[35,163,2336]}]}],n:52,r:"data.ais",p:[34,3,2154]}]}]}," ",{p:{button:[{p:[41,3,2460],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.borg.lawupdate"],s:'_0?"check-square-o":"square-o"'},p:[41,20,2477]}],style:[{t:2,x:{r:["data.borg.lawupdate"],s:'_0?"selected":null'},p:[41,84,2541]}],action:"toggle_lawupdate"},f:["Lawsync"]}]},t:7,e:"ui-display",a:{title:"Laws",button:0},f:[" ",{t:4,f:[{p:[44,3,2672],t:7,e:"p",f:[{t:2,r:".",p:[44,6,2675]}]}],n:52,r:"data.laws",p:[43,2,2649]}]}]},e.exports=a.extend(r.exports)},{341:341}],371:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"selected":null'},p:[3,38,100]}],action:[{t:2,x:{r:["data.timing"],s:'_0?"stop":"start"'},p:[3,83,145]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"Stop":"Start"'},p:[3,119,181]}]}," ",{p:[4,5,233],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"flash",style:[{t:2,x:{r:["data.flash_charging"],s:'_0?"disabled":null'},p:[4,57,285]}]},f:[{t:2,x:{r:["data.flash_charging"],s:'_0?"Recharging":"Flash"'},p:[4,102,330]}]}]},t:7,e:"ui-display",a:{title:"Cell Timer",button:0},f:[" ",{p:[6,3,410],t:7,e:"ui-section",f:[{p:[7,5,428],t:7,e:"ui-button",a:{icon:"fast-backward",action:"time",params:'{"adjust": -600}'}}," ",{p:[8,5,518],t:7,e:"ui-button",a:{icon:"backward",action:"time",params:'{"adjust": -100}'}}," ",{p:[9,5,603],t:7,e:"span",f:[{t:2,x:{r:["text","data.minutes"],s:"_0.zeroPad(_1,2)"},p:[9,11,609]},":",{t:2,x:{r:["text","data.seconds"],s:"_0.zeroPad(_1,2)"},p:[9,45,643]}]}," ",{p:[10,5,689],t:7,e:"ui-button",a:{icon:"forward",action:"time",params:'{"adjust": 100}'}}," ",{p:[11,5,772],t:7,e:"ui-button",a:{icon:"fast-forward",action:"time",params:'{"adjust": 600}'}}]}," ",{p:[13,3,875],t:7,e:"ui-section",f:[{p:[14,7,895],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "short"}'},f:["Short"]}," ",{p:[15,7,999],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "medium"}'},f:["Medium"]}," ",{p:[16,7,1105],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "long"}'},f:["Long"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],372:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Bluespace Artillery Control",button:0},f:[{t:4,f:[{p:[8,3,167],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,5,200],t:7,e:"ui-button",a:{icon:"crosshairs",action:"recalibrate"},f:[{t:2,r:"data.target",p:[9,55,250]}]}]}," ",{p:[11,3,298],t:7,e:"ui-section",a:{label:"Controls"},f:[{t:4,f:[{p:[13,3,356],t:7,e:"ui-notice",f:[{p:[14,4,372],t:7,e:"span",f:["Bluespace Artillery firing protocols must be globally unlocked from two keycard authentication devices first!"]}]}],n:50,x:{r:["data.unlocked"],s:"!_0"},p:[12,2,330]},{t:4,n:51,f:[{p:[17,3,525],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.ready"],s:'_0?null:"disabled"'},p:[17,36,558]}],action:"fire"},f:["FIRE!"]}],x:{r:["data.unlocked"],s:"!_0"}}]}],n:50,r:"data.connected",p:[7,3,141]}," ",{t:4,f:[{p:[22,3,694],t:7,e:"ui-section",a:{label:"Maintenance"},f:[{p:[23,7,734],t:7,e:"ui-button",a:{icon:"wrench",action:"build"},f:["Complete Deployment."]}]}],n:50,x:{r:["data.connected"],s:"!_0"},p:[21,3,667]}]}]},e.exports=a.extend(r.exports)},{341:341}],373:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,185],t:7,e:"ui-button",a:{icon:"pencil",action:"relabel"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,266],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,301],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,307]}," kPa"]}]}," ",{p:[11,3,373],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,404],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,417]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,462]}]}]}," ",{t:4,f:[{p:[15,3,573],t:7,e:"ui-section",a:{label:"Access"},f:[{p:[16,7,608],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.restricted"],s:'_0?"lock":"unlock"'},p:[16,24,625]}],style:[{t:2,x:{r:[],s:'"caution"'},p:[17,14,680]}],action:"restricted"},f:[{t:2,x:{r:["data.restricted"],s:'_0?"Restricted to Engineering":"Public"'},p:[18,27,722]}]}]}],n:50,r:"data.isPrototype",p:[14,3,544]}]}," ",{p:[22,1,839],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[23,3,869],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[24,5,912],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[24,18,925]}],max:[{t:2,r:"data.maxReleasePressure",p:[24,52,959]}],value:[{t:2,r:"data.releasePressure",p:[25,14,1002]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[25,40,1028]}," kPa"]}]}," ",{p:[27,3,1099],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[28,5,1144],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[28,38,1177]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[30,5,1333],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[30,36,1364]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1511],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1606],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1636]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1798],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1830],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1847]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1901]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1995]}]}]}]}," ",{t:4,f:[{p:[42,1,2090],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2155],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2196],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2229]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2358],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2389]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2520],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2552]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2637],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2667]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2133]}," ",{p:[55,3,2833],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2866],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2899]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2969]}]}," ",{p:[59,2,3017],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3064],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3070]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2062]},{p:{button:[{t:4,f:[{p:[69,7,3277],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3308]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3242]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3442],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3473]}]}," ",{p:[76,3,3519],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3553]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3411]},{t:4,n:51,f:[{p:[80,3,3635],t:7,e:"ui-section",f:[{p:[81,4,3652],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{341:341}],374:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"CentCom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],t:7,e:"span",a:{"class":"bad"},f:["Loaned to CentCom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove", -params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"desc",p:[85,31,2720]}],"tooltip-side":"left",action:"add",params:['{"id": "',{t:2,r:"id",p:[85,90,2779]},'"}']},f:[{t:2,r:"cost",p:[85,100,2789]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{341:341}],375:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,174],t:7,e:"ui-notice",f:[{t:4,f:[{p:[14,5,220],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[15,7,263],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[15,24,280]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[15,75,331]}]}]}],n:50,r:"data.siliconUser",p:[13,3,189]},{t:4,n:51,f:[{p:[18,5,422],t:7,e:"span",f:["Swipe a QM-Level ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[18,39,456]}," this interface."]}],r:"data.siliconUser"}]}," ",{t:4,f:[{p:[23,3,568],t:7,e:"ui-display",a:{title:"Express Cargo Console"},f:[{p:[25,5,618],t:7,e:"ui-section",a:{label:"Landing Location"},f:[{p:[26,7,663],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.usingBeacon"],s:'_0?null:"selected"'},p:[26,25,681]}],action:"LZCargo"},f:["Cargo Bay"]}," ",{p:[27,7,770],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.hasBeacon","data.usingBeacon"],s:'_0?_1?"selected":null:"disabled"'},p:[27,25,788]}],action:"LZBeacon"},f:[{t:2,r:"data.beaconzone",p:[27,116,879]}," (",{t:2,r:"data.beaconName",p:[27,137,900]},")"]}," ",{p:[28,7,940],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.canBuyBeacon"],s:'_0?null:"disabled"'},p:[28,25,958]}],action:"printBeacon"},f:[{t:2,r:"data.printMsg",p:[28,90,1023]}]}]}," ",{p:[31,5,1079],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[32,7,1115],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[32,13,1121]}]}]}," ",{p:[35,5,1183],t:7,e:"ui-section",a:{label:"Notice"},f:[{p:[36,7,1218],t:7,e:"span",f:[{t:2,r:"data.message",p:[36,13,1224]}]}]}]}," ",{p:[39,3,1287],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[39,18,1302]}]},f:[{t:4,f:[{p:[41,7,1349],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[41,18,1360]}]},f:[{t:4,f:[{p:[43,11,1407],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[43,30,1426]}],candystripe:0,right:0},f:[{p:[44,13,1468],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.canBeacon"],s:'_0?null:"disabled"'},p:[44,31,1486]}],tooltip:[{t:2,r:"desc",p:[44,80,1535]}],"tooltip-side":"left",action:"add",params:['{"id": "',{t:2,r:"id",p:[44,139,1594]},'"}']},f:[{t:2,r:"cost",p:[44,149,1604]}," Credits ",{t:2,r:"data.beaconError",p:[44,166,1621]}]}]}],n:52,r:"packs",p:[42,9,1380]}]}],n:52,r:"data.supplies",p:[40,5,1318]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[22,1,543]}]},e.exports=a.extend(r.exports)},{341:341}],376:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,49],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,82]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,169],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,226]}]}]}," ",{p:[8,1,293],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,335],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,354]}],candystripe:0,right:0},f:[{p:[11,5,388],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,394]}]}," ",{p:[12,5,415],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,421]}]}," ",{p:[13,5,446],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,458]}]}," ",{p:[14,5,483],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,508]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,615]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,635]}]}]}],n:52,r:"data.abilities",p:[9,1,307]},{t:4,f:[{p:[23,3,738],t:7,e:"span",a:{"class":"warning"},f:["No abilities available."]}],n:51,r:"data.abilities",p:[22,1,715]}]}]},e.exports=a.extend(r.exports)},{341:341}],377:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["To use this, simply spawn the atoms you want in one of the four Centcom Supplypod Bays. Items in the bay will then be launched inside your supplypod, one turf-full at a time! You can optionally use the following buttons to configure how the supplypod acts."]}]}," ",{p:[5,1,304],t:7,e:"ui-display",a:{title:"Centcom Pod Customization (to be used against helen weinstein)"},f:[{p:[6,4,392],t:7,e:"ui-section",a:{label:"Which supplypod bay will you use?"},f:[{p:[7,9,458],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==1?"selected":null'},p:[7,27,476]}],action:"bay1"},f:["Bay #1"]}," ",{p:[8,9,557],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==2?"selected":null'},p:[8,27,575]}],action:"bay2"},f:["Bay #2"]}," ",{p:[9,9,656],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==3?"selected":null'},p:[9,27,674]}],action:"bay3"},f:["Bay #3"]}," ",{p:[10,9,755],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.bay"],s:'_0==4?"selected":null'},p:[10,27,773]}],action:"bay4"},f:["Bay #4"]}]}," ",{p:[13,5,871],t:7,e:"ui-section",a:{label:"Useful teleport tools!"},f:[{p:[14,9,926],t:7,e:"ui-button",a:{action:"teleportCentcom"},f:["Teleport to Centcom's Supplypod Loading Bay"]}," ",{p:[15,9,1027],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.oldArea"],s:'_0?null:"disabled"'},p:[15,27,1045]}],action:"teleportBack"},f:["Teleport Back to ",{t:2,x:{r:["data.oldArea"],s:'_0?_0:"where you were"'},p:[15,103,1121]}]}]}," ",{p:[18,5,1210],t:7,e:"ui-section",a:{label:"Keep stuff after launching?"},f:[{p:[19,9,1268],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.launchClone"],s:'_0?"selected":null'},p:[19,27,1286]}],action:"launchClone","tooltip-side":"left",tooltip:"Choosing this will create a duplicate of the item to be launched in Centcom, allowing you to send one type of item multiple times. Either way, the atoms are forceMoved into the supplypod after it lands (but before it opens)."},f:["Clone and Launch"]}]}," ",{p:[23,5,1668],t:7,e:"ui-section",a:{label:"Launch all at once?"},f:[{p:[24,9,1718],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.launchChoice"],s:'_0==1?"selected":null'},p:[24,27,1736]}],action:"launchOrdered","tooltip-side":"left",tooltip:'Instead of launching everything in the bay at once, this will "scan" things (one turf-full at a time) in order, left to right and top to bottom. Refreshing will reset the "scanner" to the top-leftmost position.'},f:["Ordered"]}," ",{p:[26,9,2086],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.launchChoice"],s:'_0==2?"selected":null'},p:[26,27,2104]}],action:"launchRandom","tooltip-side":"left",tooltip:"Instead of launching everything in the bay at once, this will launch one random turf of items at a time."},f:["Random"]}]}," ",{p:[30,5,2362],t:7,e:"ui-section",a:{label:"Add an explosion?"},f:[{p:[31,9,2410],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.explosionChoice"],s:'_0==1?"selected":null'},p:[31,27,2428]}],action:"explosionCustom","tooltip-side":"left",tooltip:"This will cause an explosion of whatever size you like (including flame range) to occur as soon as the supplypod lands. Dont worry, supply-pods are explosion-proof!"},f:["Custom Size"]}," ",{p:[33,9,2740],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.explosionChoice"],s:'_0==2?"selected":null'},p:[33,27,2758]}],action:"explosionBus","tooltip-side":"left",tooltip:"This will cause a maxcap explosion (dependent on server config) to occur as soon as the supplypod lands. Dont worry, supply-pods are explosion-proof!"},f:["Adminbus"]}]}," ",{p:[37,5,3066],t:7,e:"ui-section",a:{label:"Extra damage?","(default":"None)"},f:[{p:[38,9,3127],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.damageChoice"],s:'_0==1?"selected":null'},p:[38,27,3145]}],action:"damageCustom","tooltip-side":"left",tooltip:"Anyone caught under the pod when it lands will be dealt this amount of brute damage. Sucks to be them!"},f:["Custom Damage"]}," ",{p:[40,9,3392],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.damageChoice"],s:'_0==2?"selected":null'},p:[40,27,3410]}],action:"damageGib","tooltip-side":"left",tooltip:"This will attempt to gib any mob caught under the pod when it lands, as well as dealing a nice 5000 brute damage. Ya know, just to be sure!"},f:["Gib"]}]}," ",{p:[44,5,3698],t:7,e:"ui-section",a:{label:"Extra effects?"},f:[{p:[45,9,3743],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectStun"],s:'_0?"selected":null'},p:[45,27,3761]}],action:"effectStun","tooltip-side":"left",tooltip:"Anyone who is on the turf when the supplypod is launched will be stunned until the supplypod lands. They cant get away that easy!"},f:["Stun"]}," ",{p:[47,9,4017],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectLimb"],s:'_0?"selected":null'},p:[47,27,4035]}],action:"effectLimb","tooltip-side":"left",tooltip:"This will cause anyone caught under the pod to lose a limb, excluding their head."},f:["Delimb"]}," ",{p:[49,9,4245],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectBluespace"],s:'_0?"selected":null'},p:[49,27,4263]}],action:"effectBluespace","tooltip-side":"left",tooltip:"Gives the supplypod an advanced Bluespace Recyling Device. After opening, the supplypod will be warped directly to the surface of a nearby NT-designated trash planet (/r/ss13)."},f:["Bluespace"]}," ",{p:[51,9,4581],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectStealth"],s:'_0?"selected":null'},p:[51,27,4599]}],action:"effectStealth","tooltip-side":"left",tooltip:'This hides the red target icon from appearing when you launch the supplypod. Combos well with the "Invisible" style. Sneak attack, go!'},f:["Stealth"]}," ",{p:[53,9,4869],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectQuiet"],s:'_0?"selected":null'},p:[53,27,4887]}],action:"effectQuiet","tooltip-side":"left",tooltip:"This will keep the supplypod from making any sounds, except for those specifically set by admins in the Sound section."},f:["Quiet Landing"]}," ",{p:[55,9,5143],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectReverse"],s:'_0?"selected":null'},p:[55,27,5161]}],action:"effectReverse","tooltip-side":"left",tooltip:"This pod will not send any items. Instead, after landing, the supplypod will close (similar to a normal closet closing), and then launch back to the right centcom bay to drop off any new contents."},f:["Reverse Mode"]}," ",{p:[57,9,5498],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectMissile"],s:'_0?"selected":null'},p:[57,27,5516]}],action:"effectMissile","tooltip-side":"left",tooltip:"This pod will not send any items. Instead, it will immediatley delete after landing (Similar visually to setting openDelay & departDelay to 0, but this looks nicer). Useful if you just wanna fuck some shit up. Combos well with the Missile style."},f:["Missile Mode"]}," ",{p:[59,9,5902],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectCircle"],s:'_0?"selected":null'},p:[59,27,5920]}],action:"effectCircle","tooltip-side":"left",tooltip:"This will make the supplypod come in from any angle. Im not sure why this feature exists, but here it is."},f:["Any Descent Angle"]}," ",{p:[61,9,6169],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectBurst"],s:'_0?"selected":null'},p:[61,27,6187]}],action:"effectBurst","tooltip-side":"left",tooltip:"This will make each click launch 5 supplypods inaccuratly around the target turf (a 3x3 area). Combos well with the Missle Mode if you dont want shit lying everywhere after."},f:["Machine Gun Mode"]}," ",{p:[63,9,6501],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectTarget"],s:'_0?"selected":null'},p:[63,27,6519]}],action:"effectTarget","tooltip-side":"left",tooltip:"This will make the supplypod target a specific atom, instead of the mouses position. Smiting does this automatically!"},f:["Specific Target"]}," ",{p:[65,9,6778],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.effectName"],s:'_0?"selected":null'},p:[65,27,6796]}],action:"effectName","tooltip-side":"left",tooltip:"Allows you to add a custom name and description."},f:["Custom Name/Desc"]}]}," ",{p:[69,5,7e3],t:7,e:"ui-section",a:{label:"Sound?"},f:[{p:[70,9,7037],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.landingSound"],s:'_0?"selected":null'},p:[70,27,7055]}],action:"landingSound","tooltip-side":"left",tooltip:"Choose a sound to play when the pod lands."},f:["Custom Landing Sound"]}," ",{p:[72,10,7245],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.openingSound"],s:'_0?"selected":null'},p:[72,28,7263]}],action:"openingSound","tooltip-side":"left",tooltip:"Choose a sound to play when the pod opens."},f:["Custom Opening Sound"]}," ",{p:[74,9,7452],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.leavingSound"],s:'_0?"selected":null'},p:[74,27,7470]}],action:"leavingSound","tooltip-side":"left",tooltip:"Choose a sound to play when the pod departs (whether that be delection in the case of a bluespace pod, or leaving for centcom for a reversing pod)."},f:["Custom Leaving Sound"]}," ",{p:[76,9,7764],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.soundVolume"],s:'_0?"selected":null'},p:[76,27,7782]}],action:"soundVolume","tooltip-side":"left",tooltip:"Choose the volume for the sound to play at. Default values are between 1 and 100, but hey, do whatever. Im a tooltip, not a cop."},f:["Admin Sound Volume"]}]}," ",{p:[80,5,8070],t:7,e:"ui-section",a:{label:"Delay timers?"},f:[{p:[81,9,8114],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.landingDelay"],s:'_0!=5?"selected":null'},p:[81,27,8132]}],action:"landingDelay","tooltip-side":"left",tooltip:"Choose the amount of time it takes for the supplypod to hit the station. By default this value is 0.5 seconds."},f:["Custom Landing Time"]}," ",{p:[83,10,8394],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.openingDelay"],s:'_0!=30?"selected":null'},p:[83,28,8412]}],action:"openingDelay","tooltip-side":"left",tooltip:"Choose the amount of time it takes for the supplypod to open after landing. Useful for giving whatevers inside the pod a nice dramatic entrance! By default this value is 3 seconds."},f:["Custom Opening Time"]}," ",{p:[85,9,8744],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.departureDelay"],s:'_0!=30?"selected":null'},p:[85,27,8762]}],action:"departureDelay","tooltip-side":"left",tooltip:"Choose the amount of time it takes for the supplypod to leave after landing. By default this value is 3 seconds."},f:["Custom Leaving Time"]}]}," ",{p:[89,5,9047],t:7,e:"ui-section",a:{label:"Style?"},f:[{p:[90,9,9084],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==1?"selected":null'},p:[90,27,9102]}],action:"styleStandard","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to your standard Nanotrasen black and orange. Same color scheme as the normal station-used supplypods."},f:["Standard"]}," ",{p:[92,9,9405],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==2?"selected":null'},p:[92,27,9423]}],action:"styleBluespace","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to the same as the stations upgraded blue-and-white Bluespace Supplypods."},f:["Advanced"]}," ",{p:[94,9,9698],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==4?"selected":null'},p:[94,27,9716]}],action:"styleSyndie","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to a menacing black and blood-red. Great for sending meme-ops in style!"},f:["Syndicate"]}," ",{p:[96,9,9987],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==5?"selected":null'},p:[96,27,10005]}],action:"styleBlue","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to a menacing black and dark blue. Great for sending deathsquads in style!"},f:["Deathsquad"]}," ",{p:[98,10,10279],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==6?"selected":null'},p:[98,28,10297]}],action:"styleCult","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a blood and rune covered cult pod!"},f:["Cult Pod"]}," ",{p:[100,9,10524],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==7?"selected":null'},p:[100,27,10542]}],action:"styleMissile","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a large missile. Combos well with a missile mode, so the missile doesnt stick around after landing."},f:["Missile"]}," ",{p:[102,9,10836],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==8?"selected":null'},p:[102,27,10854]}],action:"styleSMissile","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a large blood-red missile. Combos well with missile mode, so the missile doesnt stick around after landing."},f:["Syndicate Missile"]}," ",{p:[104,9,11167],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==9?"selected":null'},p:[104,27,11185]}],action:"styleBox","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom style to a large, dark-green military supply crate."},f:["Supply Crate"]}," ",{p:[106,9,11423],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==10?"selected":null'},p:[106,27,11441]}],action:"styleHONK","tooltip-side":"left",tooltip:"Changes the pods style from the default Centcom color scheme to a colorful, clown inspired look."},f:["HONK"]}," ",{p:[108,9,11670],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==11?"selected":null'},p:[108,27,11688]}],action:"styleFruit","tooltip-side":"left",tooltip:"for when an orange is angry"},f:["Fruit~"]}," ",{p:[110,9,11851],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==12?"selected":null'},p:[110,27,11869]}],action:"styleInvisible","tooltip-side":"left",tooltip:'Makes the supplypod invisible! Useful for when you want to use this feature with a gateway or something. Combos well with the "Stealth" and "Quiet Landing" effects.'},f:["Invisible"]}," ",{p:[112,9,12175],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.styleChoice"],s:'_0==13?"selected":null'},p:[112,27,12193]}],action:"styleGondola","tooltip-side":"left",tooltip:"this gondola can control when he wants to deliver his supplies if he has a smart enough mind, so offer up his body to ghosts for maximum enjoyment. (Make sure to turn off bluespace and set a arbitrarily high open-time if you do!)"},f:["Gondola (alive)"]}]}]}," ",{p:[117,1,12597],t:7,e:"ui-display",f:[{p:[118,5,12615],t:7,e:"ui-section",a:{label:[{t:2,r:"data.numObjects",p:[118,26,12636]}," turfs with launchable atoms found in Bay #",{t:2,r:"data.bay",p:[118,88,12698]}]},f:[{p:[119,9,12722],t:7,e:"ui-button",a:{action:"refresh","tooltip-side":"right",tooltip:"Manually refreshes the possible things to launch in the pod bay."},f:["Refresh Pod Bay"]}]}," ",{p:[123,5,12909],t:7,e:"ui-section",f:[{p:[124,9,12931],t:7,e:"ui-button",a:{style:[{t:2,x:{r:["data.giveLauncher"],s:'_0?"selected":null'},p:[124,27,12949]}],action:"giveLauncher","tooltip-side":"right",tooltip:"THE CODEX ASTARTES CALLS THIS MANEUVER: STEEL RAIN!!"},f:["Enter Launch Mode"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],378:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:[6,1,206],t:7,e:"ui-display",a:{title:"Saved Recipes",button:0},f:[{p:[7,3,251],t:7,e:"ui-section",f:[{p:[8,5,269],t:7,e:"ui-button",a:{icon:"plus",action:"add_recipe"},f:["Add Recipe"]}," ",{p:[9,2,337],t:7,e:"ui-button",a:{icon:"minus",action:"clear_recipes"},f:["Clear Recipes"]}," ",{t:4,f:[{p:[11,7,445],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense_recipe",params:['{"recipe": "',{t:2,r:"contents",p:[11,80,518]},'"}']},f:[{t:2,r:"recipe_name",p:[11,96,534]}]}],n:52,r:"data.recipes",p:[10,5,415]}]}]}," ",{p:{button:[{t:4,f:[{p:[18,7,719],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[18,37,749]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[18,114,826]},"}"]},f:[{t:2,r:".",p:[18,122,834]}]}],n:52,r:"data.beakerTransferAmounts",p:[17,5,675]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[21,3,886],t:7,e:"ui-section",f:[{t:4,f:[{p:[23,7,936],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[23,74,1003]},'"}']},f:[{t:2,r:"title",p:[23,84,1013]}]}],n:52,r:"data.chemicals",p:[22,5,904]}]}]}," ",{p:{button:[{t:4,f:[{p:[30,7,1190],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[30,66,1249]},"}"]},f:[{t:2,r:".",p:[30,74,1257]}]}],n:52,r:"data.beakerTransferAmounts",p:[29,5,1146]}," ",{p:[32,5,1295],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[32,36,1326]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[34,3,1423],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[36,7,1493],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[36,13,1499]},"/",{t:2,r:"data.beakerMaxVolume",p:[36,55,1541]}," Units"]}," ",{p:[37,4,1583],t:7,e:"span",f:["pH: ",{t:2,x:{r:["adata.beakerCurrentpH","adata.partRating"],s:"Math.round(_0*_1)/_1"},p:[37,14,1593]}]}," ",{p:[38,7,1679],t:7,e:"br"}," ",{t:4,f:[{p:[40,9,1732],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[40,52,1775]}," units of ",{t:2,r:"name",p:[40,87,1810]}]},{p:[40,102,1825],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[39,7,1692]},{t:4,n:51,f:[{p:[42,9,1856],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[35,5,1458]},{t:4,n:51,f:[{p:[45,7,1932],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],379:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,421]}," K"]}]}]}," ",{p:{button:[{p:[14,5,564],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,595]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,692],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,762],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,781]}," K"]}," ",{p:[19,4,828],t:7,e:"br"}," ",{p:[20,7,842],t:7,e:"span",f:["pH: ",{t:2,x:{r:["adata.currentpH","adata.partRating"],s:"Math.round(_0*_1)/_1"},p:[20,17,852]}]}," ",{p:[21,7,932],t:7,e:"br"}," ",{t:4,f:[{p:[23,3,980],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[23,46,1023]}," units of ",{t:2,r:"name",p:[23,81,1058]}]},{p:[23,96,1073],t:7,e:"br"}," ",{t:4,f:[{p:[25,4,1111],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["Purity: ",{t:2,x:{r:["purity"],s:"Math.fixed(_0,2)"},p:[25,55,1162]}]},{p:[25,87,1194],t:7,e:"br"}],n:50,r:"data.showPurity",p:[24,3,1083]}],n:52,r:"adata.beakerContents",p:[22,7,946]},{t:4,n:51,f:[{p:[28,9,1237],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,727]},{t:4,n:51,f:[{p:[31,7,1313],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],380:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,32],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,87]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,143]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,199]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"No beaker"'},p:[7,5,268]}]}," ",{p:[10,3,340],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,426],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,445]}," units of ",{t:2,r:"name",p:[13,60,480]}],nowrap:0},f:[{p:[14,7,505],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,555],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,608]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,653],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,706]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,751],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,804]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,851],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,904]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,954],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1007]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1058],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[20,52,1102]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,390]},{t:4,n:51,f:[{p:[24,5,1184],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,357]},{t:4,n:51,f:[{p:[27,5,1255],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1343],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1374],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1412]}]},f:["Destroy"]}," ",{p:[34,3,1470],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1508]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1577],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1629],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1648]}," units of ",{t:2,r:"name",p:[37,59,1683]}],nowrap:0},f:[{p:[38,6,1707],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1756],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1811]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1855],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1910]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1954],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,2009]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2055],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2110]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2159],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2214]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2264],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[44,51,2308]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1594]}]}]}," ",{t:4,f:[{p:[52,3,2444],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2534],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[54,39,2568]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[54,88,2617]}]}," ",{p:[55,5,2698],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[55,27,2720]},"/",{t:2,r:"data.pillBotMaxContent",p:[55,51,2744]}]}],n:50,r:"data.isPillBottleLoaded",p:[53,4,2497]},{t:4,n:51,f:[{p:[57,5,2796],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[60,4,2860],t:7,e:"br"}," ",{p:[61,4,2870],t:7,e:"br"}," ",{p:[62,4,2880],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[62,63,2939]}]},f:["Create Pill (max 50µ)"]}," ",{p:[63,4,3023],t:7,e:"br"}," ",{p:[64,4,3033],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[64,63,3092]}]},f:["Create Multiple Pills"]}," ",{p:[65,4,3176],t:7,e:"br"}," ",{p:[66,4,3186],t:7,e:"br"}," ",{p:[67,4,3196],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[67,64,3256]}]},f:["Create Patch (max 40µ)"]}," ",{p:[68,4,3341],t:7,e:"br"}," ",{p:[69,4,3351],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[69,64,3411]}]},f:["Create Multiple Patches"]}," ",{p:[70,4,3497],t:7,e:"br"}," ",{p:[71,4,3507],t:7,e:"br"}," ",{p:[72,4,3517],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,65,3578]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[73,4,3664],t:7,e:"br"}," ",{p:[74,4,3674],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[74,65,3735]}]},f:["Dispense Buffer to Bottles"]}," ",{p:[75,4,3824],t:7,e:"br"}," ",{p:[76,4,3834],t:7,e:"br"}," ",{p:[77,4,3844],t:7,e:"ui-button",a:{action:"createVial",params:'{"many": 0}',state:[{t:2, -x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[77,63,3903]}]},f:["Create Hypo Vial (max 30µ)"]}," ",{p:[78,4,3992],t:7,e:"br"}," ",{p:[79,4,4002],t:7,e:"ui-button",a:{action:"createVial",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[79,63,4061]}]},f:["Dispense Buffer to Hypo vials"]}," ",{p:[80,4,4154],t:7,e:"br"}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2421]},{t:4,n:51,f:[{p:[85,3,4197],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[86,4,4252],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[86,63,4311]}]},f:["Create Pack (max 10µ)"]}," ",{p:[87,4,4395],t:7,e:"br"}," ",{p:[88,4,4405],t:7,e:"br"}," ",{p:[89,4,4415],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[89,65,4476]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,1,0]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[93,2,4624],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[93,20,4642]}]},f:[{p:[94,3,4673],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[95,3,4721],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[95,46,4764]}]}," ",{p:[96,3,4807],t:7,e:"br"}," ",{p:[97,3,4816],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[98,3,4858],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[98,23,4878]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[98,69,4924]}]},f:[{t:2,r:"data.analyzeVars.color",p:[98,97,4952]}]}," ",{p:[99,3,4989],t:7,e:"br"}," ",{p:[100,3,4998],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[101,3,5040],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[101,25,5062]}]}," ",{p:[102,3,5099],t:7,e:"br"}," ",{p:[103,3,5108],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[104,3,5164],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[104,25,5186]},"µ/minute"]}," ",{p:[105,3,5234],t:7,e:"br"}," ",{p:[106,3,5243],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[107,3,5298],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[107,25,5320]}]}," ",{p:[108,3,5357],t:7,e:"br"}," ",{p:[109,3,5366],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[110,3,5422],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[110,25,5444]}]}," ",{p:[111,3,5482],t:7,e:"br"}," ",{p:[112,3,5491],t:7,e:"br"}," ",{p:[113,3,5500],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{341:341}],381:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Recipient Contents"},f:[{p:[2,2,42],t:7,e:"ui-section",f:[{p:[3,3,58],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[3,34,89]}],action:"ejectBeaker"},f:["Eject"]}," ",{p:[4,3,176],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[4,35,208]}],action:"input"},f:["Input"]}," ",{p:[5,3,289],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,35,321]}],action:"amount"},f:[{t:2,r:"data.amount",p:[5,96,382]},"U"]}," ",{p:[6,3,414],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"disabled":null'},p:[6,33,444]}],action:"makecup"},f:["Create Beaker"]}]}]}," ",{p:[9,1,564],t:7,e:"ui-display",a:{title:"Recipient"},f:[{p:[10,2,597],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[12,4,662],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[12,10,668]},"/",{t:2,r:"data.beakerMaxVolume",p:[12,52,710]}," Units"]}," ",{t:4,f:[{p:[14,5,788],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[14,48,831]}," units of ",{t:2,r:"name",p:[14,83,866]}]},{p:[14,98,881],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[13,4,752]},{t:4,n:51,f:[{p:[16,5,905],t:7,e:"span",a:{"class":"bad"},f:["Recipient Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,3,630]},{t:4,n:51,f:[{p:[19,4,976],t:7,e:"span",a:{"class":"average"},f:["No Recipient"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],382:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,43]}]}]}," ",{t:4,f:[{p:[5,3,149],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[6,3,165]}," ",{t:4,f:[{p:[8,4,231],t:7,e:"br"},{p:[8,8,235],t:7,e:"ui-button",a:{action:"rec_category",params:['{"category": "',{t:2,r:"name",p:[8,63,290]},'"}']},f:[{t:3,r:"name",p:[8,75,302]}," - ",{t:3,r:"desc",p:[8,88,315]}]}],n:52,r:"data.recollection_categories",p:[7,3,188]}," ",{t:3,r:"data.rec_section",p:[10,3,354]}," ",{t:3,r:"data.rec_binds",p:[11,3,380]}]}],n:50,r:"data.recollection",p:[4,1,120]},{t:4,n:51,f:[{p:[14,2,431],t:7,e:"ui-display",a:{title:"Power",button:0},f:[{p:[15,4,469],t:7,e:"ui-section",f:[{t:3,r:"data.power",p:[16,6,488]}]}]}," ",{p:[19,2,541],t:7,e:"ui-display",f:[{p:[20,3,557],t:7,e:"ui-section",f:[{p:[21,4,574],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[21,22,592]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[22,4,715],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[22,22,733]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[23,4,857],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[23,22,875]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[24,4,1014],t:7,e:"br"},{t:3,r:"data.tier_info",p:[24,8,1018]}]}," ",{p:[26,3,1059],t:7,e:"ui-section",f:[{t:3,r:"data.scripturecolors",p:[27,4,1076]}]},{p:[28,16,1119],t:7,e:"hr"}," ",{p:[29,3,1127],t:7,e:"ui-section",f:[{t:4,f:[{p:[31,4,1172],t:7,e:"div",f:[{p:[31,9,1177],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[31,29,1197]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[31,99,1267]},'"}']},f:["Recite ",{t:3,r:"required",p:[31,118,1286]}]}," ",{t:4,f:[{t:4,f:[{p:[34,6,1362],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[34,53,1409]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[34,72,1428]}]}],n:50,r:"bound",p:[33,5,1342]},{t:4,n:51,f:[{p:[36,6,1472],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[36,53,1519]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[32,6,1319]}," ",{t:3,r:"name",p:[39,6,1586]}," ",{t:3,r:"descname",p:[39,17,1597]}," ",{t:3,r:"invokers",p:[39,32,1612]}]}],n:52,r:"data.scripture",p:[30,3,1143]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{341:341}],383:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Codex Gigas"},f:[{p:[2,2,35],t:7,e:"ui-section",f:[{t:2,r:"data.name",p:[3,3,51]}]}," ",{p:[5,5,86],t:7,e:"ui-section",a:{label:"Prefix"},f:[{p:[6,3,117],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[6,22,136]}],action:"Dark "},f:["Dark"]}," ",{p:[7,3,221],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[7,22,240]}],action:"Hellish "},f:["Hellish"]}," ",{p:[8,3,331],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[8,22,350]}],action:"Fallen "},f:["Fallen"]}," ",{p:[9,3,439],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[9,22,458]}],action:"Fiery "},f:["Fiery"]}," ",{p:[10,3,545],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[10,22,564]}],action:"Sinful "},f:["Sinful"]}," ",{p:[11,3,653],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[11,22,672]}],action:"Blood "},f:["Blood"]}," ",{p:[12,3,759],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[12,22,778]}],action:"Fluffy "},f:["Fluffy"]}]}," ",{p:[14,5,888],t:7,e:"ui-section",a:{label:"Title"},f:[{p:[15,3,918],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[15,22,937]}],action:"Lord "},f:["Lord"]}," ",{p:[16,3,1022],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[16,22,1041]}],action:"Prelate "},f:["Prelate"]}," ",{p:[17,3,1132],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[17,22,1151]}],action:"Count "},f:["Count"]}," ",{p:[18,3,1238],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[18,22,1257]}],action:"Viscount "},f:["Viscount"]}," ",{p:[19,3,1350],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[19,22,1369]}],action:"Vizier "},f:["Vizier"]}," ",{p:[20,3,1458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[20,22,1477]}],action:"Elder "},f:["Elder"]}," ",{p:[21,3,1564],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[21,22,1583]}],action:"Adept "},f:["Adept"]}]}," ",{p:[23,5,1691],t:7,e:"ui-section",a:{label:"Name"},f:[{p:[24,3,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[24,22,1739]}],action:"hal"},f:["hal"]}," ",{p:[25,3,1821],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[25,22,1840]}],action:"ve"},f:["ve"]}," ",{p:[26,3,1920],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[26,22,1939]}],action:"odr"},f:["odr"]}," ",{p:[27,3,2021],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[27,22,2040]}],action:"neit"},f:["neit"]}," ",{p:[28,3,2124],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[28,22,2143]}],action:"ci"},f:["ci"]}," ",{p:[29,3,2223],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[29,22,2242]}],action:"quon"},f:["quon"]}," ",{p:[30,3,2326],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[30,22,2345]}],action:"mya"},f:["mya"]}," ",{p:[31,3,2427],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[31,22,2446]}],action:"folth"},f:["folth"]}," ",{p:[32,3,2532],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[32,22,2551]}],action:"wren"},f:["wren"]}," ",{p:[33,3,2635],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[33,22,2654]}],action:"geyr"},f:["geyr"]}," ",{p:[34,3,2738],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[34,22,2757]}],action:"hil"},f:["hil"]}," ",{p:[35,3,2839],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[35,22,2858]}],action:"niet"},f:["niet"]}," ",{p:[36,3,2942],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[36,22,2961]}],action:"twou"},f:["twou"]}," ",{p:[37,3,3045],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[37,22,3064]}],action:"phi"},f:["phi"]}," ",{p:[38,3,3146],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[38,22,3165]}],action:"coa"},f:["coa"]}]}," ",{p:[40,5,3268],t:7,e:"ui-section",a:{label:"suffix"},f:[{p:[41,3,3299],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[41,22,3318]}],action:" the Red"},f:["the Red"]}," ",{p:[42,3,3409],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[42,22,3428]}],action:" the Soulless"},f:["the Soulless"]}," ",{p:[43,3,3529],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[43,22,3548]}],action:" the Master"},f:["the Master"]}," ",{p:[44,3,3645],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[44,22,3664]}],action:", the Lord of all things"},f:["the Lord of all things"]}," ",{p:[45,3,3786],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[45,22,3805]}],action:", Jr."},f:["jr"]}]}," ",{p:[47,5,3909],t:7,e:"ui-section",a:{label:"submit"},f:[{p:[48,3,3941],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0>=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],384:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["Network Card"]}," allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["Processor Unit"]}," is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["Tesla Relay"]}," is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["Nano Printer"]}," is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["Card Reader"]}," adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{341:341}],385:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],386:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{isHead:function(t){return t%10==0},dept_class:function(t){return 0==t?"dept-cap":t>=10&&20>t?"dept-sec":t>=20&&30>t?"dept-med":t>=30&&40>t?"dept-sci":t>=40&&50>t?"dept-eng":t>=50&&60>t?"dept-cargo":t>=200&&230>t?"dept-cent":"dept-other"},health_state:function(t,e,n,a){var r=t+e+n+a;return 0>=r?"health-5":25>=r?"health-4":50>=r?"health-3":75>=r?"health-2":"health-0"}}}}(r),r.exports.css=" .health {\r\n width: 16px;\r\n height: 16px;\r\n background-color: #FFF;\r\n border: 1px solid #434343;\r\n position: relative;\r\n top: 2px;\r\n display: inline-block;\r\n }\r\n .health-5 { background-color: #17d568; }\r\n .health-4 { background-color: #2ecc71; }\r\n .health-3 { background-color: #e67e22; }\r\n .health-2 { background-color: #ed5100; }\r\n .health-1 { background-color: #e74c3c; }\r\n .health-0 { background-color: #ed2814; }\r\n\r\n .dept-cap {color : #C06616;}\r\n .dept-sec {color : #E74C3C;}\r\n .dept-med {color : #3498DB;}\r\n .dept-sci {color : #9B59B6;}\r\n .dept-eng {color : #F1C40F;}\r\n .dept-cargo {color : #F39C12;}\r\n .dept-cent {color : #00C100;}\r\n .dept-other {color: #C38312;}\r\n\r\n .oxy { color : #3498db; }\r\n .toxin { color : #2ecc71; }\r\n .burn { color : #e67e22; }\r\n .brute { color : #e74c3c; }\r\n\r\n table.crew{\r\n border-collapse: collapse;\r\n }\r\n\r\n table.crew td {\r\n padding : 0px 10px;\r\n }",r.exports.template={v:3,t:[" ",{p:[27,1,1030],t:7,e:"ui-display",f:[{p:[28,2,1045],t:7,e:"ui-section",f:[{p:[29,3,1061],t:7,e:"table",a:{"class":"crew"},f:[{p:[30,3,1085],t:7,e:"thead",f:[{p:[31,3,1096],t:7,e:"tr",f:[{p:[32,4,1105],t:7,e:"th",f:["Name"]}," ",{p:[33,4,1123],t:7,e:"th",f:["Status"]}," ",{p:[34,4,1143],t:7,e:"th",f:["Vitals"]}," ",{p:[35,4,1163],t:7,e:"th",f:["Position"]}," ",{t:4,f:[{p:[37,5,1216],t:7,e:"th",f:["Tracking"]}],n:50,r:"data.link_allowed",p:[36,4,1185]}]}]}," ",{p:[41,3,1270],t:7,e:"tbody",f:[{t:4,f:[{p:[43,4,1308],t:7,e:"tr",f:[{p:[44,5,1318],t:7,e:"td",f:[{p:[45,6,1329],t:7,e:"span",a:{"class":[{t:2,x:{r:["isHead","ijob"],s:'_0(_1)?"bold ":""'},p:[45,19,1342]},{t:2,x:{r:["dept_class","ijob"],s:"_0(_1)"},p:[45,49,1372]}]},f:[{t:2,r:"name",p:[46,7,1402]}," (",{t:2,r:"assignment",p:[46,17,1412]},") ",{p:[47,6,1434],t:7,e:"span",f:[]}]}]}," ",{p:[49,5,1457],t:7,e:"td",f:[{t:4,f:[{p:[51,7,1498],t:7,e:"span",a:{"class":["health ",{t:2,x:{r:["health_state","oxydam","toxdam","burndam","brutedam"],s:"_0(_1,_2,_3,_4)"},p:[51,27,1518]}]}}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[50,6,1468]},{t:4,n:51,f:[{t:4,f:[{p:[54,8,1626],t:7,e:"span",a:{"class":"health health-5"}}],n:50,r:"life_status",p:[53,7,1598]},{t:4,n:51,f:[{p:[56,8,1688],t:7,e:"span",a:{"class":"health health-0"}}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[60,5,1771],t:7,e:"td",f:[{t:4,f:[{p:[62,7,1812],t:7,e:"span",f:["( ",{p:[64,8,1836],t:7,e:"span",a:{"class":"oxy"},f:[{t:2,r:"oxydam",p:[64,26,1854]}]}," / ",{p:[66,8,1890],t:7,e:"span",a:{"class":"toxin"},f:[{t:2,r:"toxdam",p:[66,28,1910]}]}," / ",{p:[68,8,1946],t:7,e:"span",a:{"class":"burn"},f:[{t:2,r:"burndam",p:[68,27,1965]}]}," / ",{p:[70,8,2002],t:7,e:"span",a:{"class":"brute"},f:[{t:2,r:"brutedam",p:[70,28,2022]}]}," )"]}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[61,6,1782]},{t:4,n:51,f:[{t:4,f:[{p:[75,8,2116],t:7,e:"span",f:["Alive"]}],n:50,r:"life_status",p:[74,7,2088]},{t:4,n:51,f:[{p:[77,8,2159],t:7,e:"span",f:["Dead"]}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[81,5,2222],t:7,e:"td",f:[{t:4,f:[{p:[83,6,2260],t:7,e:"span",f:[{t:2,r:"area",p:[83,12,2266]}]}],n:50,x:{r:["pos_x"],s:"_0!=null"},p:[82,5,2232]},{t:4,n:51,f:[{p:[85,6,2302],t:7,e:"span",f:["N/A"]}],x:{r:["pos_x"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[89,6,2381],t:7,e:"td",f:[{p:[90,7,2393],t:7,e:"ui-button",a:{action:"select_person",state:[{t:2,x:{r:["can_track"],s:'_0?null:"disabled"'},p:[90,48,2434]}],params:['{"name":"',{t:2,r:"name",p:[90,100,2486]},'"}']},f:["Track"]}]}],n:50,r:"data.link_allowed",p:[88,5,2348]}]}],n:52,r:"data.sensors",p:[42,3,1281]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{341:341}],387:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,189],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,223],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,236]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,265]}]}]}," ",{p:[9,4,317],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[10,6,356],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.temperaturestatus",p:[10,19,369]}]},f:[{t:2,r:"data.occupant.bodyTemperature",p:[10,56,406]}," K"]}]}," ",{p:[12,5,472],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[13,7,507],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[13,20,520]}],max:[{t:2,r:"data.occupant.maxHealth",p:[13,54,554]}],value:[{t:2,r:"data.occupant.health",p:[13,90,590]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[14,16,632]}]},f:[{t:2,r:"data.occupant.health",p:[14,68,684]}]}]}," ",{t:4,f:[{p:[17,7,908],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[17,26,927]}]},f:[{p:[18,9,948],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[18,30,969]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,66,1005]}],state:"bad"},f:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,103,1042]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[16,5,742]}],n:50,r:"data.hasOccupant",p:[5,3,159]}]}," ",{p:[23,1,1138],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[24,3,1167],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[25,5,1199],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[25,22,1216]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[26,14,1276]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[27,14,1332]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[28,22,1391]}]}]}," ",{p:[30,3,1459],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,3,1495],t:7,e:"span",a:{"class":[{t:2,r:"data.temperaturestatus",p:[31,16,1508]}]},f:[{t:2,r:"data.cellTemperature",p:[31,44,1536]}," K"]}]}," ",{p:[33,2,1588],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[34,5,1619],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[34,22,1636]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[34,73,1687]}]}," ",{p:[35,5,1740],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[35,22,1757]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[35,86,1821]}]}]}]}," ",{p:{button:[{p:[40,5,1967],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[40,36,1998]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[42,3,2101],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[45,9,2211],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,r:"volume",p:[45,52,2254]}," units of ",{t:2,r:"name",p:[45,72,2274]}]},{p:[45,87,2289],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[44,7,2171]},{t:4,n:51,f:[{p:[47,9,2320],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[43,5,2136]},{t:4,n:51,f:[{p:[50,7,2396],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],388:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{ -p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle"},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],389:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{341:341}],390:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,183],t:7,e:"ui-section",a:{label:"Items in storage"},f:[{p:[7,4,225],t:7,e:"span",f:[{t:2,r:"data.items",p:[7,10,231]}]}]}],n:50,r:"data.items",p:[5,3,159]}," ",{t:4,f:[{p:[11,5,310],t:7,e:"ui-section",a:{label:"State"},f:[{p:[12,7,344],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[12,20,357]}]},f:[{t:2,r:"data.occupant.stat",p:[12,49,386]}]}]}," ",{p:[14,5,439],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[15,7,474],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[15,20,487]}],max:[{t:2,r:"data.occupant.maxHealth",p:[15,54,521]}],value:[{t:2,r:"data.occupant.health",p:[15,90,557]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[16,16,599]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[16,68,651]}]}]}," ",{t:4,f:[{p:[19,7,888],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[19,26,907]}]},f:[{p:[20,9,928],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[20,30,949]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[20,66,985]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[20,103,1022]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[18,5,722]}," ",{p:[23,5,1109],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[24,9,1145],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[24,22,1158]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[24,68,1204]}]}]}," ",{p:[26,5,1287],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[27,9,1323],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[27,22,1336]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[27,68,1382]}]}]}," ",{p:[29,5,1466],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[31,11,1553],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[31,54,1596]}," units of ",{t:2,r:"name",p:[31,89,1631]}]},{p:[31,104,1646],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[30,9,1508]},{t:4,n:51,f:[{p:[33,11,1681],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[10,3,283]}]}," ",{p:[38,1,1777],t:7,e:"ui-display",a:{title:"Operations"},f:[{p:[39,3,1812],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[41,7,1872],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied"],s:'_0?null:"disabled"'},p:[41,38,1903]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[41,111,1976]},'"}']},f:[{t:2,r:"name",p:[41,121,1986]}]},{p:[41,141,2006],t:7,e:"br"}],n:52,r:"data.chem",p:[40,5,1845]}]}," ",{p:[44,2,2046],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[45,6,2079],t:7,e:"ui-button",a:{icon:"sign-out",action:"eject"},f:["Eject Contents"]}]}," ",{p:[47,2,2166],t:7,e:"ui-section",a:{label:"Self Cleaning"},f:[{p:[48,3,2204],t:7,e:"ui-button",a:{icon:"recycle",action:"cleaning"},f:["Self-Clean Cycle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],391:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{341:341}],392:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{341:341}],393:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{341:341}],394:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{341:341}],395:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,20],t:7,e:"ui-notice",f:["Currently syncing with the database"]}],n:50,r:"data.sync",p:[1,1,0]},{t:4,n:51,f:[{p:{button:[{p:[8,4,163],t:7,e:"ui-button",a:{icon:"eject",action:"eject_all"},f:["Eject all"]}," ",{p:[9,4,232],t:7,e:"ui-button",a:{icon:["toggle-",{t:2,x:{r:["data.show_materials"],s:'_0?"off":"on"'},p:[9,28,256]}],action:"toggle_materials_visibility"},f:[{t:2,x:{r:["data.show_materials"],s:'_0?"Hide":"Show"'},p:[10,5,339]}]}]},t:7,e:"ui-display",a:{title:"Materials",button:0},f:[" ",{t:4,f:[{p:[14,4,449],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[15,5,484],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[16,6,520],t:7,e:"section",a:{"class":"cell"}}," ",{p:[17,6,559],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[20,6,620],t:7,e:"section",a:{"class":"cell"},f:["Amount"]}," ",{p:[23,6,680],t:7,e:"section",a:{"class":"cell"}}," ",{p:[24,6,719],t:7,e:"section",a:{"class":"cell"}}]}," ",{t:4,f:[{p:[27,6,808],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[28,7,845],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[29,8,876]}]}," ",{p:[31,7,910],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"amount",p:[32,8,941]}]}," ",{p:[34,7,977],t:7,e:"section",a:{"class":"cell"},f:[{p:[35,8,1008],t:7,e:"ui-button",a:{icon:"eject"},f:["Release amount"]}]}," ",{p:[37,7,1084],t:7,e:"section",a:{"class":"cell",style:"width: 40px;"},f:[{p:[38,8,1136],t:7,e:"ui-button",a:{icon:"eject"},f:["Release all"]}]}]}],n:52,r:"data.all_materials",p:[26,5,773]}]}],n:50,r:"data.show_materials",p:[13,3,417]}]}," ",{p:[45,2,1274],t:7,e:"ui-display",a:{title:"Categories"},f:[{t:4,f:[{p:[47,4,1334],t:7,e:"ui-button",f:[{t:2,r:".",p:[47,15,1345]}]}],r:"data.categories",p:[46,3,1309]}]}],r:"data.sync"}]},e.exports=a.extend(r.exports)},{341:341}],396:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,5,49],t:7,e:"ui-button",a:{action:"toggle_power",style:[{t:2,x:{r:["data.toggle"],s:'_0?"selected":null'},p:[5,18,111]}]},f:["Turn ",{t:2,x:{r:["data.toggle"],s:'_0?"off":"on"'},p:[6,16,166]}]}]}," ",{p:[9,3,235],t:7,e:"ui-display",a:{title:"Logging"},f:[{t:4,f:[{p:[11,3,292],t:7,e:"ui-section",a:{label:">"},f:[{t:2,r:".",p:[11,25,314]},{p:[11,30,319],t:7,e:"ui-section",f:[]}]}],n:52,r:"data.logs",p:[10,5,269]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],397:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{341:341}],398:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{341:341}],399:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],400:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=a.extend(r.exports)},{341:341}],401:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{341:341}],402:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],403:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{341:341}],404:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{341:341}],405:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],406:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{341:341}],407:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224],t:7,e:"b",f:[{t:2,r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["â†"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button",a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2, -r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down"},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{341:341}],408:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{341:341}],409:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{341:341}],410:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Chamber Console"},f:[{p:[2,1,45],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,2,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,63,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,3,200],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[6,36,233]}]}," ",{p:[7,3,268],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[7,35,300]}]}," ",{p:[8,3,335],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[8,41,373]}]}," ",{t:4,f:[{p:[10,4,477],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[10,41,514]}]}],n:50,r:"data.disk.activation_delay",p:[9,3,438]}," ",{t:4,f:[{p:[13,4,600],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[13,30,626]}]}," ",{p:[14,4,663],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[14,36,695]}]}],n:50,r:"data.disk.timer",p:[12,3,572]}," ",{t:4,f:[{p:[17,4,785],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[17,40,821]}]}],n:50,r:"data.disk.activation_code",p:[16,3,747]}," ",{t:4,f:[{p:[20,4,918],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[20,42,956]}]}],n:50,r:"data.disk.deactivation_code",p:[19,3,878]}," ",{t:4,f:[{p:[23,4,1047],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[23,34,1077]}]}],n:50,r:"data.disk.kill_code",p:[22,3,1015]}," ",{t:4,f:[{p:[26,4,1163],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[26,37,1196]}]}],n:50,r:"data.disk.trigger_code",p:[25,3,1128]}," ",{t:4,f:[{t:4,f:[{p:[30,6,1332],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[30,25,1351]}]},f:[{t:2,r:"value",p:[30,35,1361]}]}],n:52,r:"data.disk.extra_settings",p:[29,4,1291]}],n:50,r:"data.disk.has_extra_settings",p:[28,3,1250]}],n:50,r:"data.has_program",p:[5,2,172]},{t:4,n:51,f:[{p:[34,3,1423],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,1,80]},{t:4,n:51,f:[{p:[37,2,1489],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[40,1,1550],t:7,e:"br"}," ",{t:4,f:[{p:[42,2,1582],t:7,e:"ui-notice",f:[{t:2,r:"data.status_msg",p:[42,13,1593]}]}],n:50,r:"data.status_msg",p:[41,1,1556]},{t:4,n:51,f:[{p:[44,2,1637],t:7,e:"ui-display",a:{title:"Chamber"},f:[{p:[45,2,1668],t:7,e:"ui-section",f:[{p:[45,14,1680],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock-open":"lock"'},p:[45,30,1696]}],action:"toggle_lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[45,90,1756]}," Chamber"]},{p:[45,146,1812],t:7,e:"br"}]}," ",{p:[46,2,1832],t:7,e:"ui-section",f:[{p:[46,14,1844],t:7,e:"b",f:["Occupant:"]}," ",{t:2,r:"data.occupant_name",p:[46,31,1861]}]}," ",{t:4,f:[{p:[48,4,1929],t:7,e:"ui-section",f:[{p:[48,16,1941],t:7,e:"ui-notice",f:["No nanites detected."]}]}," ",{p:[49,4,2002],t:7,e:"ui-section",f:[{p:[49,16,2014],t:7,e:"ui-button",a:{icon:"syringe",action:"nanite_injection"},f:["Implant Nanites"]}]}],n:50,x:{r:["data.has_nanites"],s:"!_0"},p:[47,2,1899]},{t:4,n:51,f:[{p:[51,3,2121],t:7,e:"ui-display",a:{title:"Nanites"},f:[{t:4,f:[{p:[53,5,2181],t:7,e:"ui-button",a:{icon:"download",action:"add_program"},f:["Install Program From Disk"]},{p:[53,90,2266],t:7,e:"br"}," ",{p:[54,5,2276],t:7,e:"br"}],n:50,r:"data.has_disk",p:[52,4,2154]}," ",{p:[56,4,2297],t:7,e:"ui-section",f:[{p:[57,5,2315],t:7,e:"ui-section",a:{label:"Nanite Volume"},f:[{t:2,r:"data.nanite_volume",p:[57,39,2349]}]}," ",{p:[58,5,2390],t:7,e:"ui-section",a:{label:"Growth Rate"},f:[{t:2,r:"data.regen_rate",p:[58,37,2422]}]}," ",{p:[59,5,2460],t:7,e:"ui-section",a:{label:"Safety Threshold"},f:[{t:2,r:"data.safety_threshold",p:[59,42,2497]}," ",{p:[59,68,2523],t:7,e:"ui-button",a:{icon:"pencil",action:"set_safety"},f:["Set"]}]}," ",{p:[60,5,2603],t:7,e:"ui-section",a:{label:"Cloud ID"},f:[{t:2,x:{r:["data.cloud_id"],s:'_0?_0:"No Cloud"'},p:[60,34,2632]}," ",{p:[60,82,2680],t:7,e:"ui-button",a:{icon:"pencil",action:"set_cloud"},f:["Set"]}]}]}," ",{p:[62,4,2776],t:7,e:"ui-display",a:{title:"Programs"},f:[{t:4,f:[{p:[64,6,2845],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[64,25,2864]}],button:0},f:[{p:[65,6,2888],t:7,e:"ui-button",a:{icon:"minus",action:"remove_program",params:['{"program_id": "',{t:2,r:"id",p:[65,78,2960]},'"}']},f:["Uninstall"]}," ",{p:[66,6,2998],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[66,38,3030]}]}," ",{t:4,f:[{p:[68,7,3094],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[68,45,3132]}]}," ",{p:[69,7,3191],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[69,44,3228]},"/s"]}," ",{t:4,f:[{p:[71,8,3291],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[71,41,3324]}]}," ",{p:[72,8,3362],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[72,45,3399]}," seconds"]}],n:50,r:"can_trigger",p:[70,7,3263]}," ",{t:4,f:[{t:4,f:[{p:[76,9,3534],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,46,3571]}]}],n:50,r:"activation_delay",p:[75,8,3500]}," ",{t:4,f:[{p:[79,9,3652],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,35,3678]}]}," ",{p:[80,9,3710],t:7,e:"ui-section",a:{label:"Timer Type"},f:[{t:2,r:"timer_type",p:[80,40,3741]}]}],n:50,r:"timer",p:[78,8,3629]}," ",{t:4,f:[{t:4,f:[{p:[84,11,3865],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,30,3884]}]},f:[{t:2,r:"value",p:[84,40,3894]}]}],n:52,r:"extra_settings",p:[83,9,3829]}],n:50,r:"has_extra_settings",p:[82,8,3793]}," ",{t:4,f:[{t:4,f:[{p:[89,10,4032],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[89,46,4068]}]}],n:50,r:"activation_code",p:[88,9,3998]}," ",{t:4,f:[{p:[92,10,4163],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[92,48,4201]}]}],n:50,r:"deactivation_code",p:[91,9,4127]}," ",{t:4,f:[{p:[95,10,4290],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[95,40,4320]}]}],n:50,r:"kill_code",p:[94,9,4262]}," ",{t:4,f:[{p:[98,10,4404],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[98,43,4437]}]}],n:50,r:"trigger_code",p:[97,9,4373]}],n:50,x:{r:["data.scan_level"],s:"_0>=4"},p:[87,8,3960]}],n:50,x:{r:["data.scan_level"],s:"_0>=3"},p:[74,7,3463]}],n:50,x:{r:["data.scan_level"],s:"_0>=2"},p:[67,6,3058]}]}],n:52,r:"data.mob_programs",p:[63,5,2811]}]}]}],x:{r:["data.has_nanites"],s:"!_0"}}]}],r:"data.status_msg"}]}]},e.exports=a.extend(r.exports)},{341:341}],411:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Cloud Console"},f:[{p:[2,1,43],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,3,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,64,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,4,202],t:7,e:"ui-section",f:[{p:[7,5,220],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[7,38,253]}]}," ",{p:[8,5,290],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[8,37,322]}]}," ",{p:[9,5,359],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[9,43,397]}]}," ",{t:4,f:[{p:[11,6,505],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[11,43,542]}]}],n:50,r:"data.disk.activation_delay",p:[10,5,464]}," ",{t:4,f:[{p:[14,6,634],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[14,32,660]}]}," ",{p:[15,6,699],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[15,38,731]}]}],n:50,r:"data.disk.timer",p:[13,5,604]}," ",{t:4,f:[{p:[18,6,827],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[18,42,863]}]}],n:50,r:"data.disk.activation_code",p:[17,5,787]}," ",{t:4,f:[{p:[21,6,966],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[21,44,1004]}]}],n:50,r:"data.disk.deactivation_code",p:[20,5,924]}," ",{t:4,f:[{p:[24,6,1101],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[24,36,1131]}]}],n:50,r:"data.disk.kill_code",p:[23,5,1067]}," ",{t:4,f:[{p:[27,6,1223],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[27,39,1256]}]}],n:50,r:"data.disk.trigger_code",p:[26,5,1186]}," ",{t:4,f:[{t:4,f:[{p:[31,8,1400],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[31,27,1419]}]},f:[{t:2,r:"value",p:[31,37,1429]}]}],n:52,r:"data.disk.extra_settings",p:[30,6,1357]}],n:50,r:"data.disk.has_extra_settings",p:[29,5,1314]}]}],n:50,r:"data.has_program",p:[5,3,173]},{t:4,n:51,f:[{p:[36,4,1515],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,2,79]},{t:4,n:51,f:[{p:[39,3,1584],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[42,1,1646],t:7,e:"ui-display",a:{title:"Cloud Storage"},f:[{t:4,f:[{p:[44,3,1713],t:7,e:"ui-button",a:{icon:"plus-circle",action:"create_backup"},f:["Create New Backup"]}," ",{p:[45,3,1799],t:7,e:"ui-display",a:{title:"Active Backups"},f:[{t:4,f:[{p:[47,5,1873],t:7,e:"ui-button",a:{action:"set_view",params:['{"view": "',{t:2,r:"cloud_id",p:[47,52,1920]},'"}']},f:["Backup #",{t:2,r:"cloud_id",p:[47,76,1944]}]}],n:52,r:"data.cloud_backups",p:[46,4,1839]}]}],n:50,x:{r:["data.current_view"],s:"!_0"},p:[43,2,1683]},{t:4,n:51,f:[{p:[51,3,2014],t:7,e:"ui-button",a:{icon:"undo",action:"set_view",params:'{"view": "0"}'},f:["Return"]}," ",{t:4,f:[{p:[53,4,2131],t:7,e:"ui-notice",f:["ERROR: Backup not found."]}],n:50,x:{r:["data.cloud_backup"],s:"!_0"},p:[52,3,2100]},{t:4,n:51,f:[{p:[55,4,2195],t:7,e:"ui-display",a:{title:["Backup #",{t:2,r:"data.current_view",p:[55,31,2222]}]},f:[{t:4,f:[{p:[57,6,2282],t:7,e:"ui-button",a:{icon:"upload",action:"upload_program",style:"selected"},f:["Upload Program From Disk"]},{p:[57,108,2384],t:7,e:"br"}],n:50,r:"data.has_program",p:[56,5,2251]}," ",{t:4,f:[{p:[60,6,2443],t:7,e:"hr"}," ",{p:[61,6,2454],t:7,e:"ui-section",f:[{p:[62,7,2474],t:7,e:"h3",f:[{t:2,r:"name",p:[62,11,2478]}]}," ",{p:[63,7,2499],t:7,e:"div",a:{style:"float:right"},f:[{p:[64,8,2533],t:7,e:"ui-button",a:{icon:"minus-circle",action:"remove_program",style:"danger",params:['{"program_id": "',{t:2,r:"id",p:[64,102,2627]},'"}']},f:["Uninstall"]}]}]}," ",{p:[67,6,2699],t:7,e:"ui-section",f:[{p:[68,7,2719],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[68,39,2751]}]}," ",{p:[69,7,2780],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[69,45,2818]}]}," ",{p:[70,7,2877],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[70,44,2914]},"/s"]}," ",{t:4,f:[{p:[72,8,2977],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[72,41,3010]},"/s"]}," ",{p:[73,8,3050],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[73,45,3087]},"/s"]}],n:50,r:"can_trigger",p:[71,7,2949]}," ",{t:4,f:[{p:[76,8,3178],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,45,3215]}]}],n:50,r:"activation_delay",p:[75,7,3145]}," ",{t:4,f:[{p:[79,8,3293],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,34,3319]}]}," ",{p:[80,8,3350],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"timer_type",p:[80,40,3382]}]}],n:50,r:"timer",p:[78,7,3271]}," ",{t:4,f:[{p:[83,8,3464],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[83,44,3500]}]}],n:50,r:"activation_code",p:[82,7,3432]}," ",{t:4,f:[{p:[86,8,3589],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[86,46,3627]}]}],n:50,r:"deactivation_code",p:[85,7,3555]}," ",{t:4,f:[{p:[89,8,3710],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[89,38,3740]}]}],n:50,r:"kill_code",p:[88,7,3684]}," ",{t:4,f:[{p:[92,8,3818],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[92,41,3851]}]}],n:50,r:"trigger_code",p:[91,7,3789]}," ",{t:4,f:[{t:4,f:[{p:[96,10,3973],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[96,29,3992]}]},f:[{t:2,r:"value",p:[96,39,4002]}]}],n:52,r:"extra_settings",p:[95,8,3938]}],n:50,r:"has_extra_settings",p:[94,7,3903]}]}],n:52,r:"data.cloud_programs",p:[59,5,2407]}]}],x:{r:["data.cloud_backup"],s:"!_0"}}],x:{r:["data.current_view"],s:"!_0"}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],412:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Program Hub"},f:[{t:4,f:[{p:[3,2,65],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{p:[4,3,102],t:7,e:"ui-section",f:[{p:[5,4,119],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{p:[6,4,185],t:7,e:"ui-button",a:{icon:"minus-circle",action:"clear"},f:["Delete Program"]}]}," ",{t:4,f:[{p:[9,4,307],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[9,37,340]}]}," ",{p:[10,4,376],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[10,36,408]}]}],n:50,r:"data.has_program",p:[8,3,278]},{t:4,n:51,f:[{p:[12,4,456],t:7,e:"ui-notice",f:["No program installed."]}],r:"data.has_program"}]}],n:50,r:"data.has_disk",p:[2,1,41]},{t:4,n:51,f:[{p:[16,2,540],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"},{p:[18,1,586],t:7,e:"br"}," ",{p:[19,1,592],t:7,e:"ui-display",a:{title:"Programs"},f:[{p:[20,2,624],t:7,e:"ui-section",f:[{p:[21,3,640],t:7,e:"ui-button",a:{icon:"undo",action:"set_category",params:'{"category": "Main"}'},f:["Return"]}," ",{p:[22,3,737],t:7,e:"ui-button",a:{icon:"align-justify ",action:"toggle_details"},f:[{t:2,x:{r:["data.detail_view"],s:'_0?"Compact View":"Detailed View"'},p:[22,60,794]}]}]}," ",{t:4,f:[{p:[25,3,916],t:7,e:"ui-display",f:[{t:4,f:[{p:[27,5,964],t:7,e:"ui-section",f:[{p:[27,17,976],t:7,e:"ui-button",a:{action:"set_category",params:['{"category": "',{t:2,r:"name",p:[27,72,1031]},'"}']},f:[{t:2,r:"name",p:[27,84,1043]}]}]}],n:52,r:"data.categories",p:[26,4,933]}]}],n:50,x:{r:["data.category"],s:'_0=="Main"'},p:[24,2,881]},{t:4,n:51,f:[{p:[31,3,1122],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[31,22,1141]}]},f:[{t:4,f:[{t:4,f:[{p:[34,6,1229],t:7,e:"ui-display",f:[{p:[35,7,1249],t:7,e:"ui-section",f:[{p:[35,19,1261],t:7,e:"b",f:[{t:2,r:"name",p:[35,22,1264]}]}]}," ",{p:[36,7,1297],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[36,19,1309]}]}," ",{p:[37,7,1338],t:7,e:"ui-section",f:[{p:[38,8,1359],t:7,e:"ui-button",a:{icon:"download",action:"download",params:['{"program_id": "',{t:2,r:"id",p:[38,77,1428]},'"}'],state:[{t:2,x:{r:["data.has_disk"],s:'_0?null:"disabled"'},p:[38,94,1445]}]},f:["Download"]}]}]}],n:50,r:"data.detail_view",p:[33,5,1198]},{t:4,n:51,f:[{p:[44,6,1585],t:7,e:"ui-section",f:[{p:[44,18,1597],t:7,e:"ui-button",a:{action:"download",params:['{"program_id": "',{t:2,r:"id",p:[44,71,1650]},'"}']},f:[{t:2,r:"name",p:[44,81,1660]}]}]}],r:"data.detail_view"}],n:52,r:"data.program_list",p:[32,4,1165]}]}],x:{r:["data.category"],s:'_0=="Main"'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],413:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Programming"},f:[{t:4,f:[{p:[3,3,67],t:7,e:"ui-notice",f:["Insert a nanite program disk."]}],n:50,x:{r:["data.has_disk"],s:"!_0"},p:[2,1,41]},{t:4,n:51,f:[{p:[5,3,133],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{t:4,f:[{p:[7,5,229],t:7,e:"ui-notice",f:["No program detected."]}],n:50,x:{r:["data.has_program"],s:"!_0"},p:[6,3,198]},{t:4,n:51,f:[{p:[9,5,290],t:7,e:"ui-section",f:[{p:[10,7,310],t:7,e:"ui-display",a:{title:[{t:2,r:"data.name",p:[10,26,329]}]},f:[{t:2,r:"data.desc",p:[11,9,354]}]}]}," ",{p:[14,5,413],t:7,e:"ui-section",f:[{p:[15,7,433],t:7,e:"ui-section",a:{label:"Program Info"},f:["Nanites Consumed: ",{t:2,r:"data.use_rate",p:[16,26,493]},{p:[16,43,510],t:7,e:"br"}," ",{t:4,f:["Trigger Cost: ",{t:2,r:"data.trigger_cost",p:[18,25,574]},"u",{p:[18,47,596],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[17,9,524]}]}," ",{p:[22,7,648],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[23,9,685],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.activated"],s:'_0?"toggle-on":"toggle-off"'},p:[24,17,713]}],action:"toggle_active"},f:[{t:2,x:{r:["data.activated"],s:'_0?"Active":"Inactive"'},p:[26,11,809]}]}]}," ",{p:[30,7,905],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[31,9,944],t:7,e:"ui-button",a:{icon:"pencil",action:"set_activation_delay"}}," Activation Delay: ",{t:2,r:"data.activation_delay",p:[31,95,1030]}," ",{p:[31,121,1056],t:7,e:"br"}," ",{p:[32,9,1070],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer"}}," Timer: ",{t:2,r:"data.timer",p:[32,73,1134]}," ",{p:[32,88,1149],t:7,e:"br"}," ",{p:[33,9,1163],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer_type"}}," Timer Type: ",{t:2,r:"data.timer_type",p:[33,83,1237]}," ",{p:[33,103,1257],t:7,e:"br"}]}," ",{p:[36,7,1292],t:7,e:"ui-section",a:{label:"Codes"},f:[{p:[37,9,1328],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "activation"}'}}," Activation Code: ",{t:2,r:"data.activation_code",p:[37,121,1440]}," ",{p:[37,146,1465],t:7,e:"br"}," ",{p:[38,9,1479],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "deactivation"}'}}," Deactivation Code: ",{t:2,r:"data.deactivation_code",p:[38,125,1595]}," ",{p:[38,152,1622],t:7,e:"br"}," ",{p:[39,9,1636],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "kill"}'}}," Kill Code: ",{t:2,r:"data.kill_code",p:[39,109,1736]}," ",{p:[39,128,1755],t:7,e:"br"}," ",{t:4,f:[{p:[41,11,1805],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "trigger"}'}}," Trigger Code: ",{t:2,r:"data.trigger_code",p:[41,117,1911]}," ",{p:[41,139,1933],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[40,9,1769]}]}," ",{t:4,f:[{p:[46,9,2026],t:7,e:"ui-section",a:{label:"Special"},f:[{t:4,f:[{p:[48,13,2109],t:7,e:"ui-button",a:{icon:"pencil",action:"set_extra_setting",params:['{"target_setting": "',{t:2,r:"name",p:[48,93,2189]},'"}']}}," ",{t:2,r:"name",p:[48,118,2214]},": ",{t:2,r:"value",p:[48,128,2224]}," ",{p:[48,138,2234],t:7,e:"br"}],n:52,r:"data.extra_settings",p:[47,11,2066]}]}],n:50,r:"data.has_extra_settings",p:[45,7,1985]}]}],x:{r:["data.has_program"],s:"!_0"}}],x:{r:["data.has_disk"],s:"!_0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],414:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Control"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-notice",f:["The interface is locked."]}],n:50,r:"data.locked",p:[2,1,37]},{t:4,n:51,f:[{p:[5,3,121],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock Interface"]}," ",{p:[6,3,188],t:7,e:"ui-button",a:{icon:"save",action:"save"},f:["Save Current Setting"]}," ",{p:[7,3,261],t:7,e:"ui-section",a:{label:"Signal Code"},f:[{p:[8,5,299],t:7,e:"span",f:[{t:2,r:"data.code",p:[8,11,305]}]}," ",{p:[9,4,330],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code"},f:["Set"]}]}," ",{t:4,f:[{p:[12,5,443],t:7,e:"ui-section",a:{label:"Relay Code"},f:[{p:[13,7,482],t:7,e:"span",f:[{t:2,r:"data.relay_code",p:[13,13,488]}]}," ",{p:[14,5,520],t:7,e:"ui-button",a:{icon:"pencil",action:"set_relay_code"},f:["Set"]}]}],n:50,x:{r:["data.mode"],s:'_0=="Relay"'},p:[11,3,409]}," ",{p:[17,3,618],t:7,e:"ui-section",a:{label:"Signal Mode"},f:[{p:[18,5,656],t:7,e:"span",f:[{t:2,r:"data.mode",p:[18,11,662]}]}," ",{p:[19,5,688],t:7,e:"br"}," ",{p:[20,4,697],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Off"}'},f:["Off"]}," ",{p:[21,5,775],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Local"}'},f:["Local"]}," ",{p:[22,5,857],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Targeted"}'},f:["Targeted"]}," ",{p:[23,5,945],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Area"}'},f:["Area"]}," ",{p:[24,5,1025],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Relay"}'},f:["Relay"]}]}],r:"data.locked"}]}," ",{p:[28,1,1144],t:7,e:"ui-display",a:{title:"Saved Settings"},f:[{t:4,f:[{p:[30,3,1215],t:7,e:"ui-button",a:{icon:"load",action:"load",params:['{"save_id": "',{t:2,r:"id",p:[30,61,1273]},'"}']},f:[{t:2,r:"name",p:[30,71,1283]}]}," ",{t:4,f:[{p:[32,4,1332],t:7,e:"ui-button",a:{icon:"remove",action:"remove_save",params:['{"save_id": "',{t:2,r:"id",p:[32,71,1399]},'"}']},f:["Remove"]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[31,3,1307]}," ",{p:[34,3,1442],t:7,e:"br"}],n:52,r:"data.saved_settings",p:[29,2,1182]}]}]},e.exports=a.extend(r.exports)},{341:341}],415:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ghost roles"},f:[{p:[2,2,35],t:7,e:"ui-section",a:{label:"Ignored roles"},f:[{t:4,f:[{p:[4,4,99],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[4,21,116]}],style:[{t:2,x:{r:["enabled"],s:'_0?"danger":null'},p:[4,73,168]}],action:"toggle_ignore",params:['{"key": "',{t:2,r:"key",p:[4,144,239]},'"}']},f:[{t:2,r:"desc",p:[4,155,250]}]}],n:52,r:"data.ignore",p:[3,3,73]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],416:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{341:341}],417:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236]}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table", -f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582],t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],418:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';"},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],419:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],420:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],421:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:["   "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],422:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],423:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],424:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],425:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr", -f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],426:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],427:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}]}]}," ",{p:[55,5,1528],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1563],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1569]}]}]}],r:"config.fancy"}]}," ",{p:[60,1,1638],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1668],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1693],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1730],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1769],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1806],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1845],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1887],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1928],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2013],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2032]}],nowrap:0},f:[{p:[72,7,2057],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2078]}," %"]}," ",{p:[73,7,2136],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[73,28,2157]}]}," ",{p:[74,7,2199],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2220],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2233]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2262]}]}]}," ",{p:[75,7,2309],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2330],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2343]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2366]}," [",{p:[75,87,2389],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2395]}]},"]"]}]}," ",{p:[76,7,2444],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2465],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2478]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2501]}," [",{p:[76,87,2524],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2530]}]},"]"]}]}," ",{p:[77,7,2579],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2600],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2613]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2636]}," [",{p:[77,87,2659],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2665]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1987]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],428:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],429:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],430:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],431:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{341:341}],432:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],433:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,25],t:7,e:"ui-button",a:{icon:"undo",action:"change_menu",params:'{"menu": "1"}'},f:["Return"]}," ",{p:[3,2,113],t:7,e:"ui-display",a:{title:"Advanced Surgery Procedures"},f:[{p:[4,3,165],t:7,e:"ui-button",a:{icon:"download",action:"sync"},f:["Sync with research database"]}," ",{t:4,f:[{p:[6,4,278],t:7,e:"ui-display",f:[{p:[7,6,297],t:7,e:"ui-section",f:[{p:[7,18,309],t:7,e:"b",f:[{t:2,r:"name",p:[7,21,312]}]}]}," ",{p:[8,6,344],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[8,18,356]}]}]}],n:52,r:"data.surgeries",p:[5,3,249]}]}],n:50,x:{r:["data.menu"],s:"_0==2"},p:[1,1,0]},{t:4,n:51,f:[{p:[13,2,437],t:7,e:"ui-button",a:{action:"change_menu",params:'{"menu": "2"}'},f:["View Surgery Procedures"]}," ",{t:4,f:[{p:[15,3,556],t:7,e:"ui-notice",f:["No table detected!"]}],n:51,r:"data.table",p:[14,2,530]}," ",{p:[19,2,623],t:7,e:"ui-display",f:[{p:[20,3,639],t:7,e:"ui-display",a:{title:"Patient State"},f:[{t:4,f:[{p:[22,5,704],t:7,e:"ui-section",a:{label:"State"},f:[{p:[23,6,737],t:7,e:"span",a:{"class":[{t:2,r:"data.patient.statstate",p:[23,19,750]}]},f:[{t:2,r:"data.patient.stat",p:[23,47,778]}]}]}," ",{p:[25,5,831],t:7,e:"ui-section",a:{label:"Blood Type"},f:[{p:[26,6,869],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.patient.blood_type",p:[26,28,891]}]}]}," ",{p:[28,5,950],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,6,984],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.patient.minHealth",p:[29,19,997]}],max:[{t:2,r:"data.patient.maxHealth",p:[29,52,1030]}],value:[{t:2,r:"data.patient.health",p:[29,87,1065]}],state:[{t:2,x:{r:["data.patient.health"],s:'_0>=0?"good":"average"'},p:[30,13,1103]}]},f:[{t:2,x:{r:["adata.patient.health"],s:"Math.round(_0)"},p:[30,64,1154]}]}]}," ",{t:4,f:[{p:[33,6,1389],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[33,25,1408]}]},f:[{p:[34,7,1427],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.patient.maxHealth",p:[34,28,1448]}],value:[{t:2,rx:{r:"data.patient",m:[{t:30,n:"type"}]},p:[34,63,1483]}],state:"bad"},f:[{t:2,x:{r:["type","adata.patient"],s:"Math.round(_1[_0])"},p:[34,99,1519]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}]'},p:[32,5,1224]}],n:50,r:"data.patient",p:[21,4,678]},{t:4,n:51,f:["No patient detected."],r:"data.patient"}]}," ",{p:[41,3,1670],t:7,e:"ui-display",a:{title:"Initiated Procedures"},f:[{t:4,f:[{t:4,f:[{p:[44,6,1777],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[44,28,1799]}]},f:[{p:[45,7,1817],t:7,e:"ui-section",a:{label:"Next Step"},f:[{p:[46,8,1856],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"next_step",p:[46,30,1878]}]}," ",{t:4,f:[{p:[48,9,1937],t:7,e:"span",a:{"class":"content"},f:[{p:[48,31,1959],t:7,e:"b",f:["Required chemicals:"]},{p:[48,57,1985],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[48,62,1990]}]}],n:50,r:"chems_needed",p:[47,8,1907]}]}," ",{t:4,f:[{p:[52,8,2091],t:7,e:"ui-section",a:{label:"Alternative Step"},f:[{p:[53,9,2138],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"alternative_step",p:[53,31,2160]}]}," ",{t:4,f:[{p:[55,10,2232],t:7,e:"span",a:{"class":"content"},f:[{p:[55,32,2254],t:7,e:"b",f:["Required chemicals:"]},{p:[55,58,2280],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[55,63,2285]}]}],n:50,r:"alt_chems_needed",p:[54,9,2197]}]}],n:50,r:"alternative_step",p:[51,7,2058]}]}],n:52,r:"data.procedures",p:[43,5,1745]}],n:50,r:"data.procedures",p:[42,4,1716]},{t:4,n:51,f:["No active procedures."],r:"data.procedures"}]}]}],x:{r:["data.menu"],s:"_0==2"}}]},e.exports=a.extend(r.exports)},{341:341}],434:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed points: ",{t:2,r:"data.unclaimedPoints",p:[6,29,159]}," ",{t:4,f:[{p:[8,4,220],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim Points"]}],n:50,r:"data.unclaimedPoints",p:[7,3,187]}]}," ",{p:[13,2,311],t:7,e:"ui-section",f:[{t:4,f:[{p:[15,4,350],t:7,e:"ui-button",a:{action:"Eject"},f:["Eject ID"]}," You have ",{t:2,r:"data.claimedPoints",p:[18,13,421]}," mining points collected."],n:50,r:"data.hasID",p:[14,3,327]},{t:4,n:51,f:[{p:[20,4,485],t:7,e:"ui-button",a:{action:"Insert"},f:["Insert ID"]}],r:"data.hasID"}]}]}," ",{p:[26,1,588],t:7,e:"ui-display",f:[{t:4,f:[{p:[28,3,627],t:7,e:"ui-section",f:[{p:[29,4,644],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[34,4,772],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[35,5,808],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[35,42,845]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[35,129,932]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[38,10,988]},": ",{t:2,r:"name",p:[38,21,999]}]}],n:52,r:"data.diskDesigns",p:[33,3,741]}],n:50,r:"data.hasDisk",p:[27,2,603]},{t:4,n:51,f:[{p:[42,3,1053],t:7,e:"ui-section",f:[{p:[43,4,1070],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{t:4,f:[{p:[50,2,1223],t:7,e:"ui-display",f:[{p:[51,3,1239],t:7,e:"ui-section",f:[{p:[52,4,1256],t:7,e:"b",f:["Warning"]},": ",{t:2,r:"data.disconnected",p:[52,20,1272]},". Please contact the quartermaster."]}]}],n:50,r:"data.disconnected",p:[49,1,1195]},{t:4,f:[{p:[57,2,1412],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[58,3,1445],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[59,5,1480],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[62,5,1538],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[65,5,1595],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[67,5,1639],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[69,5,1683],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[74,4,1785],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[75,5,1820],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[76,6,1849]}]}," ",{p:[78,5,1879],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[79,6,1922]}]}," ",{p:[81,5,1954],t:7,e:"section",a:{"class":"cell"},f:[{p:[82,6,1983],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[82,19,1996]}],placeholder:"###","class":"number"}}]}," ",{p:[84,5,2063],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[85,6,2106],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[85,60,2160]}],params:['{ "id" : ',{t:2,r:"id",p:[85,115,2215]},', "sheets" : ',{t:2,r:"sheets",p:[85,134,2234]}," }"]},f:["Release"]}]}," ",{p:[89,5,2305],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[90,6,2348]}]}]}],n:52,r:"data.materials",p:[73,3,1756]}," ",{t:4,f:[{p:[95,4,2431],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[96,5,2466],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[97,6,2495]}]}," ",{p:[99,5,2525],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[100,6,2568]}]}," ",{p:[102,5,2600],t:7,e:"section",a:{"class":"cell"},f:[{p:[103,6,2629],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[103,19,2642]}],placeholder:"###","class":"number"}}]}," ",{p:[105,5,2709],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[106,6,2752],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[106,58,2804]}],params:['{ "id" : ',{t:2,r:"id",p:[106,114,2860]},', "sheets" : ',{t:2,r:"sheets",p:[106,133,2879]}," }"]},f:["Smelt"]}]}," ",{p:[110,5,2947],t:7,e:"section",a:{"class":"cell",align:"right"},f:[]}]}],n:52,r:"data.alloys",p:[94,3,2405]}]}],n:50,x:{r:["data.materials","data.alloys"],s:"_0||_1"},p:[56,1,1372]}]},e.exports=a.extend(r.exports)},{341:341}],435:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,4,87],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"], -s:'_0?null:"disabled"'},p:[4,36,119]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[7,4,231],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[7,35,262]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[10,4,358],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[10,35,389]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[15,4,528],t:7,e:"ui-section",f:[{t:4,f:[{p:[17,6,578],t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[16,5,546]},{t:4,n:51,f:[{p:[19,6,644],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[21,8,712],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[21,38,742]}]}," ",{p:[22,8,782],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[22,39,813]}]}],n:50,r:"data.has_blood",p:[20,7,681]},{t:4,n:51,f:[{p:[24,8,870],t:7,e:"ui-section",f:[{p:[25,9,892],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[14,3,500]},{t:4,n:51,f:[{p:[32,4,1054],t:7,e:"ui-section",f:[{p:[33,5,1072],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[38,3,1188],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[43,8,1343],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[43,64,1399]}],params:['{"index": ',{t:2,r:"index",p:[43,116,1451]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[42,7,1320]}," ",{p:[47,7,1538],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[47,69,1600]}],params:['{"index": ',{t:2,r:"index",p:[47,124,1655]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,24,1269]}],button:0},f:[" ",{p:[51,6,1749],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[51,40,1783]}]}," ",{p:[52,6,1812],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[52,38,1844]}]}," ",{p:[53,6,1879],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[53,33,1906]}]}," ",{p:[54,6,1936],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[54,40,1970]}]}," ",{t:4,f:[{p:[56,7,2021],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[58,9,2087],t:7,e:"ui-button",a:{action:"symptom_details",state:"",params:['{"picked_symptom": ',{t:2,r:"sym_index",p:[58,81,2159]},', "index": ',{t:2,r:"index",p:[58,105,2183]},"}"]},f:[{t:2,r:"name",p:[59,10,2206]}," "]},{p:[60,21,2236],t:7,e:"br"}],n:52,r:"symptoms",p:[57,8,2059]}]}," ",{p:[63,7,2289],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[63,38,2320]}]}," ",{p:[64,7,2355],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[64,35,2383]}]}," ",{p:[65,7,2415],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[65,39,2447]}]}," ",{p:[66,7,2483],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[66,44,2520]}]}],n:50,r:"is_adv",p:[55,6,1999]}]}],n:52,r:"data.viruses",p:[39,4,1222]},{t:4,n:51,f:[{p:[70,5,2601],t:7,e:"ui-section",f:[{p:[71,6,2620],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[75,3,2743],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[77,5,2811],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[77,24,2830]}]},f:[{p:[78,7,2848],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[78,43,2884]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[78,129,2970]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[76,4,2779]},{t:4,n:51,f:[{p:[83,5,3067],t:7,e:"ui-section",f:[{p:[84,6,3086],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[37,2,1162]}],n:50,x:{r:["data.mode"],s:"_0==1"},p:[1,1,0]},{t:4,n:51,f:[{p:[90,2,3231],t:7,e:"ui-button",a:{icon:"undo",state:"",action:"back"},f:["Back"]}," ",{t:4,f:[{p:[94,4,3330],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[94,23,3349]}]},f:[{p:[95,4,3364],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[96,5,3382]}," ",{t:4,f:[{p:[98,5,3417],t:7,e:"br"}," ",{p:[99,5,3428],t:7,e:"b",f:["This symptom has been neutered, and has no effect. It will still affect the virus' statistics."]}],n:50,r:"neutered",p:[97,4,3395]}]}," ",{p:[102,4,3564],t:7,e:"ui-section",f:[{p:[103,5,3582],t:7,e:"ui-section",a:{label:"Level"},f:[{t:2,r:"level",p:[103,31,3608]}]}," ",{p:[104,5,3636],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[104,36,3667]}]}," ",{p:[105,5,3700],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[105,33,3728]}]}," ",{p:[106,5,3758],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[106,37,3790]}]}," ",{p:[107,5,3824],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[107,42,3861]}]}]}," ",{p:[109,4,3913],t:7,e:"ui-subdisplay",a:{title:"Effect Thresholds"},f:[{p:[110,5,3960],t:7,e:"ui-section",f:[{t:3,r:"threshold_desc",p:[110,17,3972]}]}]}]}],n:53,r:"data.symptom",p:[93,2,3303]}],x:{r:["data.mode"],s:"_0==1"}}]},e.exports=a.extend(r.exports)},{341:341}],436:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(484);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{341:341,484:484}],437:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{341:341}],438:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[3,1,69],t:7,e:"ui-notice",f:[{p:[4,3,84],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[4,23,104]}," connected to a tank."]}]}," ",{p:[6,1,182],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[7,3,220],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[8,5,255],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[8,11,261]}," kPa"]}]}," ",{p:[10,3,323],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[11,5,354],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[11,18,367]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[11,59,408]}]}]}]}," ",{p:[14,1,499],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[15,3,530],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,579]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[17,14,630]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,687]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[24,7,856],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[24,38,887]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[23,5,828]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[28,3,1007],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[29,4,1038]}]}," ",{p:[31,3,1080],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[32,4,1114]}," kPa"]}],n:50,r:"data.holding",p:[27,3,983]},{t:4,n:51,f:[{p:[35,3,1188],t:7,e:"ui-section",f:[{p:[36,4,1205],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}," ",{p:[40,1,1293],t:7,e:"ui-display",a:{title:"Filters"},f:[{t:4,f:[{p:[42,5,1345],t:7,e:"filters"}],n:53,r:"data",p:[41,3,1325]}]}]},r.exports.components=r.exports.components||{};var i={filters:t(457)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,457:457}],439:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}]}]}," ",{p:[52,5,1464],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1499],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1505]}]}]}],r:"config.fancy"}]}," ",{p:[57,1,1574],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1604],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1629],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1666],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1705],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1742],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1781],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1823],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1864],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1949],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1968]}],nowrap:0},f:[{p:[69,7,1993],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2014]}," %"]}," ",{p:[70,7,2072],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[70,28,2093]}]}," ",{p:[71,7,2135],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2156],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2169]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2198]}]}]}," ",{p:[72,7,2245],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2266],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2279]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2302]}," [",{p:[72,87,2325],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2331]}]},"]"]}]}," ",{p:[73,7,2380],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2401],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2414]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2437]}," [",{p:[73,87,2460],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2466]}]},"]"]}]}," ",{p:[74,7,2515],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2536],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2549]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2572]}," [",{p:[74,87,2595],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2601]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1923]}]}]},e.exports=a.extend(r.exports)},{341:341}],440:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=a.extend(r.exports)},{341:341}],441:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," "," "," "," "," "," ",{p:[11,1,560],t:7,e:"rdheader"}," ",{t:4,f:[{p:[13,2,595],t:7,e:"ui-display",a:{title:"CONSOLE LOCKED"},f:[{p:[14,3,634],t:7,e:"ui-button",a:{action:"Unlock"},f:["Unlock"]}]}],n:50,r:"data.locked",p:[12,1,573]},{t:4,f:[{p:[18,2,729],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[18,17,744]}]},f:[{p:[19,3,763],t:7,e:"tab",a:{name:"Technology"},f:[{p:[20,4,791],t:7,e:"techweb"}]}," ",{p:[22,3,815],t:7,e:"tab",a:{name:"View Node"},f:[{p:[23,4,842],t:7,e:"nodeview"}]}," ",{p:[25,3,867],t:7,e:"tab",a:{name:"View Design"},f:[{p:[26,4,896],t:7,e:"designview"}]}," ",{p:[28,3,923],t:7,e:"tab",a:{name:"Disk Operations - Design"},f:[{p:[29,4,965],t:7,e:"diskopsdesign"}]}," ",{p:[31,3,995],t:7,e:"tab",a:{name:"Disk Operations - Technology"},f:[{p:[32,4,1041],t:7,e:"diskopstech"}]}," ",{p:[34,3,1069],t:7,e:"tab",a:{name:"Deconstructive Analyzer"},f:[{p:[35,4,1110],t:7,e:"destruct"}]}," ",{p:[37,3,1135],t:7,e:"tab",a:{name:"Protolathe"},f:[{p:[38,4,1163],t:7,e:"protolathe"}]}," ",{p:[40,3,1190],t:7,e:"tab",a:{name:"Circuit Imprinter"},f:[{p:[41,4,1225],t:7,e:"circuit"}]}," ",{p:[43,3,1249],t:7,e:"tab",a:{name:"Settings"},f:[{p:[44,4,1275],t:7,e:"settings"}]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[17,1,706]}]},r.exports.components=r.exports.components||{};var i={settings:t(450),circuit:t(442),protolathe:t(448),destruct:t(444),diskopsdesign:t(445),diskopstech:t(446),designview:t(443),nodeview:t(447),techweb:t(451),rdheader:t(449)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451}],442:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,58],t:7,e:"ui-display",a:{title:"Circuit Imprinter Busy!"}}],n:50,r:"data.circuitbusy",p:[2,2,30]},{t:4,n:51,f:[{p:[5,3,130],t:7,e:"ui-display",f:[{p:[6,4,147],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,189],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,202]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,261],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "circuit", "inputText" : ',{t:2,r:"textsearch",p:[8,84,340]},"}"]},f:["Search"]}]}," ",{p:[10,4,398],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.circuitmats",p:[10,27,421]}," / ",{t:2,r:"data.circuitmaxmats",p:[10,50,444]}]}," ",{p:[11,4,485],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.circuitchems",p:[11,26,507]}," / ",{t:2,r:"data.circuitmaxchems",p:[11,50,531]}]}," ",{p:[12,3,572],t:7,e:"ui-display",f:[{p:[14,3,590],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,605]}]},f:[{p:[15,4,631],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,696],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.circuitcat"],s:'_0=="{{name}}"?"selected":null'},p:[17,43,733]}],params:['{"type" : "circuit", "cat" : "',{t:2,r:"name",p:[17,135,825]},'"}']},f:[{t:2,r:"name",p:[17,147,837]}]}],n:52,r:"data.circuitcats",p:[16,5,663]}]}," ",{p:[20,4,888],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,956],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,968]},{t:2,r:"matstring",p:[22,26,976]}," ",{p:[23,7,997],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[23,40,1030]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[23,119,1109]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitdes",p:[21,5,924]}]}," ",{p:[27,4,1187],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[29,6,1254],t:7,e:"ui-section",f:[{t:2,r:"name",p:[29,18,1266]},{t:2,r:"matstring",p:[29,26,1274]}," ",{p:[30,7,1295],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[30,40,1328]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[30,119,1407]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitmatch",p:[28,5,1220]}]}," ",{p:[34,4,1485],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[36,6,1550],t:7,e:"ui-section",f:[{t:2,r:"name",p:[36,18,1562]}," : ",{t:2,r:"amount",p:[36,29,1573]}," cm3 - ",{t:4,f:[{p:[38,7,1623],t:7,e:"input",a:{value:[{t:2,r:"number",p:[38,20,1636]}],placeholder:["1-",{t:2,r:"sheets",p:[38,46,1662]}],"class":"number"}}," ",{p:[39,7,1698],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "circuit", "mat_id" : ',{t:2,r:"mat_id",p:[39,84,1775]},', "sheets" : ',{t:2,r:"number",p:[39,107,1798]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[37,6,1597]}]}],n:52,r:"data.circuitmat_list",p:[35,5,1513]}]}," ",{p:[44,4,1895],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[46,6,1961],t:7,e:"ui-section",f:[{t:2,r:"name",p:[46,18,1973]}," : ",{t:2,r:"amount",p:[46,29,1984]}," - ",{p:[47,7,2005],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "circuit", "name" : ',{t:2,r:"name",p:[47,80,2078]},', "id" : ',{t:2,r:"reagentid",p:[47,97,2095]},"}"]},f:["Purge"]}]}],n:52,r:"data.circuitchem_list",p:[45,5,1923]}]}]}]}]}],r:"data.circuitbusy"}],n:50,r:"data.circuit_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[55,2,2216],t:7,e:"ui-display",a:{title:"No Linked Circuit Imprinter"}}],r:"data.circuit_linked"}]},e.exports=a.extend(r.exports)},{341:341}],443:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:[{t:2,r:"data.sdesign_name",p:[2,21,50]}]},f:[{p:[3,3,77],t:7,e:"ui-section",a:{title:"Description"},f:[{t:2,r:"data.sdesign_desc",p:[3,35,109]}]}]}," ",{p:[5,2,162],t:7,e:"ui-display",a:{title:"Lathe Types"},f:[{t:4,f:[{p:[7,4,239],t:7,e:"ui-section",a:{title:"Circuit Imprinter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&1"},p:[6,3,198]}," ",{t:4,f:[{p:[10,4,346],t:7,e:"ui-section",a:{title:"Protolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&2"},p:[9,3,305]}," ",{t:4,f:[{p:[13,4,446],t:7,e:"ui-section",a:{title:"Autolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&4"},p:[12,3,405]}," ",{t:4,f:[{p:[16,4,545],t:7,e:"ui-section",a:{title:"Crafting Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&8"},p:[15,3,504]}," ",{t:4,f:[{p:[19,4,655],t:7,e:"ui-section",a:{title:"Exosuit Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&16"},p:[18,3,613]}," ",{t:4,f:[{p:[22,4,764],t:7,e:"ui-section",a:{title:"Biogenerator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&32"},p:[21,3,722]}," ",{t:4,f:[{p:[25,4,867],t:7,e:"ui-section",a:{title:"Limb Grower"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&64"},p:[24,3,825]}," ",{t:4,f:[{p:[28,4,970],t:7,e:"ui-section",a:{title:"Ore Smelter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&128"},p:[27,3,927]}]}," ",{p:[31,2,1045],t:7,e:"ui-display",a:{title:"Materials"},f:[{t:4,f:[{p:[33,4,1116],t:7,e:"ui-section",a:{title:[{t:2,r:"matname",p:[33,23,1135]}]},f:[{t:2,r:"matamt",p:[33,36,1148]}," cm^3"]}],n:52,r:"data.sdesign_materials",p:[32,3,1079]}]}],n:50,r:"data.design_selected",p:[1,1,0]},{t:4,f:[{p:[38,2,1248],t:7,e:"ui-display",a:{title:"No Design Selected."}}],n:50,x:{r:["data.design_selected"],s:"!_0"},p:[37,1,1216]}]},e.exports=a.extend(r.exports)},{341:341}],444:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[4,3,60],t:7,e:"ui-display",a:{title:"Destructive Analyzer Busy!"}}],n:50,r:"data.destroybusy",p:[3,2,32]},{t:4,n:51,f:[{t:4,f:[{p:[7,4,168],t:7,e:"ui-display",a:{title:"Destructive Analyzer Unloaded"}}],n:50,x:{r:["data.destroy_loaded"],s:"!_0"},p:[6,3,135]},{t:4,n:51,f:[{p:[9,4,248],t:7,e:"ui-display",a:{title:"Loaded Item"},f:[{p:[10,4,285],t:7,e:"ui-section",a:{title:"Name"},f:[{t:2,r:"data.destroy_name",p:[10,29,310]}]}]}," ",{p:[12,4,367],t:7,e:"ui-display",a:{title:"Boost Nodes"},f:[{t:4,f:[{p:[14,6,438],t:7,e:"ui-section",a:{title:[{t:2,r:"name",p:[14,25,457]}," | ",{t:2,r:"value",p:[14,36,468]}]},f:[{p:[15,7,487],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["allow"],s:'_0?null:"disabled"'},p:[15,25,505]}],action:"deconstruct",params:['{"id":',{t:2,r:"id",p:[15,90,570]},"}"]},f:["Deconstruct and Boost"]}]}],n:52,r:"data.boost_paths",p:[13,5,405]}]}," ",{p:[19,4,670],t:7,e:"ui-button",a:{action:"eject_da"},f:["Eject Item"]}],x:{r:["data.destroy_loaded"],s:"!_0"}}],r:"data.destroybusy" -}],n:50,r:"data.destroy_linked",p:[2,1,2]},{t:4,n:51,f:[{p:[23,2,755],t:7,e:"ui-display",a:{title:"No Linked Destructive Analyzer"}}],r:"data.destroy_linked"}]},e.exports=a.extend(r.exports)},{341:341}],445:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Design Disk Loaded"}}],n:50,x:{r:["data.ddisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,121],t:7,e:"ui-display",a:{title:"Design Disk Updating"}}],n:50,r:"data.ddisk_update",p:[5,2,92]},{t:4,n:51,f:[{t:4,f:[{p:[9,4,221],t:7,e:"ui-display",a:{title:"Design Disk"},f:[{p:[10,5,259],t:7,e:"ui-section",a:{title:"Disk Space"},f:["Disk Capacity: ",{t:2,r:"data.ddisk_size",p:[10,51,305]}," blueprints."]}," ",{p:[11,5,355],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[11,33,383],t:7,e:"ui-button",a:{action:"ddisk_upall"},f:["Upload all designs"]}]}," ",{p:[12,5,464],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[12,36,495],t:7,e:"ui-button",a:{action:"clear_designdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[13,5,591],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[13,36,622],t:7,e:"ui-button",a:{action:"eject_designdisk"},f:["Eject Disk"]}]}]}," ",{p:[15,4,717],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[17,6,792],t:7,e:"ui-section",a:{title:"Number"},f:["#",{t:2,r:"pos",p:[17,34,820]},": ",{t:4,f:[{p:[19,8,866],t:7,e:"ui-button",a:{action:"upload_empty_ddisk_slot",params:['{"slot": "',{t:2,r:"pos",p:[19,70,928]},'"}']},f:["Upload to Empty Slot"]}],n:50,x:{r:["id"],s:'_0=="null"'},p:[18,7,837]},{t:4,n:51,f:[{p:[21,8,996],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[21,58,1046]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[21,75,1063]}]},f:[{t:2,r:"name",p:[21,122,1110]}]}," ",{p:[22,8,1139],t:7,e:"ui-button",a:{action:"ddisk_erasepos",style:"danger",params:['{"id": "',{t:2,r:"id",p:[22,74,1205]},'"}'],state:[{t:2,x:{r:["id"],s:'_0=="null"?"disabled":null'},p:[22,91,1222]}]},f:["Delete Slot"]}],x:{r:["id"],s:'_0=="null"'}}]}],n:52,r:"data.ddisk_designs",p:[16,5,757]}]}],n:50,x:{r:["data.ddisk_upload"],s:"!_0"},p:[8,3,190]},{t:4,n:51,f:[{p:[28,4,1367],t:7,e:"ui-display",a:{title:"Upload Design to Disk"},f:[{p:[28,46,1409],t:7,e:"ui-section",f:["Available Designs:"]}]}," ",{t:4,f:[{p:[30,5,1513],t:7,e:"ui-section",f:[{p:[30,17,1525],t:7,e:"ui-button",a:{action:"ddisk_uploaddesign",params:['{"id": "',{t:2,r:"id",p:[30,72,1580]},'"}']},f:[{t:2,r:"name",p:[30,82,1590]}]}]}],n:52,r:"data.ddisk_possible_designs",p:[29,4,1470]}],x:{r:["data.ddisk_upload"],s:"!_0"}}],r:"data.ddisk_update"}],x:{r:["data.ddisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],446:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Technology Disk Loaded"}}],n:50,x:{r:["data.tdisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,125],t:7,e:"ui-display",a:{title:"Technology Disk Updating"}}],n:50,r:"data.tdisk_update",p:[5,2,96]},{t:4,n:51,f:[{p:[8,3,198],t:7,e:"ui-display",a:{title:"Technology Disk"},f:[{p:[9,4,239],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[9,32,267],t:7,e:"ui-button",a:{action:"tdisk_down"},f:["Download Research to Disk"]},{p:[9,100,335],t:7,e:"ui-button",a:{action:"tdisk_up"},f:["Upload Research from Disk"]}," ",{p:[10,4,406],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[10,35,437],t:7,e:"ui-button",a:{action:"clear_techdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[11,4,530],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[11,35,561],t:7,e:"ui-button",a:{action:"eject_techdisk"},f:["Eject Disk"]}]}]}]}," ",{p:[13,3,652],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[15,5,723],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,53,771]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,70,788]}]},f:[{t:2,r:"display_name",p:[15,115,833]}]}],n:52,r:"data.tdisk_nodes",p:[14,4,691]}]}],r:"data.tdisk_update"}],x:{r:["data.tdisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],447:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,29],t:7,e:"ui-display",a:{title:[{t:2,r:"data.snode_name",p:[2,21,48]}]},f:[{p:[3,3,73],t:7,e:"ui-section",a:{title:"Description"},f:["Description: ",{t:2,r:"data.snode_desc",p:[3,48,118]}]}," ",{p:[4,3,154],t:7,e:"ui-section",a:{title:"Point Cost"},f:["Point Cost: ",{t:2,r:"data.snode_cost",p:[4,46,197]}]}," ",{p:[5,3,233],t:7,e:"ui-section",a:{title:"Export Price"},f:["Export Price: ",{t:2,r:"data.snode_export",p:[5,50,280]}]}," ",{p:[6,3,318],t:7,e:"ui-button",a:{action:"research_node",params:['{"id"="',{t:2,r:"id",p:[6,52,367]},'"}'],state:[{t:2,x:{r:["data.snode_researched"],s:'_0?"disabled":null'},p:[6,69,384]}]},f:[{t:2,x:{r:["data.snode_researched"],s:'_0?"Researched":"Research Node"'},p:[6,115,430]}]}]}," ",{p:[8,2,518],t:7,e:"ui-display",a:{title:"Prerequisites"},f:[{t:4,f:[{p:[10,4,588],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[10,52,636]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[10,69,653]}]},f:[{t:2,r:"display_name",p:[10,114,698]}]}],n:52,r:"data.node_prereqs",p:[9,3,556]}]}," ",{p:[13,2,759],t:7,e:"ui-display",a:{title:"Unlocks"},f:[{t:4,f:[{p:[15,4,823],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,52,871]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,69,888]}]},f:[{t:2,r:"display_name",p:[15,114,933]}]}],n:52,r:"data.node_unlocks",p:[14,3,791]}]}," ",{p:[18,2,994],t:7,e:"ui-display",a:{title:"Designs"},f:[{t:4,f:[{p:[20,4,1058],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[20,54,1108]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[20,71,1125]}]},f:[{t:2,r:"name",p:[20,118,1172]}]}],n:52,r:"data.node_designs",p:[19,3,1026]}]}],n:50,r:"data.node_selected",p:[1,1,0]},{t:4,f:[{p:[25,2,1263],t:7,e:"ui-display",a:{title:"No Node Selected."}}],n:50,x:{r:["data.node_selected"],s:"!_0"},p:[24,1,1233]}]},e.exports=a.extend(r.exports)},{341:341}],448:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,59],t:7,e:"ui-display",a:{title:"Protolathe Busy!"}}],n:50,r:"data.protobusy",p:[2,2,33]},{t:4,n:51,f:[{p:[5,3,124],t:7,e:"ui-display",f:[{p:[6,4,141],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,183],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,196]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,255],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "proto", "inputText" : ',{t:2,r:"textsearch",p:[8,82,332]},"}"]},f:["Search"]}]}," ",{p:[10,4,390],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.protomats",p:[10,27,413]}," / ",{t:2,r:"data.protomaxmats",p:[10,48,434]}]}," ",{p:[11,4,473],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.protochems",p:[11,26,495]}," / ",{t:2,r:"data.protomaxchems",p:[11,48,517]}]}," ",{p:[12,3,556],t:7,e:"ui-display",f:[{p:[14,3,574],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,589]}]},f:[{p:[15,4,615],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,678],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.protocat","name"],s:'_0==_1?"selected":null'},p:[17,43,715]}],params:['{"type" : "proto", "cat" : "',{t:2,r:"name",p:[17,125,797]},'"}']},f:[{t:2,r:"name",p:[17,137,809]}]}],n:52,r:"data.protocats",p:[16,5,647]}]}," ",{p:[20,4,860],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,926],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,938]},{t:2,r:"matstring",p:[22,26,946]}," ",{t:4,f:[{p:[24,8,996],t:7,e:"input",a:{value:[{t:2,r:"number",p:[24,21,1009]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[24,47,1035]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[23,7,967]}," ",{p:[26,7,1108],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[26,40,1141]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[26,117,1218]},'", "amount" : "',{t:2,r:"number",p:[26,138,1239]},'"}']},f:["Print"]}]}],n:52,r:"data.protodes",p:[21,5,896]}]}," ",{p:[30,4,1321],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[32,6,1386],t:7,e:"ui-section",f:[{t:2,r:"name",p:[32,18,1398]},{t:2,r:"matstring",p:[32,26,1406]}," ",{t:4,f:[{p:[34,8,1456],t:7,e:"input",a:{value:[{t:2,r:"number",p:[34,21,1469]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[34,47,1495]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[33,7,1427]}," ",{p:[36,7,1568],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[36,40,1601]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[36,117,1678]},'", "amount" : "',{t:2,r:"number",p:[36,138,1699]},'"}']},f:["Print"]}]}],n:52,r:"data.protomatch",p:[31,5,1354]}]}," ",{p:[40,4,1781],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[42,6,1844],t:7,e:"ui-section",f:[{t:2,r:"name",p:[42,18,1856]}," : ",{t:2,r:"amount",p:[42,29,1867]}," cm3 - ",{t:4,f:[{p:[44,7,1917],t:7,e:"input",a:{value:[{t:2,r:"number",p:[44,20,1930]}],placeholder:["1-",{t:2,r:"sheets",p:[44,46,1956]}],"class":"number"}}," ",{p:[45,7,1992],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "proto", "mat_id" : ',{t:2,r:"mat_id",p:[45,82,2067]},', "sheets" : ',{t:2,r:"number",p:[45,105,2090]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[43,6,1891]}]}],n:52,r:"data.protomat_list",p:[41,5,1809]}]}," ",{p:[50,4,2187],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[52,6,2251],t:7,e:"ui-section",f:[{t:2,r:"name",p:[52,18,2263]}," : ",{t:2,r:"amount",p:[52,29,2274]}," - ",{p:[53,7,2295],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "proto", "name" : ',{t:2,r:"name",p:[53,78,2366]},', "id" : ',{t:2,r:"reagentid",p:[53,95,2383]},"}"]},f:["Purge"]}]}],n:52,r:"data.protochem_list",p:[51,5,2215]}]}]}]}]}],r:"data.protobusy"}],n:50,r:"data.protolathe_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[61,2,2504],t:7,e:"ui-display",a:{title:"No Linked Protolathe"}}],r:"data.protolathe_linked"}]},e.exports=a.extend(r.exports)},{341:341}],449:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,1,14],t:7,e:"span",a:{"class":"memoedit"},f:["Nanotrasen R&D Console"]},{p:[2,53,66],t:7,e:"br"}," Available Points: ",{p:[3,19,91],t:7,e:"ui-section",a:{title:"Research Points"},f:[{t:2,r:"data.research_points_stored",p:[3,55,127]}]}," ",{p:[4,1,173],t:7,e:"ui-section",a:{title:["Page Selection - ",{t:2,r:"page",p:[4,37,209]}]},f:[{p:[4,47,219],t:7,e:"input",a:{value:[{t:2,r:"pageselect",p:[4,60,232]}],placeholder:"1","class":"number"}}," Select Page: ",{p:[5,14,294],t:7,e:"ui-button",a:{action:"page",params:['{"num" : "',{t:2,r:"pageselect",p:[5,57,337]},'"}']},f:["[Go]"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],450:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"span",a:{"class":"bad"},f:["Settings"]},{p:[1,34,33],t:7,e:"br"},{p:[1,39,38],t:7,e:"br"}," ",{p:[2,1,45],t:7,e:"ui-button",a:{action:"Resync"},f:["RESYNC MACHINERY"]},{p:[2,56,100],t:7,e:"br"}," ",{p:[3,1,107],t:7,e:"ui-button",a:{action:"Lock"},f:["LOCK"]}," ",{p:[4,1,150],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "destroy"}',state:[{t:2,x:{r:["data.destroy_linked"],s:'_0?null:"disabled"'},p:[4,71,220]}]},f:["Disconnect Destructive Analyzer"]}," ",{p:[5,1,309],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "lathe"}',state:[{t:2,x:{r:["data.protolathe_linked"],s:'_0?null:"disabled"'},p:[5,69,377]}]},f:["Disconnect Protolathe"]}," ",{p:[6,1,459],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "imprinter"}',state:[{t:2,x:{r:["data.circuit_linked"],s:'_0?null:"disabled"'},p:[6,73,531]}]},f:["Disconnect Circuit Imprinter"]}]},e.exports=a.extend(r.exports)},{341:341}],451:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Available for Research"},f:[{t:4,f:[{p:[3,3,78],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[3,51,126]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[3,68,143]}]},f:[{t:2,r:"display_name",p:[3,113,188]}]}],n:52,r:"data.techweb_avail",p:[2,2,46]}]}," ",{p:[6,1,245],t:7,e:"ui-display",a:{title:"Locked Nodes"},f:[{t:4,f:[{p:[8,3,314],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[8,51,362]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[8,68,379]}]},f:[{t:2,r:"display_name",p:[8,113,424]}]}],n:52,r:"data.techweb_locked",p:[7,2,281]}]}," ",{p:[11,1,482],t:7,e:"ui-display",a:{title:"Researched Nodes"},f:[{t:4,f:[{p:[13,3,559],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[13,51,607]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[13,68,624]}]},f:[{t:2,r:"display_name",p:[13,113,669]}]}],n:52,r:"data.techweb_researched",p:[12,2,522]}]}]},e.exports=a.extend(r.exports)},{341:341}],452:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,25],t:7,e:"ui-notice",f:[{p:[3,3,40],t:7,e:"span",f:["The grinder is currently processing and cannot be used."]}]}],n:50,r:"data.processing",p:[1,1,0]},{p:{button:[{p:[8,5,208],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[8,36,239]}],action:"eject"},f:["Eject Contents"]}]},t:7,e:"ui-display",a:{title:"Processing Chamber",button:0},f:[" ",{p:[10,3,364],t:7,e:"ui-section",a:{label:"Grinding"},f:[{p:[11,5,399],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.operating"],s:'_0?"average":"good"'},p:[11,18,412]}]},f:[{t:2,x:{r:["data.operating"],s:'_0?"Busy":"Ready"'},p:[11,59,453]}]}," ",{p:[12,2,500],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[12,35,533]}],action:"grind"},f:["Activate"]}]}," ",{p:[14,3,653],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[17,9,755],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["The ",{t:2,r:"name",p:[17,56,802]}]},{p:[17,71,817],t:7,e:"br"}],n:52,r:"adata.contentslist",p:[16,7,717]},{t:4,n:51,f:[{p:[19,9,848],t:7,e:"span",f:["No Contents"]}],r:"adata.contentslist"}],n:50,r:"data.contents",p:[15,5,688]},{t:4,n:51,f:[{p:[22,7,911],t:7,e:"span",f:["No Contents"]}],r:"data.contents"}]}]}," ",{p:{button:[{p:[28,5,1047],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.isBeakerLoaded"],s:'(_0==0)&&_1?null:"disabled"'},p:[28,36,1078]}],action:"detach"},f:["Detach"]}]},t:7,e:"ui-display",a:{title:"Container",button:0},f:[" ",{p:[30,3,1202],t:7,e:"ui-section",a:{label:"Reagents"},f:[{t:4,f:[{p:[32,7,1272],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[32,13,1278]},"/",{t:2,r:"data.beakerMaxVolume",p:[32,55,1320]}," Units"]}," ",{p:[33,7,1365],t:7,e:"br"}," ",{t:4,f:[{p:[35,9,1418],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[35,52,1461]}," units of ",{t:2,r:"name",p:[35,87,1496]}]},{p:[35,102,1511],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[34,7,1378]},{t:4,n:51,f:[{p:[37,9,1542],t:7,e:"span",a:{"class":"bad"},f:["Container Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[31,5,1237]},{t:4,n:51,f:[{p:[40,7,1621],t:7,e:"span",a:{"class":"average"},f:["No Container"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],453:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"span",a:{"class":["pipes32x32 ",{t:2,r:"dir",p:[6,80,253]},"-",{t:2,r:"icon_state",p:[6,88,261]}],title:[{t:2,r:"dir_name",p:[6,111,284]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}," ",{t:4,f:[{p:[12,2,406],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[14,4,468],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["@key","data.selected_color"],s:'_0==_1?"selected":null'},p:[14,22,486]}],action:"color",params:['{"paint_color": ',{t:2,r:"@key",p:[15,44,583]},"}"]},f:[{t:2,r:"@key",p:[15,55,594]}]}],n:52,r:"data.paint_colors",p:[13,3,436]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[11,1,377]},{p:[19,1,654],t:7,e:"ui-display",a:{title:"Utilities"},f:[{p:[20,2,687],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&1?"check-square-o":"square-o"'},p:[20,19,704]}],action:"mode",params:'{"mode": 1}'},f:["Build"]}," ",{p:[22,2,813],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&2?"check-square-o":"square-o"'},p:[22,19,830]}],action:"mode",params:'{"mode": 2}'},f:["Wrench"]}," ",{p:[24,2,940],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&4?"check-square-o":"square-o"'},p:[24,19,957]}],action:"mode",params:'{"mode": 4}'},f:["Destroy"]}," ",{t:4,f:[{p:[27,3,1098],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&8?"check-square-o":"square-o"'},p:[27,20,1115]}],action:"mode",params:'{"mode": 8}'},f:["Paint"]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[26,2,1068]}]}," ",{p:[31,1,1249],t:7,e:"ui-display",a:{title:"Category"},f:[{p:[32,2,1281],t:7,e:"ui-section",f:[{p:[33,3,1297],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==0?"check-square-o":"square-o"'},p:[33,20,1314]}],state:[{t:2,x:{r:["data.category"],s:'_0<=0?"selected":null'},p:[33,83,1377]}],action:"category",params:'{"category": 0}'},f:["Atmospherics"]}," ",{p:[35,3,1496],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==1?"check-square-o":"square-o"'},p:[35,20,1513]}],state:[{t:2,x:{r:["data.category"],s:'_0==1?"selected":null'},p:[35,83,1576]}],action:"category",params:'{"category": 1}'},f:["Disposals"]}," ",{p:[37,3,1692],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==2?"check-square-o":"square-o"'},p:[37,20,1709]}],state:[{t:2,x:{r:["data.category"],s:'_0==2?"selected":null'},p:[37,83,1772]}],action:"category",params:'{"category": 2}'},f:["Transit Tubes"]}]}," ",{t:4,f:[{p:[41,3,1937],t:7,e:"ui-section",a:{label:"Piping Layer"},f:[{p:[42,4,1975],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==1?"selected":null'},p:[42,22,1993]}],action:"piping_layer",params:'{"piping_layer": 1}'},f:["1"]}," ",{p:[44,4,2115],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==2?"selected":null'},p:[44,22,2133]}],action:"piping_layer",params:'{"piping_layer": 2}'},f:["2"]}," ",{p:[46,4,2255],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==3?"selected":null'},p:[46,22,2273]}],action:"piping_layer",params:'{"piping_layer": 3}'},f:["3"]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[40,2,1907]}]}," ",{t:4,f:[{p:[52,2,2462],t:7,e:"ui-display",a:{title:[{t:2,r:"cat_name",p:[52,21,2481]}]},f:[{t:4,f:[{p:[54,4,2521],t:7,e:"ui-section",f:[{p:[55,5,2539],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[55,23,2557]}],action:"pipe_type",params:['{"pipe_type": ',{t:2,r:"pipe_index",p:[56,28,2638]},', "category": ',{t:2,r:"cat_name",p:[56,56,2666]},"}"]},f:[{t:2,r:"pipe_name",p:[56,71,2681]}]}]}],n:52,r:"recipes",p:[53,3,2499]}]}],n:52,r:"data.categories",p:[51,1,2434]}]},e.exports=a.extend(r.exports)},{341:341}],454:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[3,21,78]}],action:"color",params:['{"paint_color": ',{t:2,r:"color_name",p:[4,28,155]},"}"]},f:[{t:2,r:"color_name",p:[4,45,172]}]}],n:52,r:"data.paint_colors",p:[2,2,29]}]}]},e.exports=a.extend(r.exports)},{341:341}],455:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"img",a:{src:["pipe.",{t:2,r:"dir",p:[6,71,244]},".",{t:2,r:"icon_state",p:[6,79,252]},".png"],title:[{t:2,r:"dir_name",p:[6,106,279]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}]},e.exports=a.extend(r.exports)},{341:341}],456:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{341:341}],457:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,26],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[2,20,43]}],style:[{t:2,x:{r:["enabled"],s:'_0?"selected":null'},p:[2,72,95]}],action:"toggle_filter",params:['{"id_tag": "',{t:2,r:"id_tag",p:[3,48,176]},'", "val": ',{t:2,r:"gas_id",p:[3,68,196]},"}"]},f:[{t:2,r:"gas_name",p:[3,81,209]}]}],n:52,r:"filter_types",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],458:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(459),templates:t(461),status:t(460)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,459:459,460:460,461:461}],459:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=a.extend(r.exports)},{341:341}],460:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"table",a:{width:"100%"},f:[{t:4,f:[{p:[3,3,49],t:7,e:"tr",f:[{p:[4,5,59],t:7,e:"td",f:[{p:[5,7,71],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[5,69,133]},'"}']},f:["JMP"]}]}," ",{p:[9,5,193],t:7,e:"td",f:[{p:[10,7,205],t:7,e:"ui-button",a:{action:"fly",params:['{"id": "',{t:2,r:"id",p:[10,47,245]},'"}'],state:[{t:2,x:{r:["can_fly"],s:'_0?null:"disabled"'},p:[10,64,262]}]},f:["Fly"]}]}," ",{p:[14,5,345],t:7,e:"td",f:[{t:2,r:"name",p:[15,7,357]}," (",{p:[15,17,367],t:7,e:"code",f:[{t:2,r:"id",p:[15,23,373]}]},")"]}," ",{p:[17,5,404],t:7,e:"td",f:[{t:2,r:"status",p:[18,7,416]}]}," ",{p:[20,5,443],t:7,e:"td",f:[{t:4,f:[{t:2,r:"mode",p:[22,9,477]}],n:50,r:"mode",p:[21,7,455]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[25,10,532]},") ",{p:[26,9,555],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[26,57,603]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[26,74,620]}]},f:["Fast Travel"]}],n:50,r:"timer",p:[24,7,508]}]}]}],n:52,r:"data.shuttles",p:[2,1,22]}]}]},e.exports=a.extend(r.exports)},{341:341}],461:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=a.extend(r.exports)},{341:341}],462:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,186],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,220],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,233]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,262]}]}]}," ",{p:[9,5,315],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[10,7,350],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[10,20,363]}],max:[{t:2,r:"data.occupant.maxHealth",p:[10,54,397]}],value:[{t:2,r:"data.occupant.health",p:[10,90,433]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[11,16,475]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[11,68,527]}]}]}," ",{t:4,f:[{p:[14,7,764],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[14,26,783]}]},f:[{p:[15,9,804],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[15,30,825]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[15,66,861]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[15,103,898]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[13,5,598]}," ",{t:4,f:[{p:[19,7,1020],t:7,e:"ui-section",a:{label:"Blood"},f:[{p:[20,9,1056],t:7,e:"ui-section",a:{label:"Volume"},f:[{p:[21,11,1095],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.blood.maxBloodVolume",p:[21,32,1116]}],value:[{t:2,r:"data.occupant.blood.currentBloodVolume",p:[21,79,1163]}],state:[{t:2,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"bad":"good"'},p:[21,130,1214]}]},f:[{t:3,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"LOW":"OK"'},p:[21,232,1316]}," - ",{t:2,x:{r:["data.occupant.blood.currentBloodVolume"],s:"Math.round(_0)"},p:[21,342,1426]}," cl"]}]}," ",{p:[23,9,1525],t:7,e:"ui-section",a:{label:"Type"},f:[{p:[24,11,1562],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:"data.occupant.blood.bloodType",p:[24,35,1586]}]}]}]}],n:50,r:"data.occupant.blood",p:[18,5,985]}," ",{p:[28,5,1689],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[29,9,1725],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[29,22,1738]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[29,68,1784]}]}]}," ",{p:[31,5,1867],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[32,9,1903],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[32,22,1916]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[32,68,1962]}]}]}," ",{p:[34,5,2046],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[36,11,2133],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[36,54,2176]}," units of ",{t:2,r:"name",p:[36,89,2211]}]},{p:[36,104,2226],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[35,9,2088]},{t:4,n:51,f:[{p:[38,11,2261],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[5,3,159]}]}," ",{p:[43,1,2357],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[44,2,2389],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[45,5,2420],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[45,22,2437]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[45,71,2486]}]}]}," ",{p:[47,3,2551],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[49,7,2612],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[49,38,2643]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[49,122,2727]},'"}']},f:[{t:2,r:"name",p:[49,132,2737]}]},{p:[49,152,2757],t:7,e:"br"}],n:52,r:"data.chems",p:[48,5,2584]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],463:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{ -p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:4,f:["You Are Here"],n:50,x:{r:["occupied"],s:'_0=="owner"'},p:[10,7,491]},{t:4,n:51,f:[{t:4,f:["Occupied"],n:50,x:{r:["occupied"],s:'_0=="stranger"'},p:[13,9,566]},{t:4,n:51,f:["Swap"],x:{r:["occupied"],s:'_0=="stranger"'}}],x:{r:["occupied"],s:'_0=="owner"'}}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],464:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,23,82],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.drying"],s:'_0?"stop":"tint"'},p:[4,40,99]}],action:"Dry"},f:[{t:2,x:{r:["data.drying"],s:'_0?"Stop drying":"Dry"'},p:[4,88,147]}]}],n:50,r:"data.isdryer",p:[4,3,62]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[7,3,258],t:7,e:"ui-notice",f:[{p:[8,5,275],t:7,e:"span",f:["Unfortunately, this ",{t:2,r:"data.name",p:[8,31,301]}," is empty."]}]}],n:50,x:{r:["data.contents.length"],s:"_0==0"},p:[6,1,221]},{t:4,n:51,f:[{p:[11,1,359],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[12,2,391],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[13,4,425],t:7,e:"section",a:{"class":"cell bold"},f:["Item"]}," ",{p:[16,4,482],t:7,e:"section",a:{"class":"cell bold"},f:["Quantity"]}," ",{p:[19,4,543],t:7,e:"section",a:{"class":"cell bold",align:"center"},f:[{t:4,f:[{t:2,r:"data.verb",p:[20,22,608]}],n:50,r:"data.verb",p:[20,5,591]},{t:4,n:51,f:["Dispense"],r:"data.verb"}]}]}," ",{t:4,f:[{p:[24,3,703],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[25,4,737],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[26,5,765]}]}," ",{p:[28,4,793],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[29,5,835]}]}," ",{p:[31,4,865],t:7,e:"section",a:{"class":"table",alight:"right"},f:[{p:[32,5,909],t:7,e:"section",a:{"class":"cell"}}," ",{p:[33,5,947],t:7,e:"section",a:{"class":"cell"},f:[{p:[34,6,976],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[34,45,1015]}],params:['{ "name" : ',{t:2,r:"name",p:[34,102,1072]},', "amount" : 1 }']},f:["One"]}]}," ",{p:[38,5,1151],t:7,e:"section",a:{"class":"cell"},f:[{p:[39,6,1180],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>1)?null:"disabled"'},p:[39,45,1219]}],params:['{ "name" : ',{t:2,r:"name",p:[39,101,1275]}," }"]},f:["Many"]}]}]}]}],n:52,r:"data.contents",p:[23,2,676]}]}],x:{r:["data.contents.length"],s:"_0==0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],465:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]},"   [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,r:"adata.inputLevel_text",p:[37,78,1447]}]}]}," ",{p:[39,3,1501],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1540],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1579]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1674],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1708]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1804],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1894],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1927]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2039],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2077]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2204],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2238],t:7,e:"span",f:[{t:2,r:"adata.inputAvailable",p:[47,9,2244]}]}]}]}," ",{p:[50,1,2308],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2339],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2377],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2394]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2449]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2519]}]},"   [",{p:[55,6,2587],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2600]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2617]}]},"]"]}," ",{p:[57,3,2724],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2764],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2785]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2817]}]},f:[{t:2,r:"adata.outputLevel_text",p:[58,80,2839]}]}]}," ",{p:[60,3,2894],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2934],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2973]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3070],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3104]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3202],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3293],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3326]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3441],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3479]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3609],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3644],t:7,e:"span",f:[{t:2,r:"adata.outputUsed",p:[68,9,3650]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],466:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:["\ufeff",{t:4,f:[" ",{p:[2,2,33],t:7,e:"ui-display",a:{title:"Dispersal Tank"},f:[{p:[3,3,73],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[4,4,104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.active"],s:'_0?"power-off":"close"'},p:[4,21,121]}],style:[{t:2,x:{r:["data.active"],s:'_0?"selected":null'},p:[5,12,174]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[6,12,223]}],action:"power"},f:[{t:2,x:{r:["data.active"],s:'_0?"On":"Off"'},p:[7,20,286]}]}]}," ",{p:[10,3,354],t:7,e:"ui-section",a:{label:"Smoke Radius Setting"},f:[{p:[11,5,401],t:7,e:"div",a:{"class":"content",style:"float:left"},f:[{p:[12,6,448],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=1?null:"disabled"'},p:[12,36,478]}],style:[{t:2,x:{r:["data.setting"],s:'_0==1?"selected":null'},p:[12,89,531]}],action:"setting",params:'{"amount": 1}'},f:["3"]}," ",{p:[13,6,634],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=2?null:"disabled"'},p:[13,36,664]}],style:[{t:2,x:{r:["data.setting"],s:'_0==2?"selected":null'},p:[13,89,717]}],action:"setting",params:'{"amount": 2}'},f:["6"]}," ",{p:[14,6,820],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=3?null:"disabled"'},p:[14,36,850]}],style:[{t:2,x:{r:["data.setting"],s:'_0==3?"selected":null'},p:[14,89,903]}],action:"setting",params:'{"amount": 3}'},f:["9"]}," ",{p:[15,6,1006],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=4?null:"disabled"'},p:[15,36,1036]}],style:[{t:2,x:{r:["data.setting"],s:'_0==4?"selected":null'},p:[15,89,1089]}],action:"setting",params:'{"amount": 4}'},f:["12"]}," ",{p:[16,6,1193],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=5?null:"disabled"'},p:[16,36,1223]}],style:[{t:2,x:{r:["data.setting"],s:'_0==5?"selected":null'},p:[16,89,1276]}],action:"setting",params:'{"amount": 5}'},f:["15"]}]}]}," ",{p:[19,3,1410],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[21,6,1476],t:7,e:"span",f:[{t:2,x:{r:["adata.TankCurrentVolume"],s:"Math.round(_0)"},p:[21,12,1482]},"/",{t:2,r:"data.TankMaxVolume",p:[21,52,1522]}," Units"]}," ",{p:[22,6,1564],t:7,e:"br"}," ",{p:[23,5,1575],t:7,e:"br"}," ",{t:4,f:[{p:[25,7,1623],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[25,50,1666]}," units of ",{t:2,r:"name",p:[25,85,1701]}]},{p:[25,100,1716],t:7,e:"br"}],n:52,r:"adata.TankContents",p:[24,6,1587]}],n:50,r:"data.isTankLoaded",p:[20,4,1444]},{t:4,n:51,f:[{p:[28,6,1757],t:7,e:"span",a:{"class":"bad"},f:["Tank Empty"]}],r:"data.isTankLoaded"}," ",{p:[30,4,1809],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Eject":"Close"'},p:[30,21,1826]}],style:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"selected":null'},p:[31,12,1881]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[32,12,1936]}],action:"purge"},f:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Purge Contents":"No chemicals detected"'},p:[33,20,1999]}]}]}]}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,2,1]}]},e.exports=a.extend(r.exports)},{341:341}],467:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],468:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],469:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,8,97],t:7,e:"ui-button",a:{action:"jump",params:['{"name" : ',{t:2,r:"name",p:[4,51,140]},"}"]},f:["Jump"]}," ",{p:[7,9,195],t:7,e:"ui-button",a:{action:"spawn",params:['{"name" : ',{t:2,r:"name",p:[7,53,239]},"}"]},f:["Spawn"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[2,22,46]}],button:0},f:[" ",{p:[11,3,308],t:7,e:"ui-section",a:{label:"Description"},f:[{p:[12,5,346],t:7,e:"span",f:[{t:3,r:"desc",p:[12,11,352]}]}]}," ",{p:[14,3,390],t:7,e:"ui-section",a:{label:"Spawners left"},f:[{p:[15,5,430],t:7,e:"span",f:[{t:2,r:"amount_left",p:[15,11,436]}]}]}]}],n:52,r:"data.spawners",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],470:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],471:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=a.extend(r.exports)},{341:341}],472:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],473:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],474:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],475:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 1:return"good";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,173],t:7,e:"ui-notice",f:[{p:[14,2,187],t:7,e:"ui-section",a:{label:"Reconnect"},f:[{p:[15,3,221],t:7,e:"div",a:{style:"float:right"},f:[{p:[16,4,251],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]}]}]}," ",{p:[20,1,359],t:7,e:"ui-display",a:{title:"Turbine Controller"},f:[{p:[21,2,401],t:7,e:"ui-section",a:{label:"Status"},f:[{t:4,f:[{p:[23,4,456],t:7,e:"span",a:{"class":"bad"},f:["Broken"]}],n:50,r:"data.broken",p:[22,3,432]},{t:4,n:51,f:[{p:[25,4,504],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.online"],s:"_0(_1)"},p:[25,17,517]}]},f:[{t:2,x:{r:["data.online","data.compressor_broke","data.turbine_broke"],s:'_0&&!(_1||_2)?"Online":"Offline"'},p:[25,46,546]}]}],r:"data.broken"}," ",{p:[27,3,656],t:7,e:"div",a:{style:"float:right"},f:[{p:[28,4,686],t:7,e:"ui-button",a:{icon:"power-off",action:"power-on",state:[{t:2,r:"data.broken",p:[28,57,739]}],style:[{t:2,x:{r:["data.online"],s:'_0?"selected":""'},p:[28,81,763]}]},f:["On"]}," ",{p:[29,4,817],t:7,e:"ui-button",a:{icon:"close",action:"power-off",state:[{t:2,r:"data.broken",p:[29,54,867]}],style:[{t:2,x:{r:["data.online"],s:'_0?"":"selected"'},p:[29,78,891]}]},f:["Off"]}]}," ",{t:4,f:[{p:[32,4,989],t:7,e:"br"}," [ ",{p:[33,6,1e3],t:7,e:"span",a:{"class":"bad"},f:["Compressor is inoperable"]}," ]"],n:50,r:"data.compressor_broke",p:[31,3,955]}," ",{t:4,f:[{p:[36,4,1097],t:7,e:"br"}," [ ",{p:[37,6,1108],t:7,e:"span",a:{"class":"bad"},f:["Turbine is inoperable"]}," ]"],n:50,r:"data.turbine_broke",p:[35,3,1066]}]}]}," ",{p:[41,1,1200],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[42,2,1230],t:7,e:"ui-section",a:{label:"Turbine Speed"},f:[{p:[43,3,1268],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.rpm"],s:'_0?"--":_1'},p:[43,9,1274]}," RPM"]}]}," ",{p:[45,2,1337],t:7,e:"ui-section",a:{label:"Internal Temp"},f:[{p:[46,3,1375],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.temp"],s:'_0?"--":_1'},p:[46,9,1381]}," K"]}]}," ",{p:[48,2,1443],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{p:[49,3,1483],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.power"],s:'_0?"--":_1'},p:[49,9,1489]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],476:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{341:341}],477:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,331],t:7,e:"ui-notice",f:[{p:[17,4,347],t:7,e:"span",f:["Safety restraints disabled."]}]}],n:50,r:"data.emagged",p:[15,2,307]}," ",{t:4,f:[{p:[21,3,442],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[22,4,482],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[23,5,513]}]}," ",{p:[25,4,559],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[26,5,592]}]}," ",{p:[28,4,640],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,5,673],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[29,26,694]}],value:[{t:2,r:"adata.vr_avatar.health",p:[29,64,732]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[29,99,767]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[29,140,808]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[29,179,847]}]}]}]}],n:50,r:"data.vr_avatar",p:[20,2,416]},{t:4,n:51,f:[{p:[33,3,935],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[37,2,1031],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[38,3,1067],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[38,20,1084]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[39,4,1151]}," the VR Sleeper"]}," ",{t:4,f:[{p:[42,4,1253],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[41,3,1225]}," ",{t:4,f:[{p:[47,4,1376],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar" -},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[46,3,1349]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],478:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=a.extend(r.exports)},{341:341}],479:[function(t,e,n){(function(e){"use strict";var n=t(341),a=e.interopRequireDefault(n);t(331),t(1),t(327),t(330);var r=t(480),i=e.interopRequireDefault(r),o=t(481),s=t(328),p=t(329),u=e.interopRequireDefault(p);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(485)),window.initialize=function(e){window.tgui=window.tgui||new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(482),text:t(486),config:n.config,data:n.data,adata:n.data}}})};var c=document.getElementById("data"),l=c.textContent,d=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(d,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var f=new u["default"]("FontAwesome");f.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,327:327,328:328,329:329,330:330,331:331,341:341,480:480,481:481,482:482,485:485,486:486,"babel/external-helpers":"babel/external-helpers"}],480:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(481),a=t(483);e.exports={components:{"ui-bar":t(342),"ui-button":t(343),"ui-display":t(344),"ui-input":t(345),"ui-linegraph":t(346),"ui-notice":t(347),"ui-section":t(349),"ui-subdisplay":t(350),"ui-tabs":t(351)},events:{enter:t(339).enter,space:t(339).space},transitions:{fade:t(340)},onconfig:function(){var e=this.get("config.interface"),n={ai_airlock:t(355),airalarm:t(356),"airalarm/back":t(357),"airalarm/modes":t(358),"airalarm/scrubbers":t(359),"airalarm/status":t(360),"airalarm/thresholds":t(361),"airalarm/vents":t(362),airlock_electronics:t(363),apc:t(364),atmos_alert:t(365),atmos_control:t(366),atmos_filter:t(367),atmos_mixer:t(368),atmos_pump:t(369),borgopanel:t(370),brig_timer:t(371),bsa:t(372),canister:t(373),cargo:t(374),cargo_express:t(375),cellular_emporium:t(376),centcom_podlauncher:t(377),chem_dispenser:t(378),chem_heater:t(379),chem_master:t(380),chem_synthesizer:t(381),clockwork_slab:t(382),codex_gigas:t(383),computer_fabricator:t(384),crayon:t(385),crew:t(386),cryo:t(387),disposal_unit:t(388),dna_vault:t(389),dogborg_sleeper:t(390),eightball:t(391),emergency_shuttle_console:t(392),engraved_message:t(393),error:t(394),"exofab - Copia":t(395),exonet_node:t(396),firealarm:t(397),gps:t(398),gulag_console:t(399),gulag_item_reclaimer:t(400),holodeck:t(401),implantchair:t(402),intellicard:t(403),keycard_auth:t(404),labor_claim_console:t(405),language_menu:t(406),launchpad_remote:t(407),mech_bay_power_console:t(408),mulebot:t(409),nanite_chamber_control:t(410),nanite_cloud_control:t(411),nanite_program_hub:t(412),nanite_programmer:t(413),nanite_remote:t(414),notificationpanel:t(415),ntnet_relay:t(416),ntos_ai_restorer:t(417),ntos_card:t(418),ntos_configuration:t(419),ntos_file_manager:t(420),ntos_main:t(421),ntos_net_chat:t(422),ntos_net_dos:t(423),ntos_net_downloader:t(424),ntos_net_monitor:t(425),ntos_net_transfer:t(426),ntos_power_monitor:t(427),ntos_revelation:t(428),ntos_station_alert:t(429),ntos_supermatter_monitor:t(430),ntosheader:t(431),nuclear_bomb:t(432),operating_computer:t(433),ore_redemption_machine:t(434),pandemic:t(435),personal_crafting:t(436),portable_pump:t(437),portable_scrubber:t(438),power_monitor:t(439),radio:t(440),rdconsole:t(441),"rdconsole/circuit":t(442),"rdconsole/designview":t(443),"rdconsole/destruct":t(444),"rdconsole/diskopsdesign":t(445),"rdconsole/diskopstech":t(446),"rdconsole/nodeview":t(447),"rdconsole/protolathe":t(448),"rdconsole/rdheader":t(449),"rdconsole/settings":t(450),"rdconsole/techweb":t(451),reagentgrinder:t(452),rpd:t(453),"rpd/colorsel":t(454),"rpd/dirsel":t(455),sat_control:t(456),scrubbing_types:t(457),shuttle_manipulator:t(458),"shuttle_manipulator/modification":t(459),"shuttle_manipulator/status":t(460),"shuttle_manipulator/templates":t(461),sleeper:t(462),slime_swap_body:t(463),smartvend:t(464),smes:t(465),smoke_machine:t(466),solar_control:t(467),space_heater:t(468),spawners_menu:t(469),station_alert:t(470),suit_storage_unit:t(471),tank_dispenser:t(472),tanks:t(473),thermomachine:t(474),turbine_computer:t(475),uplink:t(476),vr_sleeper:t(477),wires:t(478)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(354),titlebar:t(353),resize:t(348)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{339:339,340:340,341:341,342:342,343:343,344:344,345:345,346:346,347:347,348:348,349:349,350:350,351:351,353:353,354:354,355:355,356:356,357:357,358:358,359:359,360:360,361:361,362:362,363:363,364:364,365:365,366:366,367:367,368:368,369:369,370:370,371:371,372:372,373:373,374:374,375:375,376:376,377:377,378:378,379:379,380:380,381:381,382:382,383:383,384:384,385:385,386:386,387:387,388:388,389:389,390:390,391:391,392:392,393:393,394:394,395:395,396:396,397:397,398:398,399:399,400:400,401:401,402:402,403:403,404:404,405:405,406:406,407:407,408:408,409:409,410:410,411:411,412:412,413:413,414:414,415:415,416:416,417:417,418:418,419:419,420:420,421:421,422:422,423:423,424:424,425:425,426:426,427:427,428:428,429:429,430:430,431:431,432:432,433:433,434:434,435:435,436:436,437:437,438:438,439:439,440:440,441:441,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451,452:452,453:453,454:454,455:455,456:456,457:457,458:458,459:459,460:460,461:461,462:462,463:463,464:464,465:465,466:466,467:467,468:468,469:469,470:470,471:471,472:472,473:473,474:474,475:475,476:476,477:477,478:478,481:481,483:483}],481:[function(t,e,n){"use strict";function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],482:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],483:[function(t,e,n){"use strict";function a(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function r(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(481)},{481:481}],484:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;a||p.textContent.toLowerCase().includes(e)?p.style.display="":p.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],485:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],486:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var p=Array(o),u=0;o>u;u++)p[u]=arguments[u+3];n.children=p}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(p){r("throw",p)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(p){return void n(p)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],384:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["Network Card"]}," allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["Processor Unit"]}," is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["Tesla Relay"]}," is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["Nano Printer"]}," is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["Card Reader"]}," adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{341:341}],385:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],386:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{isHead:function(t){return t%10==0},dept_class:function(t){return 0==t?"dept-cap":t>=10&&20>t?"dept-sec":t>=20&&30>t?"dept-med":t>=30&&40>t?"dept-sci":t>=40&&50>t?"dept-eng":t>=50&&60>t?"dept-cargo":t>=200&&230>t?"dept-cent":"dept-other"},health_state:function(t,e,n,a){var r=t+e+n+a;return 0>=r?"health-5":25>=r?"health-4":50>=r?"health-3":75>=r?"health-2":"health-0"}}}}(r),r.exports.css=" .health {\r\n width: 16px;\r\n height: 16px;\r\n background-color: #FFF;\r\n border: 1px solid #434343;\r\n position: relative;\r\n top: 2px;\r\n display: inline-block;\r\n }\r\n .health-5 { background-color: #17d568; }\r\n .health-4 { background-color: #2ecc71; }\r\n .health-3 { background-color: #e67e22; }\r\n .health-2 { background-color: #ed5100; }\r\n .health-1 { background-color: #e74c3c; }\r\n .health-0 { background-color: #ed2814; }\r\n\r\n .dept-cap {color : #C06616;}\r\n .dept-sec {color : #E74C3C;}\r\n .dept-med {color : #3498DB;}\r\n .dept-sci {color : #9B59B6;}\r\n .dept-eng {color : #F1C40F;}\r\n .dept-cargo {color : #F39C12;}\r\n .dept-cent {color : #00C100;}\r\n .dept-other {color: #C38312;}\r\n\r\n .oxy { color : #3498db; }\r\n .toxin { color : #2ecc71; }\r\n .burn { color : #e67e22; }\r\n .brute { color : #e74c3c; }\r\n\r\n table.crew{\r\n border-collapse: collapse;\r\n }\r\n\r\n table.crew td {\r\n padding : 0px 10px;\r\n }",r.exports.template={v:3,t:[" ",{p:[27,1,1030],t:7,e:"ui-display",f:[{p:[28,2,1045],t:7,e:"ui-section",f:[{p:[29,3,1061],t:7,e:"table",a:{"class":"crew"},f:[{p:[30,3,1085],t:7,e:"thead",f:[{p:[31,3,1096],t:7,e:"tr",f:[{p:[32,4,1105],t:7,e:"th",f:["Name"]}," ",{p:[33,4,1123],t:7,e:"th",f:["Status"]}," ",{p:[34,4,1143],t:7,e:"th",f:["Vitals"]}," ",{p:[35,4,1163],t:7,e:"th",f:["Position"]}," ",{t:4,f:[{p:[37,5,1216],t:7,e:"th",f:["Tracking"]}],n:50,r:"data.link_allowed",p:[36,4,1185]}]}]}," ",{p:[41,3,1270],t:7,e:"tbody",f:[{t:4,f:[{p:[43,4,1308],t:7,e:"tr",f:[{p:[44,5,1318],t:7,e:"td",f:[{p:[45,6,1329],t:7,e:"span",a:{"class":[{t:2,x:{r:["isHead","ijob"],s:'_0(_1)?"bold ":""'},p:[45,19,1342]},{t:2,x:{r:["dept_class","ijob"],s:"_0(_1)"},p:[45,49,1372]}]},f:[{t:2,r:"name",p:[46,7,1402]}," (",{t:2,r:"assignment",p:[46,17,1412]},") ",{p:[47,6,1434],t:7,e:"span",f:[]}]}]}," ",{p:[49,5,1457],t:7,e:"td",f:[{t:4,f:[{p:[51,7,1498],t:7,e:"span",a:{"class":["health ",{t:2,x:{r:["health_state","oxydam","toxdam","burndam","brutedam"],s:"_0(_1,_2,_3,_4)"},p:[51,27,1518]}]}}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[50,6,1468]},{t:4,n:51,f:[{t:4,f:[{p:[54,8,1626],t:7,e:"span",a:{"class":"health health-5"}}],n:50,r:"life_status",p:[53,7,1598]},{t:4,n:51,f:[{p:[56,8,1688],t:7,e:"span",a:{"class":"health health-0"}}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[60,5,1771],t:7,e:"td",f:[{t:4,f:[{p:[62,7,1812],t:7,e:"span",f:["( ",{p:[64,8,1836],t:7,e:"span",a:{"class":"oxy"},f:[{t:2,r:"oxydam",p:[64,26,1854]}]}," / ",{p:[66,8,1890],t:7,e:"span",a:{"class":"toxin"},f:[{t:2,r:"toxdam",p:[66,28,1910]}]}," / ",{p:[68,8,1946],t:7,e:"span",a:{"class":"burn"},f:[{t:2,r:"burndam",p:[68,27,1965]}]}," / ",{p:[70,8,2002],t:7,e:"span",a:{"class":"brute"},f:[{t:2,r:"brutedam",p:[70,28,2022]}]}," )"]}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[61,6,1782]},{t:4,n:51,f:[{t:4,f:[{p:[75,8,2116],t:7,e:"span",f:["Alive"]}],n:50,r:"life_status",p:[74,7,2088]},{t:4,n:51,f:[{p:[77,8,2159],t:7,e:"span",f:["Dead"]}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[81,5,2222],t:7,e:"td",f:[{t:4,f:[{p:[83,6,2260],t:7,e:"span",f:[{t:2,r:"area",p:[83,12,2266]}]}],n:50,x:{r:["pos_x"],s:"_0!=null"},p:[82,5,2232]},{t:4,n:51,f:[{p:[85,6,2302],t:7,e:"span",f:["N/A"]}],x:{r:["pos_x"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[89,6,2381],t:7,e:"td",f:[{p:[90,7,2393],t:7,e:"ui-button",a:{action:"select_person",state:[{t:2,x:{r:["can_track"],s:'_0?null:"disabled"'},p:[90,48,2434]}],params:['{"name":"',{t:2,r:"name",p:[90,100,2486]},'"}']},f:["Track"]}]}],n:50,r:"data.link_allowed",p:[88,5,2348]}]}],n:52,r:"data.sensors",p:[42,3,1281]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{341:341}],387:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,189],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,223],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,236]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,265]}]}]}," ",{p:[9,4,317],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[10,6,356],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.temperaturestatus",p:[10,19,369]}]},f:[{t:2,r:"data.occupant.bodyTemperature",p:[10,56,406]}," K"]}]}," ",{p:[12,5,472],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[13,7,507],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[13,20,520]}],max:[{t:2,r:"data.occupant.maxHealth",p:[13,54,554]}],value:[{t:2,r:"data.occupant.health",p:[13,90,590]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[14,16,632]}]},f:[{t:2,r:"data.occupant.health",p:[14,68,684]}]}]}," ",{t:4,f:[{p:[17,7,908],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[17,26,927]}]},f:[{p:[18,9,948],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[18,30,969]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,66,1005]}],state:"bad"},f:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,103,1042]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[16,5,742]}],n:50,r:"data.hasOccupant",p:[5,3,159]}]}," ",{p:[23,1,1138],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[24,3,1167],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[25,5,1199],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[25,22,1216]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[26,14,1276]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[27,14,1332]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[28,22,1391]}]}]}," ",{p:[30,3,1459],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,3,1495],t:7,e:"span",a:{"class":[{t:2,r:"data.temperaturestatus",p:[31,16,1508]}]},f:[{t:2,r:"data.cellTemperature",p:[31,44,1536]}," K"]}]}," ",{p:[33,2,1588],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[34,5,1619],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[34,22,1636]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[34,73,1687]}]}," ",{p:[35,5,1740],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[35,22,1757]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[35,86,1821]}]}]}]}," ",{p:{button:[{p:[40,5,1967],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[40,36,1998]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[42,3,2101],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[45,9,2211],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,r:"volume",p:[45,52,2254]}," units of ",{t:2,r:"name",p:[45,72,2274]}]},{p:[45,87,2289],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[44,7,2171]},{t:4,n:51,f:[{p:[47,9,2320],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[43,5,2136]},{t:4,n:51,f:[{p:[50,7,2396],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],388:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open", +p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle"},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],389:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{341:341}],390:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,183],t:7,e:"ui-section",a:{label:"Items in storage"},f:[{p:[7,4,225],t:7,e:"span",f:[{t:2,r:"data.items",p:[7,10,231]}]}]}],n:50,r:"data.items",p:[5,3,159]}," ",{t:4,f:[{p:[11,5,310],t:7,e:"ui-section",a:{label:"State"},f:[{p:[12,7,344],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[12,20,357]}]},f:[{t:2,r:"data.occupant.stat",p:[12,49,386]}]}]}," ",{p:[14,5,439],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[15,7,474],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[15,20,487]}],max:[{t:2,r:"data.occupant.maxHealth",p:[15,54,521]}],value:[{t:2,r:"data.occupant.health",p:[15,90,557]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[16,16,599]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[16,68,651]}]}]}," ",{t:4,f:[{p:[19,7,888],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[19,26,907]}]},f:[{p:[20,9,928],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[20,30,949]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[20,66,985]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[20,103,1022]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[18,5,722]}," ",{p:[23,5,1109],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[24,9,1145],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[24,22,1158]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[24,68,1204]}]}]}," ",{p:[26,5,1287],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[27,9,1323],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[27,22,1336]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[27,68,1382]}]}]}," ",{p:[29,5,1466],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[31,11,1553],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[31,54,1596]}," units of ",{t:2,r:"name",p:[31,89,1631]}]},{p:[31,104,1646],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[30,9,1508]},{t:4,n:51,f:[{p:[33,11,1681],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[10,3,283]}]}," ",{p:[38,1,1777],t:7,e:"ui-display",a:{title:"Operations"},f:[{p:[39,3,1812],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[41,7,1872],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied"],s:'_0?null:"disabled"'},p:[41,38,1903]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[41,111,1976]},'"}']},f:[{t:2,r:"name",p:[41,121,1986]}]},{p:[41,141,2006],t:7,e:"br"}],n:52,r:"data.chem",p:[40,5,1845]}]}," ",{p:[44,2,2046],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[45,6,2079],t:7,e:"ui-button",a:{icon:"sign-out",action:"eject"},f:["Eject Contents"]}]}," ",{p:[47,2,2166],t:7,e:"ui-section",a:{label:"Self Cleaning"},f:[{p:[48,3,2204],t:7,e:"ui-button",a:{icon:"recycle",action:"cleaning"},f:["Self-Clean Cycle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],391:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{341:341}],392:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{341:341}],393:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{341:341}],394:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{341:341}],395:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,20],t:7,e:"ui-notice",f:["Currently syncing with the database"]}],n:50,r:"data.sync",p:[1,1,0]},{t:4,n:51,f:[{p:{button:[{p:[8,4,163],t:7,e:"ui-button",a:{icon:"eject",action:"eject_all"},f:["Eject all"]}," ",{p:[9,4,232],t:7,e:"ui-button",a:{icon:["toggle-",{t:2,x:{r:["data.show_materials"],s:'_0?"off":"on"'},p:[9,28,256]}],action:"toggle_materials_visibility"},f:[{t:2,x:{r:["data.show_materials"],s:'_0?"Hide":"Show"'},p:[10,5,339]}]}]},t:7,e:"ui-display",a:{title:"Materials",button:0},f:[" ",{t:4,f:[{p:[14,4,449],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[15,5,484],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[16,6,520],t:7,e:"section",a:{"class":"cell"}}," ",{p:[17,6,559],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[20,6,620],t:7,e:"section",a:{"class":"cell"},f:["Amount"]}," ",{p:[23,6,680],t:7,e:"section",a:{"class":"cell"}}," ",{p:[24,6,719],t:7,e:"section",a:{"class":"cell"}}]}," ",{t:4,f:[{p:[27,6,808],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[28,7,845],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[29,8,876]}]}," ",{p:[31,7,910],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"amount",p:[32,8,941]}]}," ",{p:[34,7,977],t:7,e:"section",a:{"class":"cell"},f:[{p:[35,8,1008],t:7,e:"ui-button",a:{icon:"eject"},f:["Release amount"]}]}," ",{p:[37,7,1084],t:7,e:"section",a:{"class":"cell",style:"width: 40px;"},f:[{p:[38,8,1136],t:7,e:"ui-button",a:{icon:"eject"},f:["Release all"]}]}]}],n:52,r:"data.all_materials",p:[26,5,773]}]}],n:50,r:"data.show_materials",p:[13,3,417]}]}," ",{p:[45,2,1274],t:7,e:"ui-display",a:{title:"Categories"},f:[{t:4,f:[{p:[47,4,1334],t:7,e:"ui-button",f:[{t:2,r:".",p:[47,15,1345]}]}],r:"data.categories",p:[46,3,1309]}]}],r:"data.sync"}]},e.exports=a.extend(r.exports)},{341:341}],396:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,5,49],t:7,e:"ui-button",a:{action:"toggle_power",style:[{t:2,x:{r:["data.toggle"],s:'_0?"selected":null'},p:[5,18,111]}]},f:["Turn ",{t:2,x:{r:["data.toggle"],s:'_0?"off":"on"'},p:[6,16,166]}]}]}," ",{p:[9,3,235],t:7,e:"ui-display",a:{title:"Logging"},f:[{t:4,f:[{p:[11,3,292],t:7,e:"ui-section",a:{label:">"},f:[{t:2,r:".",p:[11,25,314]},{p:[11,30,319],t:7,e:"ui-section",f:[]}]}],n:52,r:"data.logs",p:[10,5,269]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],397:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{341:341}],398:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{341:341}],399:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],400:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=a.extend(r.exports)},{341:341}],401:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{341:341}],402:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],403:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{341:341}],404:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{341:341}],405:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],406:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{341:341}],407:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224],t:7,e:"b",f:[{t:2,r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["â†"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button", +a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2,r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down"},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{341:341}],408:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{341:341}],409:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{341:341}],410:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Chamber Console"},f:[{p:[2,1,45],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,2,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,63,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,3,200],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[6,36,233]}]}," ",{p:[7,3,268],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[7,35,300]}]}," ",{p:[8,3,335],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[8,41,373]}]}," ",{t:4,f:[{p:[10,4,477],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[10,41,514]}]}],n:50,r:"data.disk.activation_delay",p:[9,3,438]}," ",{t:4,f:[{p:[13,4,600],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[13,30,626]}]}," ",{p:[14,4,663],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[14,36,695]}]}],n:50,r:"data.disk.timer",p:[12,3,572]}," ",{t:4,f:[{p:[17,4,785],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[17,40,821]}]}],n:50,r:"data.disk.activation_code",p:[16,3,747]}," ",{t:4,f:[{p:[20,4,918],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[20,42,956]}]}],n:50,r:"data.disk.deactivation_code",p:[19,3,878]}," ",{t:4,f:[{p:[23,4,1047],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[23,34,1077]}]}],n:50,r:"data.disk.kill_code",p:[22,3,1015]}," ",{t:4,f:[{p:[26,4,1163],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[26,37,1196]}]}],n:50,r:"data.disk.trigger_code",p:[25,3,1128]}," ",{t:4,f:[{t:4,f:[{p:[30,6,1332],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[30,25,1351]}]},f:[{t:2,r:"value",p:[30,35,1361]}]}],n:52,r:"data.disk.extra_settings",p:[29,4,1291]}],n:50,r:"data.disk.has_extra_settings",p:[28,3,1250]}],n:50,r:"data.has_program",p:[5,2,172]},{t:4,n:51,f:[{p:[34,3,1423],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,1,80]},{t:4,n:51,f:[{p:[37,2,1489],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[40,1,1550],t:7,e:"br"}," ",{t:4,f:[{p:[42,2,1582],t:7,e:"ui-notice",f:[{t:2,r:"data.status_msg",p:[42,13,1593]}]}],n:50,r:"data.status_msg",p:[41,1,1556]},{t:4,n:51,f:[{p:[44,2,1637],t:7,e:"ui-display",a:{title:"Chamber"},f:[{p:[45,2,1668],t:7,e:"ui-section",f:[{p:[45,14,1680],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock-open":"lock"'},p:[45,30,1696]}],action:"toggle_lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[45,90,1756]}," Chamber"]},{p:[45,146,1812],t:7,e:"br"}]}," ",{p:[46,2,1832],t:7,e:"ui-section",f:[{p:[46,14,1844],t:7,e:"b",f:["Occupant:"]}," ",{t:2,r:"data.occupant_name",p:[46,31,1861]}]}," ",{t:4,f:[{p:[48,4,1929],t:7,e:"ui-section",f:[{p:[48,16,1941],t:7,e:"ui-notice",f:["No nanites detected."]}]}," ",{p:[49,4,2002],t:7,e:"ui-section",f:[{p:[49,16,2014],t:7,e:"ui-button",a:{icon:"syringe",action:"nanite_injection"},f:["Implant Nanites"]}]}],n:50,x:{r:["data.has_nanites"],s:"!_0"},p:[47,2,1899]},{t:4,n:51,f:[{p:[51,3,2121],t:7,e:"ui-display",a:{title:"Nanites"},f:[{t:4,f:[{p:[53,5,2181],t:7,e:"ui-button",a:{icon:"download",action:"add_program"},f:["Install Program From Disk"]},{p:[53,90,2266],t:7,e:"br"}," ",{p:[54,5,2276],t:7,e:"br"}],n:50,r:"data.has_disk",p:[52,4,2154]}," ",{p:[56,4,2297],t:7,e:"ui-section",f:[{p:[57,5,2315],t:7,e:"ui-section",a:{label:"Nanite Volume"},f:[{t:2,r:"data.nanite_volume",p:[57,39,2349]}]}," ",{p:[58,5,2390],t:7,e:"ui-section",a:{label:"Growth Rate"},f:[{t:2,r:"data.regen_rate",p:[58,37,2422]}]}," ",{p:[59,5,2460],t:7,e:"ui-section",a:{label:"Safety Threshold"},f:[{t:2,r:"data.safety_threshold",p:[59,42,2497]}," ",{p:[59,68,2523],t:7,e:"ui-button",a:{icon:"pencil",action:"set_safety"},f:["Set"]}]}," ",{p:[60,5,2603],t:7,e:"ui-section",a:{label:"Cloud ID"},f:[{t:2,x:{r:["data.cloud_id"],s:'_0?_0:"No Cloud"'},p:[60,34,2632]}," ",{p:[60,82,2680],t:7,e:"ui-button",a:{icon:"pencil",action:"set_cloud"},f:["Set"]}]}]}," ",{p:[62,4,2776],t:7,e:"ui-display",a:{title:"Programs"},f:[{t:4,f:[{p:[64,6,2845],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[64,25,2864]}],button:0},f:[{p:[65,6,2888],t:7,e:"ui-button",a:{icon:"minus",action:"remove_program",params:['{"program_id": "',{t:2,r:"id",p:[65,78,2960]},'"}']},f:["Uninstall"]}," ",{p:[66,6,2998],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[66,38,3030]}]}," ",{t:4,f:[{p:[68,7,3094],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[68,45,3132]}]}," ",{p:[69,7,3191],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[69,44,3228]},"/s"]}," ",{t:4,f:[{p:[71,8,3291],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[71,41,3324]}]}," ",{p:[72,8,3362],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[72,45,3399]}," seconds"]}],n:50,r:"can_trigger",p:[70,7,3263]}," ",{t:4,f:[{t:4,f:[{p:[76,9,3534],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,46,3571]}]}],n:50,r:"activation_delay",p:[75,8,3500]}," ",{t:4,f:[{p:[79,9,3652],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,35,3678]}]}," ",{p:[80,9,3710],t:7,e:"ui-section",a:{label:"Timer Type"},f:[{t:2,r:"timer_type",p:[80,40,3741]}]}],n:50,r:"timer",p:[78,8,3629]}," ",{t:4,f:[{t:4,f:[{p:[84,11,3865],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,30,3884]}]},f:[{t:2,r:"value",p:[84,40,3894]}]}],n:52,r:"extra_settings",p:[83,9,3829]}],n:50,r:"has_extra_settings",p:[82,8,3793]}," ",{t:4,f:[{t:4,f:[{p:[89,10,4032],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[89,46,4068]}]}],n:50,r:"activation_code",p:[88,9,3998]}," ",{t:4,f:[{p:[92,10,4163],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[92,48,4201]}]}],n:50,r:"deactivation_code",p:[91,9,4127]}," ",{t:4,f:[{p:[95,10,4290],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[95,40,4320]}]}],n:50,r:"kill_code",p:[94,9,4262]}," ",{t:4,f:[{p:[98,10,4404],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[98,43,4437]}]}],n:50,r:"trigger_code",p:[97,9,4373]}],n:50,x:{r:["data.scan_level"],s:"_0>=4"},p:[87,8,3960]}],n:50,x:{r:["data.scan_level"],s:"_0>=3"},p:[74,7,3463]}],n:50,x:{r:["data.scan_level"],s:"_0>=2"},p:[67,6,3058]}]}],n:52,r:"data.mob_programs",p:[63,5,2811]}]}]}],x:{r:["data.has_nanites"],s:"!_0"}}]}],r:"data.status_msg"}]}]},e.exports=a.extend(r.exports)},{341:341}],411:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Cloud Console"},f:[{p:[2,1,43],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{t:4,f:[{p:[4,3,104],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]},{p:[4,64,165],t:7,e:"br"}," ",{t:4,f:[{p:[6,4,202],t:7,e:"ui-section",f:[{p:[7,5,220],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[7,38,253]}]}," ",{p:[8,5,290],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[8,37,322]}]}," ",{p:[9,5,359],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["data.disk.activated"],s:'_0?"Active":"Inactive"'},p:[9,43,397]}]}," ",{t:4,f:[{p:[11,6,505],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"data.disk.activation_delay",p:[11,43,542]}]}],n:50,r:"data.disk.activation_delay",p:[10,5,464]}," ",{t:4,f:[{p:[14,6,634],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"data.disk.timer",p:[14,32,660]}]}," ",{p:[15,6,699],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"data.disk.timer_type",p:[15,38,731]}]}],n:50,r:"data.disk.timer",p:[13,5,604]}," ",{t:4,f:[{p:[18,6,827],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"data.disk.activation_code",p:[18,42,863]}]}],n:50,r:"data.disk.activation_code",p:[17,5,787]}," ",{t:4,f:[{p:[21,6,966],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"data.disk.deactivation_code",p:[21,44,1004]}]}],n:50,r:"data.disk.deactivation_code",p:[20,5,924]}," ",{t:4,f:[{p:[24,6,1101],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"data.disk.kill_code",p:[24,36,1131]}]}],n:50,r:"data.disk.kill_code",p:[23,5,1067]}," ",{t:4,f:[{p:[27,6,1223],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"data.disk.trigger_code",p:[27,39,1256]}]}],n:50,r:"data.disk.trigger_code",p:[26,5,1186]}," ",{t:4,f:[{t:4,f:[{p:[31,8,1400],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[31,27,1419]}]},f:[{t:2,r:"value",p:[31,37,1429]}]}],n:52,r:"data.disk.extra_settings",p:[30,6,1357]}],n:50,r:"data.disk.has_extra_settings",p:[29,5,1314]}]}],n:50,r:"data.has_program",p:[5,3,173]},{t:4,n:51,f:[{p:[36,4,1515],t:7,e:"ui-notice",f:["No program detected."]}],r:"data.has_program"}],n:50,r:"data.has_disk",p:[3,2,79]},{t:4,n:51,f:[{p:[39,3,1584],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"}]}," ",{p:[42,1,1646],t:7,e:"ui-display",a:{title:"Cloud Storage"},f:[{t:4,f:[{p:[44,3,1713],t:7,e:"ui-button",a:{icon:"plus-circle",action:"create_backup"},f:["Create New Backup"]}," ",{p:[45,3,1799],t:7,e:"ui-display",a:{title:"Active Backups"},f:[{t:4,f:[{p:[47,5,1873],t:7,e:"ui-button",a:{action:"set_view",params:['{"view": "',{t:2,r:"cloud_id",p:[47,52,1920]},'"}']},f:["Backup #",{t:2,r:"cloud_id",p:[47,76,1944]}]}],n:52,r:"data.cloud_backups",p:[46,4,1839]}]}],n:50,x:{r:["data.current_view"],s:"!_0"},p:[43,2,1683]},{t:4,n:51,f:[{p:[51,3,2014],t:7,e:"ui-button",a:{icon:"undo",action:"set_view",params:'{"view": "0"}'},f:["Return"]}," ",{t:4,f:[{p:[53,4,2131],t:7,e:"ui-notice",f:["ERROR: Backup not found."]}],n:50,x:{r:["data.cloud_backup"],s:"!_0"},p:[52,3,2100]},{t:4,n:51,f:[{p:[55,4,2195],t:7,e:"ui-display",a:{title:["Backup #",{t:2,r:"data.current_view",p:[55,31,2222]}]},f:[{t:4,f:[{p:[57,6,2282],t:7,e:"ui-button",a:{icon:"upload",action:"upload_program",style:"selected"},f:["Upload Program From Disk"]},{p:[57,108,2384],t:7,e:"br"}],n:50,r:"data.has_program",p:[56,5,2251]}," ",{t:4,f:[{p:[60,6,2443],t:7,e:"hr"}," ",{p:[61,6,2454],t:7,e:"ui-section",f:[{p:[62,7,2474],t:7,e:"h3",f:[{t:2,r:"name",p:[62,11,2478]}]}," ",{p:[63,7,2499],t:7,e:"div",a:{style:"float:right"},f:[{p:[64,8,2533],t:7,e:"ui-button",a:{icon:"minus-circle",action:"remove_program",style:"danger",params:['{"program_id": "',{t:2,r:"id",p:[64,102,2627]},'"}']},f:["Uninstall"]}]}]}," ",{p:[67,6,2699],t:7,e:"ui-section",f:[{p:[68,7,2719],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"desc",p:[68,39,2751]}]}," ",{p:[69,7,2780],t:7,e:"ui-section",a:{label:"Activation Status"},f:[{t:2,x:{r:["activated"],s:'_0?"Active":"Inactive"'},p:[69,45,2818]}]}," ",{p:[70,7,2877],t:7,e:"ui-section",a:{label:"Nanites Consumed"},f:[{t:2,r:"use_rate",p:[70,44,2914]},"/s"]}," ",{t:4,f:[{p:[72,8,2977],t:7,e:"ui-section",a:{label:"Trigger Cost"},f:[{t:2,r:"trigger_cost",p:[72,41,3010]},"/s"]}," ",{p:[73,8,3050],t:7,e:"ui-section",a:{label:"Trigger Cooldown"},f:[{t:2,r:"trigger_cooldown",p:[73,45,3087]},"/s"]}],n:50,r:"can_trigger",p:[71,7,2949]}," ",{t:4,f:[{p:[76,8,3178],t:7,e:"ui-section",a:{label:"Activation Delay"},f:[{t:2,r:"activation_delay",p:[76,45,3215]}]}],n:50,r:"activation_delay",p:[75,7,3145]}," ",{t:4,f:[{p:[79,8,3293],t:7,e:"ui-section",a:{label:"Timer"},f:[{t:2,r:"timer",p:[79,34,3319]}]}," ",{p:[80,8,3350],t:7,e:"ui-section",a:{label:"Timer Type "},f:[{t:2,r:"timer_type",p:[80,40,3382]}]}],n:50,r:"timer",p:[78,7,3271]}," ",{t:4,f:[{p:[83,8,3464],t:7,e:"ui-section",a:{label:"Activation Code"},f:[{t:2,r:"activation_code",p:[83,44,3500]}]}],n:50,r:"activation_code",p:[82,7,3432]}," ",{t:4,f:[{p:[86,8,3589],t:7,e:"ui-section",a:{label:"Deactivation Code"},f:[{t:2,r:"deactivation_code",p:[86,46,3627]}]}],n:50,r:"deactivation_code",p:[85,7,3555]}," ",{t:4,f:[{p:[89,8,3710],t:7,e:"ui-section",a:{label:"Kill Code"},f:[{t:2,r:"kill_code",p:[89,38,3740]}]}],n:50,r:"kill_code",p:[88,7,3684]}," ",{t:4,f:[{p:[92,8,3818],t:7,e:"ui-section",a:{label:"Trigger Code"},f:[{t:2,r:"trigger_code",p:[92,41,3851]}]}],n:50,r:"trigger_code",p:[91,7,3789]}," ",{t:4,f:[{t:4,f:[{p:[96,10,3973],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[96,29,3992]}]},f:[{t:2,r:"value",p:[96,39,4002]}]}],n:52,r:"extra_settings",p:[95,8,3938]}],n:50,r:"has_extra_settings",p:[94,7,3903]}]}],n:52,r:"data.cloud_programs",p:[59,5,2407]}]}],x:{r:["data.cloud_backup"],s:"!_0"}}],x:{r:["data.current_view"],s:"!_0"}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],412:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Program Hub"},f:[{t:4,f:[{p:[3,2,65],t:7,e:"ui-display",a:{title:"Program Disk"},f:[{p:[4,3,102],t:7,e:"ui-section",f:[{p:[5,4,119],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{p:[6,4,185],t:7,e:"ui-button",a:{icon:"minus-circle",action:"clear"},f:["Delete Program"]}]}," ",{t:4,f:[{p:[9,4,307],t:7,e:"ui-section",a:{label:"Program Name"},f:[{t:2,r:"data.disk.name",p:[9,37,340]}]}," ",{p:[10,4,376],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.disk.desc",p:[10,36,408]}]}],n:50,r:"data.has_program",p:[8,3,278]},{t:4,n:51,f:[{p:[12,4,456],t:7,e:"ui-notice",f:["No program installed."]}],r:"data.has_program"}]}],n:50,r:"data.has_disk",p:[2,1,41]},{t:4,n:51,f:[{p:[16,2,540],t:7,e:"ui-notice",f:["Insert disk."]}],r:"data.has_disk"},{p:[18,1,586],t:7,e:"br"}," ",{p:[19,1,592],t:7,e:"ui-display",a:{title:"Programs"},f:[{p:[20,2,624],t:7,e:"ui-section",f:[{p:[21,3,640],t:7,e:"ui-button",a:{icon:"undo",action:"set_category",params:'{"category": "Main"}'},f:["Return"]}," ",{p:[22,3,737],t:7,e:"ui-button",a:{icon:"align-justify ",action:"toggle_details"},f:[{t:2,x:{r:["data.detail_view"],s:'_0?"Compact View":"Detailed View"'},p:[22,60,794]}]}]}," ",{t:4,f:[{p:[25,3,916],t:7,e:"ui-display",f:[{t:4,f:[{p:[27,5,964],t:7,e:"ui-section",f:[{p:[27,17,976],t:7,e:"ui-button",a:{action:"set_category",params:['{"category": "',{t:2,r:"name",p:[27,72,1031]},'"}']},f:[{t:2,r:"name",p:[27,84,1043]}]}]}],n:52,r:"data.categories",p:[26,4,933]}]}],n:50,x:{r:["data.category"],s:'_0=="Main"'},p:[24,2,881]},{t:4,n:51,f:[{p:[31,3,1122],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[31,22,1141]}]},f:[{t:4,f:[{t:4,f:[{p:[34,6,1229],t:7,e:"ui-display",f:[{p:[35,7,1249],t:7,e:"ui-section",f:[{p:[35,19,1261],t:7,e:"b",f:[{t:2,r:"name",p:[35,22,1264]}]}]}," ",{p:[36,7,1297],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[36,19,1309]}]}," ",{p:[37,7,1338],t:7,e:"ui-section",f:[{p:[38,8,1359],t:7,e:"ui-button",a:{icon:"download",action:"download",params:['{"program_id": "',{t:2,r:"id",p:[38,77,1428]},'"}'],state:[{t:2,x:{r:["data.has_disk"],s:'_0?null:"disabled"'},p:[38,94,1445]}]},f:["Download"]}]}]}],n:50,r:"data.detail_view",p:[33,5,1198]},{t:4,n:51,f:[{p:[44,6,1585],t:7,e:"ui-section",f:[{p:[44,18,1597],t:7,e:"ui-button",a:{action:"download",params:['{"program_id": "',{t:2,r:"id",p:[44,71,1650]},'"}']},f:[{t:2,r:"name",p:[44,81,1660]}]}]}],r:"data.detail_view"}],n:52,r:"data.program_list",p:[32,4,1165]}]}],x:{r:["data.category"],s:'_0=="Main"'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],413:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Programming"},f:[{t:4,f:[{p:[3,3,67],t:7,e:"ui-notice",f:["Insert a nanite program disk."]}],n:50,x:{r:["data.has_disk"],s:"!_0"},p:[2,1,41]},{t:4,n:51,f:[{p:[5,3,133],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject Disk"]}," ",{t:4,f:[{p:[7,5,229],t:7,e:"ui-notice",f:["No program detected."]}],n:50,x:{r:["data.has_program"],s:"!_0"},p:[6,3,198]},{t:4,n:51,f:[{p:[9,5,290],t:7,e:"ui-section",f:[{p:[10,7,310],t:7,e:"ui-display",a:{title:[{t:2,r:"data.name",p:[10,26,329]}]},f:[{t:2,r:"data.desc",p:[11,9,354]}]}]}," ",{p:[14,5,413],t:7,e:"ui-section",f:[{p:[15,7,433],t:7,e:"ui-section",a:{label:"Program Info"},f:["Nanites Consumed: ",{t:2,r:"data.use_rate",p:[16,26,493]},{p:[16,43,510],t:7,e:"br"}," ",{t:4,f:["Trigger Cost: ",{t:2,r:"data.trigger_cost",p:[18,25,574]},"u",{p:[18,47,596],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[17,9,524]}]}," ",{p:[22,7,648],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[23,9,685],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.activated"],s:'_0?"toggle-on":"toggle-off"'},p:[24,17,713]}],action:"toggle_active"},f:[{t:2,x:{r:["data.activated"],s:'_0?"Active":"Inactive"'},p:[26,11,809]}]}]}," ",{p:[30,7,905],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[31,9,944],t:7,e:"ui-button",a:{icon:"pencil",action:"set_activation_delay"}}," Activation Delay: ",{t:2,r:"data.activation_delay",p:[31,95,1030]}," ",{p:[31,121,1056],t:7,e:"br"}," ",{p:[32,9,1070],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer"}}," Timer: ",{t:2,r:"data.timer",p:[32,73,1134]}," ",{p:[32,88,1149],t:7,e:"br"}," ",{p:[33,9,1163],t:7,e:"ui-button",a:{icon:"pencil",action:"set_timer_type"}}," Timer Type: ",{t:2,r:"data.timer_type",p:[33,83,1237]}," ",{p:[33,103,1257],t:7,e:"br"}]}," ",{p:[36,7,1292],t:7,e:"ui-section",a:{label:"Codes"},f:[{p:[37,9,1328],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "activation"}'}}," Activation Code: ",{t:2,r:"data.activation_code",p:[37,121,1440]}," ",{p:[37,146,1465],t:7,e:"br"}," ",{p:[38,9,1479],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "deactivation"}'}}," Deactivation Code: ",{t:2,r:"data.deactivation_code",p:[38,125,1595]}," ",{p:[38,152,1622],t:7,e:"br"}," ",{p:[39,9,1636],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "kill"}'}}," Kill Code: ",{t:2,r:"data.kill_code",p:[39,109,1736]}," ",{p:[39,128,1755],t:7,e:"br"}," ",{t:4,f:[{p:[41,11,1805],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code",params:'{"target_code": "trigger"}'}}," Trigger Code: ",{t:2,r:"data.trigger_code",p:[41,117,1911]}," ",{p:[41,139,1933],t:7,e:"br"}],n:50,r:"data.can_trigger",p:[40,9,1769]}]}," ",{t:4,f:[{p:[46,9,2026],t:7,e:"ui-section",a:{label:"Special"},f:[{t:4,f:[{p:[48,13,2109],t:7,e:"ui-button",a:{icon:"pencil",action:"set_extra_setting",params:['{"target_setting": "',{t:2,r:"name",p:[48,93,2189]},'"}']}}," ",{t:2,r:"name",p:[48,118,2214]},": ",{t:2,r:"value",p:[48,128,2224]}," ",{p:[48,138,2234],t:7,e:"br"}],n:52,r:"data.extra_settings",p:[47,11,2066]}]}],n:50,r:"data.has_extra_settings",p:[45,7,1985]}]}],x:{r:["data.has_program"],s:"!_0"}}],x:{r:["data.has_disk"],s:"!_0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],414:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Nanite Control"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-notice",f:["The interface is locked."]}],n:50,r:"data.locked",p:[2,1,37]},{t:4,n:51,f:[{p:[5,3,121],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock Interface"]}," ",{p:[6,3,188],t:7,e:"ui-button",a:{icon:"save",action:"save"},f:["Save Current Setting"]}," ",{p:[7,3,261],t:7,e:"ui-section",a:{label:"Signal Code"},f:[{p:[8,5,299],t:7,e:"span",f:[{t:2,r:"data.code",p:[8,11,305]}]}," ",{p:[9,4,330],t:7,e:"ui-button",a:{icon:"pencil",action:"set_code"},f:["Set"]}]}," ",{t:4,f:[{p:[12,5,443],t:7,e:"ui-section",a:{label:"Relay Code"},f:[{p:[13,7,482],t:7,e:"span",f:[{t:2,r:"data.relay_code",p:[13,13,488]}]}," ",{p:[14,5,520],t:7,e:"ui-button",a:{icon:"pencil",action:"set_relay_code"},f:["Set"]}]}],n:50,x:{r:["data.mode"],s:'_0=="Relay"'},p:[11,3,409]}," ",{p:[17,3,618],t:7,e:"ui-section",a:{label:"Signal Mode"},f:[{p:[18,5,656],t:7,e:"span",f:[{t:2,r:"data.mode",p:[18,11,662]}]}," ",{p:[19,5,688],t:7,e:"br"}," ",{p:[20,4,697],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Off"}'},f:["Off"]}," ",{p:[21,5,775],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Local"}'},f:["Local"]}," ",{p:[22,5,857],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Targeted"}'},f:["Targeted"]}," ",{p:[23,5,945],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Area"}'},f:["Area"]}," ",{p:[24,5,1025],t:7,e:"ui-button",a:{action:"select_mode",params:'{"mode": "Relay"}'},f:["Relay"]}]}],r:"data.locked"}]}," ",{p:[28,1,1144],t:7,e:"ui-display",a:{title:"Saved Settings"},f:[{t:4,f:[{p:[30,3,1215],t:7,e:"ui-button",a:{icon:"load",action:"load",params:['{"save_id": "',{t:2,r:"id",p:[30,61,1273]},'"}']},f:[{t:2,r:"name",p:[30,71,1283]}]}," ",{t:4,f:[{p:[32,4,1332],t:7,e:"ui-button",a:{icon:"remove",action:"remove_save",params:['{"save_id": "',{t:2,r:"id",p:[32,71,1399]},'"}']},f:["Remove"]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[31,3,1307]}," ",{p:[34,3,1442],t:7,e:"br"}],n:52,r:"data.saved_settings",p:[29,2,1182]}]}]},e.exports=a.extend(r.exports)},{341:341}],415:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ghost roles"},f:[{p:[2,2,35],t:7,e:"ui-section",a:{label:"Ignored roles"},f:[{t:4,f:[{p:[4,4,99],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[4,21,116]}],style:[{t:2,x:{r:["enabled"],s:'_0?"danger":null'},p:[4,73,168]}],action:"toggle_ignore",params:['{"key": "',{t:2,r:"key",p:[4,144,239]},'"}']},f:[{t:2,r:"desc",p:[4,155,250]}]}],n:52,r:"data.ignore",p:[3,3,73]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],416:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{341:341}],417:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236] +}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table",f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582],t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],418:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';"},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],419:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],420:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],421:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:["   "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],422:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],423:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],424:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],425:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays" +}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],426:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],427:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}]}]}," ",{p:[55,5,1528],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1563],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1569]}]}]}],r:"config.fancy"}]}," ",{p:[60,1,1638],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1668],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1693],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1730],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1769],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1806],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1845],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1887],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1928],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2013],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2032]}],nowrap:0},f:[{p:[72,7,2057],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2078]}," %"]}," ",{p:[73,7,2136],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[73,28,2157]}]}," ",{p:[74,7,2199],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2220],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2233]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2262]}]}]}," ",{p:[75,7,2309],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2330],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2343]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2366]}," [",{p:[75,87,2389],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2395]}]},"]"]}]}," ",{p:[76,7,2444],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2465],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2478]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2501]}," [",{p:[76,87,2524],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2530]}]},"]"]}]}," ",{p:[77,7,2579],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2600],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2613]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2636]}," [",{p:[77,87,2659],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2665]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1987]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],428:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],429:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],430:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(431)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,431:431}],431:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{341:341}],432:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],433:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,25],t:7,e:"ui-button",a:{icon:"undo",action:"change_menu",params:'{"menu": "1"}'},f:["Return"]}," ",{p:[3,2,113],t:7,e:"ui-display",a:{title:"Advanced Surgery Procedures"},f:[{p:[4,3,165],t:7,e:"ui-button",a:{icon:"download",action:"sync"},f:["Sync with research database"]}," ",{t:4,f:[{p:[6,4,278],t:7,e:"ui-display",f:[{p:[7,6,297],t:7,e:"ui-section",f:[{p:[7,18,309],t:7,e:"b",f:[{t:2,r:"name",p:[7,21,312]}]}]}," ",{p:[8,6,344],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[8,18,356]}]}]}],n:52,r:"data.surgeries",p:[5,3,249]}]}],n:50,x:{r:["data.menu"],s:"_0==2"},p:[1,1,0]},{t:4,n:51,f:[{p:[13,2,437],t:7,e:"ui-button",a:{action:"change_menu",params:'{"menu": "2"}'},f:["View Surgery Procedures"]}," ",{t:4,f:[{p:[15,3,556],t:7,e:"ui-notice",f:["No table detected!"]}],n:51,r:"data.table",p:[14,2,530]}," ",{p:[19,2,623],t:7,e:"ui-display",f:[{p:[20,3,639],t:7,e:"ui-display",a:{title:"Patient State"},f:[{t:4,f:[{p:[22,5,704],t:7,e:"ui-section",a:{label:"State"},f:[{p:[23,6,737],t:7,e:"span",a:{"class":[{t:2,r:"data.patient.statstate",p:[23,19,750]}]},f:[{t:2,r:"data.patient.stat",p:[23,47,778]}]}]}," ",{p:[25,5,831],t:7,e:"ui-section",a:{label:"Blood Type"},f:[{p:[26,6,869],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.patient.blood_type",p:[26,28,891]}]}]}," ",{p:[28,5,950],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,6,984],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.patient.minHealth",p:[29,19,997]}],max:[{t:2,r:"data.patient.maxHealth",p:[29,52,1030]}],value:[{t:2,r:"data.patient.health",p:[29,87,1065]}],state:[{t:2,x:{r:["data.patient.health"],s:'_0>=0?"good":"average"'},p:[30,13,1103]}]},f:[{t:2,x:{r:["adata.patient.health"],s:"Math.round(_0)"},p:[30,64,1154]}]}]}," ",{t:4,f:[{p:[33,6,1389],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[33,25,1408]}]},f:[{p:[34,7,1427],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.patient.maxHealth",p:[34,28,1448]}],value:[{t:2,rx:{r:"data.patient",m:[{t:30,n:"type"}]},p:[34,63,1483]}],state:"bad"},f:[{t:2,x:{r:["type","adata.patient"],s:"Math.round(_1[_0])"},p:[34,99,1519]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}]'},p:[32,5,1224]}],n:50,r:"data.patient",p:[21,4,678]},{t:4,n:51,f:["No patient detected."],r:"data.patient"}]}," ",{p:[41,3,1670],t:7,e:"ui-display",a:{title:"Initiated Procedures"},f:[{t:4,f:[{t:4,f:[{p:[44,6,1777],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[44,28,1799]}]},f:[{p:[45,7,1817],t:7,e:"ui-section",a:{label:"Next Step"},f:[{p:[46,8,1856],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"next_step",p:[46,30,1878]}]}," ",{t:4,f:[{p:[48,9,1937],t:7,e:"span",a:{"class":"content"},f:[{p:[48,31,1959],t:7,e:"b",f:["Required chemicals:"]},{p:[48,57,1985],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[48,62,1990]}]}],n:50,r:"chems_needed",p:[47,8,1907]}]}," ",{t:4,f:[{p:[52,8,2091],t:7,e:"ui-section",a:{label:"Alternative Step"},f:[{p:[53,9,2138],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"alternative_step",p:[53,31,2160]}]}," ",{t:4,f:[{p:[55,10,2232],t:7,e:"span",a:{"class":"content"},f:[{p:[55,32,2254],t:7,e:"b",f:["Required chemicals:"]},{p:[55,58,2280],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[55,63,2285]}]}],n:50,r:"alt_chems_needed",p:[54,9,2197]}]}],n:50,r:"alternative_step",p:[51,7,2058]}]}],n:52,r:"data.procedures",p:[43,5,1745]}],n:50,r:"data.procedures",p:[42,4,1716]},{t:4,n:51,f:["No active procedures."],r:"data.procedures"}]}]}],x:{r:["data.menu"],s:"_0==2"}}]},e.exports=a.extend(r.exports)},{341:341}],434:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed points: ",{t:2,r:"data.unclaimedPoints",p:[6,29,159]}," ",{t:4,f:[{p:[8,4,220],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim Points"]}],n:50,r:"data.unclaimedPoints",p:[7,3,187]}]}," ",{p:[13,2,311],t:7,e:"ui-section",f:[{t:4,f:[{p:[15,4,350],t:7,e:"ui-button",a:{action:"Eject"},f:["Eject ID"]}," You have ",{t:2,r:"data.claimedPoints",p:[18,13,421]}," mining points collected."],n:50,r:"data.hasID",p:[14,3,327]},{t:4,n:51,f:[{p:[20,4,485],t:7,e:"ui-button",a:{action:"Insert"},f:["Insert ID"]}],r:"data.hasID"}]}]}," ",{p:[26,1,588],t:7,e:"ui-display",f:[{t:4,f:[{p:[28,3,627],t:7,e:"ui-section",f:[{p:[29,4,644],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[34,4,772],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[35,5,808],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[35,42,845]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[35,129,932]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[38,10,988]},": ",{t:2,r:"name",p:[38,21,999]}]}],n:52,r:"data.diskDesigns",p:[33,3,741]}],n:50,r:"data.hasDisk",p:[27,2,603]},{t:4,n:51,f:[{p:[42,3,1053],t:7,e:"ui-section",f:[{p:[43,4,1070],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{t:4,f:[{p:[50,2,1223],t:7,e:"ui-display",f:[{p:[51,3,1239],t:7,e:"ui-section",f:[{p:[52,4,1256],t:7,e:"b",f:["Warning"]},": ",{t:2,r:"data.disconnected",p:[52,20,1272]},". Please contact the quartermaster."]}]}],n:50,r:"data.disconnected",p:[49,1,1195]},{t:4,f:[{p:[57,2,1412],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[58,3,1445],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[59,5,1480],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[62,5,1538],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[65,5,1595],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[67,5,1639],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[69,5,1683],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[74,4,1785],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[75,5,1820],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[76,6,1849]}]}," ",{p:[78,5,1879],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[79,6,1922]}]}," ",{p:[81,5,1954],t:7,e:"section",a:{"class":"cell"},f:[{p:[82,6,1983],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[82,19,1996]}],placeholder:"###","class":"number"}}]}," ",{p:[84,5,2063],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[85,6,2106],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[85,60,2160]}],params:['{ "id" : ',{t:2,r:"id",p:[85,115,2215]},', "sheets" : ',{t:2,r:"sheets",p:[85,134,2234]}," }"]},f:["Release"]}]}," ",{p:[89,5,2305],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[90,6,2348]}]}]}],n:52,r:"data.materials",p:[73,3,1756]}," ",{t:4,f:[{p:[95,4,2431],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[96,5,2466],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[97,6,2495]}]}," ",{p:[99,5,2525],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[100,6,2568]}]}," ",{p:[102,5,2600],t:7,e:"section",a:{"class":"cell"},f:[{p:[103,6,2629],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[103,19,2642]}],placeholder:"###","class":"number"}}]}," ",{p:[105,5,2709],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[106,6,2752],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[106,58,2804]}],params:['{ "id" : ',{t:2,r:"id",p:[106,114,2860]},', "sheets" : ',{t:2,r:"sheets",p:[106,133,2879]}," }"]},f:["Smelt"]}]}," ",{p:[110,5,2947],t:7,e:"section",a:{"class":"cell",align:"right"},f:[]}]}],n:52,r:"data.alloys",p:[94,3,2405] +}]}],n:50,x:{r:["data.materials","data.alloys"],s:"_0||_1"},p:[56,1,1372]}]},e.exports=a.extend(r.exports)},{341:341}],435:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,4,87],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[4,36,119]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[7,4,231],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[7,35,262]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[10,4,358],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[10,35,389]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[15,4,528],t:7,e:"ui-section",f:[{t:4,f:[{p:[17,6,578],t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[16,5,546]},{t:4,n:51,f:[{p:[19,6,644],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[21,8,712],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[21,38,742]}]}," ",{p:[22,8,782],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[22,39,813]}]}],n:50,r:"data.has_blood",p:[20,7,681]},{t:4,n:51,f:[{p:[24,8,870],t:7,e:"ui-section",f:[{p:[25,9,892],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[14,3,500]},{t:4,n:51,f:[{p:[32,4,1054],t:7,e:"ui-section",f:[{p:[33,5,1072],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[38,3,1188],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[43,8,1343],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[43,64,1399]}],params:['{"index": ',{t:2,r:"index",p:[43,116,1451]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[42,7,1320]}," ",{p:[47,7,1538],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[47,69,1600]}],params:['{"index": ',{t:2,r:"index",p:[47,124,1655]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,24,1269]}],button:0},f:[" ",{p:[51,6,1749],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[51,40,1783]}]}," ",{p:[52,6,1812],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[52,38,1844]}]}," ",{p:[53,6,1879],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[53,33,1906]}]}," ",{p:[54,6,1936],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[54,40,1970]}]}," ",{t:4,f:[{p:[56,7,2021],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[58,9,2087],t:7,e:"ui-button",a:{action:"symptom_details",state:"",params:['{"picked_symptom": ',{t:2,r:"sym_index",p:[58,81,2159]},', "index": ',{t:2,r:"index",p:[58,105,2183]},"}"]},f:[{t:2,r:"name",p:[59,10,2206]}," "]},{p:[60,21,2236],t:7,e:"br"}],n:52,r:"symptoms",p:[57,8,2059]}]}," ",{p:[63,7,2289],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[63,38,2320]}]}," ",{p:[64,7,2355],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[64,35,2383]}]}," ",{p:[65,7,2415],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[65,39,2447]}]}," ",{p:[66,7,2483],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[66,44,2520]}]}],n:50,r:"is_adv",p:[55,6,1999]}]}],n:52,r:"data.viruses",p:[39,4,1222]},{t:4,n:51,f:[{p:[70,5,2601],t:7,e:"ui-section",f:[{p:[71,6,2620],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[75,3,2743],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[77,5,2811],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[77,24,2830]}]},f:[{p:[78,7,2848],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[78,43,2884]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[78,129,2970]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[76,4,2779]},{t:4,n:51,f:[{p:[83,5,3067],t:7,e:"ui-section",f:[{p:[84,6,3086],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[37,2,1162]}],n:50,x:{r:["data.mode"],s:"_0==1"},p:[1,1,0]},{t:4,n:51,f:[{p:[90,2,3231],t:7,e:"ui-button",a:{icon:"undo",state:"",action:"back"},f:["Back"]}," ",{t:4,f:[{p:[94,4,3330],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[94,23,3349]}]},f:[{p:[95,4,3364],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[96,5,3382]}," ",{t:4,f:[{p:[98,5,3417],t:7,e:"br"}," ",{p:[99,5,3428],t:7,e:"b",f:["This symptom has been neutered, and has no effect. It will still affect the virus' statistics."]}],n:50,r:"neutered",p:[97,4,3395]}]}," ",{p:[102,4,3564],t:7,e:"ui-section",f:[{p:[103,5,3582],t:7,e:"ui-section",a:{label:"Level"},f:[{t:2,r:"level",p:[103,31,3608]}]}," ",{p:[104,5,3636],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[104,36,3667]}]}," ",{p:[105,5,3700],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[105,33,3728]}]}," ",{p:[106,5,3758],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[106,37,3790]}]}," ",{p:[107,5,3824],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[107,42,3861]}]}]}," ",{p:[109,4,3913],t:7,e:"ui-subdisplay",a:{title:"Effect Thresholds"},f:[{p:[110,5,3960],t:7,e:"ui-section",f:[{t:3,r:"threshold_desc",p:[110,17,3972]}]}]}]}],n:53,r:"data.symptom",p:[93,2,3303]}],x:{r:["data.mode"],s:"_0==1"}}]},e.exports=a.extend(r.exports)},{341:341}],436:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(484);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{341:341,484:484}],437:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{341:341}],438:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[3,1,69],t:7,e:"ui-notice",f:[{p:[4,3,84],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[4,23,104]}," connected to a tank."]}]}," ",{p:[6,1,182],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[7,3,220],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[8,5,255],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[8,11,261]}," kPa"]}]}," ",{p:[10,3,323],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[11,5,354],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[11,18,367]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[11,59,408]}]}]}]}," ",{p:[14,1,499],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[15,3,530],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,579]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[17,14,630]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,687]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[24,7,856],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[24,38,887]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[23,5,828]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[28,3,1007],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[29,4,1038]}]}," ",{p:[31,3,1080],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[32,4,1114]}," kPa"]}],n:50,r:"data.holding",p:[27,3,983]},{t:4,n:51,f:[{p:[35,3,1188],t:7,e:"ui-section",f:[{p:[36,4,1205],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}," ",{p:[40,1,1293],t:7,e:"ui-display",a:{title:"Filters"},f:[{t:4,f:[{p:[42,5,1345],t:7,e:"filters"}],n:53,r:"data",p:[41,3,1325]}]}]},r.exports.components=r.exports.components||{};var i={filters:t(457)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,457:457}],439:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}]}]}," ",{p:[52,5,1464],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1499],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1505]}]}]}],r:"config.fancy"}]}," ",{p:[57,1,1574],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1604],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1629],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1666],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1705],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1742],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1781],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1823],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1864],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1949],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1968]}],nowrap:0},f:[{p:[69,7,1993],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2014]}," %"]}," ",{p:[70,7,2072],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[70,28,2093]}]}," ",{p:[71,7,2135],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2156],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2169]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2198]}]}]}," ",{p:[72,7,2245],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2266],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2279]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2302]}," [",{p:[72,87,2325],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2331]}]},"]"]}]}," ",{p:[73,7,2380],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2401],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2414]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2437]}," [",{p:[73,87,2460],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2466]}]},"]"]}]}," ",{p:[74,7,2515],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2536],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2549]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2572]}," [",{p:[74,87,2595],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2601]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1923]}]}]},e.exports=a.extend(r.exports)},{341:341}],440:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=a.extend(r.exports)},{341:341}],441:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," "," "," "," "," "," ",{p:[11,1,560],t:7,e:"rdheader"}," ",{t:4,f:[{p:[13,2,595],t:7,e:"ui-display",a:{title:"CONSOLE LOCKED"},f:[{p:[14,3,634],t:7,e:"ui-button",a:{action:"Unlock"},f:["Unlock"]}]}],n:50,r:"data.locked",p:[12,1,573]},{t:4,f:[{p:[18,2,729],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[18,17,744]}]},f:[{p:[19,3,763],t:7,e:"tab",a:{name:"Technology"},f:[{p:[20,4,791],t:7,e:"techweb"}]}," ",{p:[22,3,815],t:7,e:"tab",a:{name:"View Node"},f:[{p:[23,4,842],t:7,e:"nodeview"}]}," ",{p:[25,3,867],t:7,e:"tab",a:{name:"View Design"},f:[{p:[26,4,896],t:7,e:"designview"}]}," ",{p:[28,3,923],t:7,e:"tab",a:{name:"Disk Operations - Design"},f:[{p:[29,4,965],t:7,e:"diskopsdesign"}]}," ",{p:[31,3,995],t:7,e:"tab",a:{name:"Disk Operations - Technology"},f:[{p:[32,4,1041],t:7,e:"diskopstech"}]}," ",{p:[34,3,1069],t:7,e:"tab",a:{name:"Deconstructive Analyzer"},f:[{p:[35,4,1110],t:7,e:"destruct"}]}," ",{p:[37,3,1135],t:7,e:"tab",a:{name:"Protolathe"},f:[{p:[38,4,1163],t:7,e:"protolathe"}]}," ",{p:[40,3,1190],t:7,e:"tab",a:{name:"Circuit Imprinter"},f:[{p:[41,4,1225],t:7,e:"circuit"}]}," ",{p:[43,3,1249],t:7,e:"tab",a:{name:"Settings"},f:[{p:[44,4,1275],t:7,e:"settings"}]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[17,1,706]}]},r.exports.components=r.exports.components||{};var i={settings:t(450),circuit:t(442),protolathe:t(448),destruct:t(444),diskopsdesign:t(445),diskopstech:t(446),designview:t(443),nodeview:t(447),techweb:t(451),rdheader:t(449)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451}],442:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,58],t:7,e:"ui-display",a:{title:"Circuit Imprinter Busy!"}}],n:50,r:"data.circuitbusy",p:[2,2,30]},{t:4,n:51,f:[{p:[5,3,130],t:7,e:"ui-display",f:[{p:[6,4,147],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,189],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,202]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,261],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "circuit", "inputText" : ',{t:2,r:"textsearch",p:[8,84,340]},"}"]},f:["Search"]}]}," ",{p:[10,4,398],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.circuitmats",p:[10,27,421]}," / ",{t:2,r:"data.circuitmaxmats",p:[10,50,444]}]}," ",{p:[11,4,485],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.circuitchems",p:[11,26,507]}," / ",{t:2,r:"data.circuitmaxchems",p:[11,50,531]}]}," ",{p:[12,3,572],t:7,e:"ui-display",f:[{p:[14,3,590],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,605]}]},f:[{p:[15,4,631],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,696],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.circuitcat"],s:'_0=="{{name}}"?"selected":null'},p:[17,43,733]}],params:['{"type" : "circuit", "cat" : "',{t:2,r:"name",p:[17,135,825]},'"}']},f:[{t:2,r:"name",p:[17,147,837]}]}],n:52,r:"data.circuitcats",p:[16,5,663]}]}," ",{p:[20,4,888],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,956],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,968]},{t:2,r:"matstring",p:[22,26,976]}," ",{p:[23,7,997],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[23,40,1030]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[23,119,1109]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitdes",p:[21,5,924]}]}," ",{p:[27,4,1187],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[29,6,1254],t:7,e:"ui-section",f:[{t:2,r:"name",p:[29,18,1266]},{t:2,r:"matstring",p:[29,26,1274]}," ",{p:[30,7,1295],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[30,40,1328]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[30,119,1407]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitmatch",p:[28,5,1220]}]}," ",{p:[34,4,1485],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[36,6,1550],t:7,e:"ui-section",f:[{t:2,r:"name",p:[36,18,1562]}," : ",{t:2,r:"amount",p:[36,29,1573]}," cm3 - ",{t:4,f:[{p:[38,7,1623],t:7,e:"input",a:{value:[{t:2,r:"number",p:[38,20,1636]}],placeholder:["1-",{t:2,r:"sheets",p:[38,46,1662]}],"class":"number"}}," ",{p:[39,7,1698],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "circuit", "mat_id" : ',{t:2,r:"mat_id",p:[39,84,1775]},', "sheets" : ',{t:2,r:"number",p:[39,107,1798]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[37,6,1597]}]}],n:52,r:"data.circuitmat_list",p:[35,5,1513]}]}," ",{p:[44,4,1895],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[46,6,1961],t:7,e:"ui-section",f:[{t:2,r:"name",p:[46,18,1973]}," : ",{t:2,r:"amount",p:[46,29,1984]}," - ",{p:[47,7,2005],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "circuit", "name" : ',{t:2,r:"name",p:[47,80,2078]},', "id" : ',{t:2,r:"reagentid",p:[47,97,2095]},"}"]},f:["Purge"]}]}],n:52,r:"data.circuitchem_list",p:[45,5,1923]}]}]}]}]}],r:"data.circuitbusy"}],n:50,r:"data.circuit_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[55,2,2216],t:7,e:"ui-display",a:{title:"No Linked Circuit Imprinter"}}],r:"data.circuit_linked"}]},e.exports=a.extend(r.exports)},{341:341}],443:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:[{t:2,r:"data.sdesign_name",p:[2,21,50]}]},f:[{p:[3,3,77],t:7,e:"ui-section",a:{title:"Description"},f:[{t:2,r:"data.sdesign_desc",p:[3,35,109]}]}]}," ",{p:[5,2,162],t:7,e:"ui-display",a:{title:"Lathe Types"},f:[{t:4,f:[{p:[7,4,239],t:7,e:"ui-section",a:{title:"Circuit Imprinter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&1"},p:[6,3,198]}," ",{t:4,f:[{p:[10,4,346],t:7,e:"ui-section",a:{title:"Protolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&2"},p:[9,3,305]}," ",{t:4,f:[{p:[13,4,446],t:7,e:"ui-section",a:{title:"Autolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&4"},p:[12,3,405]}," ",{t:4,f:[{p:[16,4,545],t:7,e:"ui-section",a:{title:"Crafting Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&8"},p:[15,3,504]}," ",{t:4,f:[{p:[19,4,655],t:7,e:"ui-section",a:{title:"Exosuit Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&16"},p:[18,3,613]}," ",{t:4,f:[{p:[22,4,764],t:7,e:"ui-section",a:{title:"Biogenerator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&32"},p:[21,3,722]}," ",{t:4,f:[{p:[25,4,867],t:7,e:"ui-section",a:{title:"Limb Grower"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&64"},p:[24,3,825]}," ",{t:4,f:[{p:[28,4,970],t:7,e:"ui-section",a:{title:"Ore Smelter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&128"},p:[27,3,927]}]}," ",{p:[31,2,1045],t:7,e:"ui-display",a:{title:"Materials"},f:[{t:4,f:[{p:[33,4,1116],t:7,e:"ui-section",a:{title:[{t:2,r:"matname",p:[33,23,1135]}]},f:[{t:2,r:"matamt",p:[33,36,1148]}," cm^3"]}],n:52,r:"data.sdesign_materials",p:[32,3,1079]}]}],n:50,r:"data.design_selected",p:[1,1,0]},{t:4,f:[{p:[38,2,1248],t:7,e:"ui-display",a:{title:"No Design Selected."}}],n:50,x:{r:["data.design_selected"],s:"!_0"},p:[37,1,1216]}]},e.exports=a.extend(r.exports)},{341:341}],444:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[4,3,60],t:7,e:"ui-display",a:{title:"Destructive Analyzer Busy!"}}],n:50,r:"data.destroybusy",p:[3,2,32]},{t:4,n:51,f:[{t:4,f:[{p:[7,4,168],t:7,e:"ui-display",a:{title:"Destructive Analyzer Unloaded"}}],n:50,x:{r:["data.destroy_loaded"],s:"!_0"},p:[6,3,135]},{t:4,n:51,f:[{p:[9,4,248],t:7,e:"ui-display",a:{title:"Loaded Item"},f:[{p:[10,4,285],t:7,e:"ui-section",a:{title:"Name"},f:[{t:2,r:"data.destroy_name",p:[10,29,310]}]}]}," ",{p:[12,4,367],t:7,e:"ui-display",a:{title:"Boost Nodes"},f:[{t:4,f:[{p:[14,6,438],t:7,e:"ui-section",a:{title:[{t:2,r:"name",p:[14,25,457]}," | ",{t:2,r:"value",p:[14,36,468]}]},f:[{p:[15,7,487],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["allow"],s:'_0?null:"disabled"' +},p:[15,25,505]}],action:"deconstruct",params:['{"id":',{t:2,r:"id",p:[15,90,570]},"}"]},f:["Deconstruct and Boost"]}]}],n:52,r:"data.boost_paths",p:[13,5,405]}]}," ",{p:[19,4,670],t:7,e:"ui-button",a:{action:"eject_da"},f:["Eject Item"]}],x:{r:["data.destroy_loaded"],s:"!_0"}}],r:"data.destroybusy"}],n:50,r:"data.destroy_linked",p:[2,1,2]},{t:4,n:51,f:[{p:[23,2,755],t:7,e:"ui-display",a:{title:"No Linked Destructive Analyzer"}}],r:"data.destroy_linked"}]},e.exports=a.extend(r.exports)},{341:341}],445:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Design Disk Loaded"}}],n:50,x:{r:["data.ddisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,121],t:7,e:"ui-display",a:{title:"Design Disk Updating"}}],n:50,r:"data.ddisk_update",p:[5,2,92]},{t:4,n:51,f:[{t:4,f:[{p:[9,4,221],t:7,e:"ui-display",a:{title:"Design Disk"},f:[{p:[10,5,259],t:7,e:"ui-section",a:{title:"Disk Space"},f:["Disk Capacity: ",{t:2,r:"data.ddisk_size",p:[10,51,305]}," blueprints."]}," ",{p:[11,5,355],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[11,33,383],t:7,e:"ui-button",a:{action:"ddisk_upall"},f:["Upload all designs"]}]}," ",{p:[12,5,464],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[12,36,495],t:7,e:"ui-button",a:{action:"clear_designdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[13,5,591],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[13,36,622],t:7,e:"ui-button",a:{action:"eject_designdisk"},f:["Eject Disk"]}]}]}," ",{p:[15,4,717],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[17,6,792],t:7,e:"ui-section",a:{title:"Number"},f:["#",{t:2,r:"pos",p:[17,34,820]},": ",{t:4,f:[{p:[19,8,866],t:7,e:"ui-button",a:{action:"upload_empty_ddisk_slot",params:['{"slot": "',{t:2,r:"pos",p:[19,70,928]},'"}']},f:["Upload to Empty Slot"]}],n:50,x:{r:["id"],s:'_0=="null"'},p:[18,7,837]},{t:4,n:51,f:[{p:[21,8,996],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[21,58,1046]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[21,75,1063]}]},f:[{t:2,r:"name",p:[21,122,1110]}]}," ",{p:[22,8,1139],t:7,e:"ui-button",a:{action:"ddisk_erasepos",style:"danger",params:['{"id": "',{t:2,r:"id",p:[22,74,1205]},'"}'],state:[{t:2,x:{r:["id"],s:'_0=="null"?"disabled":null'},p:[22,91,1222]}]},f:["Delete Slot"]}],x:{r:["id"],s:'_0=="null"'}}]}],n:52,r:"data.ddisk_designs",p:[16,5,757]}]}],n:50,x:{r:["data.ddisk_upload"],s:"!_0"},p:[8,3,190]},{t:4,n:51,f:[{p:[28,4,1367],t:7,e:"ui-display",a:{title:"Upload Design to Disk"},f:[{p:[28,46,1409],t:7,e:"ui-section",f:["Available Designs:"]}]}," ",{t:4,f:[{p:[30,5,1513],t:7,e:"ui-section",f:[{p:[30,17,1525],t:7,e:"ui-button",a:{action:"ddisk_uploaddesign",params:['{"id": "',{t:2,r:"id",p:[30,72,1580]},'"}']},f:[{t:2,r:"name",p:[30,82,1590]}]}]}],n:52,r:"data.ddisk_possible_designs",p:[29,4,1470]}],x:{r:["data.ddisk_upload"],s:"!_0"}}],r:"data.ddisk_update"}],x:{r:["data.ddisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],446:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Technology Disk Loaded"}}],n:50,x:{r:["data.tdisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,125],t:7,e:"ui-display",a:{title:"Technology Disk Updating"}}],n:50,r:"data.tdisk_update",p:[5,2,96]},{t:4,n:51,f:[{p:[8,3,198],t:7,e:"ui-display",a:{title:"Technology Disk"},f:[{p:[9,4,239],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[9,32,267],t:7,e:"ui-button",a:{action:"tdisk_down"},f:["Download Research to Disk"]},{p:[9,100,335],t:7,e:"ui-button",a:{action:"tdisk_up"},f:["Upload Research from Disk"]}," ",{p:[10,4,406],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[10,35,437],t:7,e:"ui-button",a:{action:"clear_techdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[11,4,530],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[11,35,561],t:7,e:"ui-button",a:{action:"eject_techdisk"},f:["Eject Disk"]}]}]}]}," ",{p:[13,3,652],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[15,5,723],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,53,771]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,70,788]}]},f:[{t:2,r:"display_name",p:[15,115,833]}]}],n:52,r:"data.tdisk_nodes",p:[14,4,691]}]}],r:"data.tdisk_update"}],x:{r:["data.tdisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{341:341}],447:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,29],t:7,e:"ui-display",a:{title:[{t:2,r:"data.snode_name",p:[2,21,48]}]},f:[{p:[3,3,73],t:7,e:"ui-section",a:{title:"Description"},f:["Description: ",{t:2,r:"data.snode_desc",p:[3,48,118]}]}," ",{p:[4,3,154],t:7,e:"ui-section",a:{title:"Point Cost"},f:["Point Cost: ",{t:2,r:"data.snode_cost",p:[4,46,197]}]}," ",{p:[5,3,233],t:7,e:"ui-section",a:{title:"Export Price"},f:["Export Price: ",{t:2,r:"data.snode_export",p:[5,50,280]}]}," ",{p:[6,3,318],t:7,e:"ui-button",a:{action:"research_node",params:['{"id"="',{t:2,r:"id",p:[6,52,367]},'"}'],state:[{t:2,x:{r:["data.snode_researched"],s:'_0?"disabled":null'},p:[6,69,384]}]},f:[{t:2,x:{r:["data.snode_researched"],s:'_0?"Researched":"Research Node"'},p:[6,115,430]}]}]}," ",{p:[8,2,518],t:7,e:"ui-display",a:{title:"Prerequisites"},f:[{t:4,f:[{p:[10,4,588],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[10,52,636]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[10,69,653]}]},f:[{t:2,r:"display_name",p:[10,114,698]}]}],n:52,r:"data.node_prereqs",p:[9,3,556]}]}," ",{p:[13,2,759],t:7,e:"ui-display",a:{title:"Unlocks"},f:[{t:4,f:[{p:[15,4,823],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,52,871]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,69,888]}]},f:[{t:2,r:"display_name",p:[15,114,933]}]}],n:52,r:"data.node_unlocks",p:[14,3,791]}]}," ",{p:[18,2,994],t:7,e:"ui-display",a:{title:"Designs"},f:[{t:4,f:[{p:[20,4,1058],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[20,54,1108]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[20,71,1125]}]},f:[{t:2,r:"name",p:[20,118,1172]}]}],n:52,r:"data.node_designs",p:[19,3,1026]}]}],n:50,r:"data.node_selected",p:[1,1,0]},{t:4,f:[{p:[25,2,1263],t:7,e:"ui-display",a:{title:"No Node Selected."}}],n:50,x:{r:["data.node_selected"],s:"!_0"},p:[24,1,1233]}]},e.exports=a.extend(r.exports)},{341:341}],448:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,59],t:7,e:"ui-display",a:{title:"Protolathe Busy!"}}],n:50,r:"data.protobusy",p:[2,2,33]},{t:4,n:51,f:[{p:[5,3,124],t:7,e:"ui-display",f:[{p:[6,4,141],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,183],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,196]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,255],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "proto", "inputText" : ',{t:2,r:"textsearch",p:[8,82,332]},"}"]},f:["Search"]}]}," ",{p:[10,4,390],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.protomats",p:[10,27,413]}," / ",{t:2,r:"data.protomaxmats",p:[10,48,434]}]}," ",{p:[11,4,473],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.protochems",p:[11,26,495]}," / ",{t:2,r:"data.protomaxchems",p:[11,48,517]}]}," ",{p:[12,3,556],t:7,e:"ui-display",f:[{p:[14,3,574],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,589]}]},f:[{p:[15,4,615],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,678],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.protocat","name"],s:'_0==_1?"selected":null'},p:[17,43,715]}],params:['{"type" : "proto", "cat" : "',{t:2,r:"name",p:[17,125,797]},'"}']},f:[{t:2,r:"name",p:[17,137,809]}]}],n:52,r:"data.protocats",p:[16,5,647]}]}," ",{p:[20,4,860],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,926],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,938]},{t:2,r:"matstring",p:[22,26,946]}," ",{t:4,f:[{p:[24,8,996],t:7,e:"input",a:{value:[{t:2,r:"number",p:[24,21,1009]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[24,47,1035]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[23,7,967]}," ",{p:[26,7,1108],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[26,40,1141]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[26,117,1218]},'", "amount" : "',{t:2,r:"number",p:[26,138,1239]},'"}']},f:["Print"]}]}],n:52,r:"data.protodes",p:[21,5,896]}]}," ",{p:[30,4,1321],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[32,6,1386],t:7,e:"ui-section",f:[{t:2,r:"name",p:[32,18,1398]},{t:2,r:"matstring",p:[32,26,1406]}," ",{t:4,f:[{p:[34,8,1456],t:7,e:"input",a:{value:[{t:2,r:"number",p:[34,21,1469]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[34,47,1495]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[33,7,1427]}," ",{p:[36,7,1568],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[36,40,1601]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[36,117,1678]},'", "amount" : "',{t:2,r:"number",p:[36,138,1699]},'"}']},f:["Print"]}]}],n:52,r:"data.protomatch",p:[31,5,1354]}]}," ",{p:[40,4,1781],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[42,6,1844],t:7,e:"ui-section",f:[{t:2,r:"name",p:[42,18,1856]}," : ",{t:2,r:"amount",p:[42,29,1867]}," cm3 - ",{t:4,f:[{p:[44,7,1917],t:7,e:"input",a:{value:[{t:2,r:"number",p:[44,20,1930]}],placeholder:["1-",{t:2,r:"sheets",p:[44,46,1956]}],"class":"number"}}," ",{p:[45,7,1992],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "proto", "mat_id" : ',{t:2,r:"mat_id",p:[45,82,2067]},', "sheets" : ',{t:2,r:"number",p:[45,105,2090]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[43,6,1891]}]}],n:52,r:"data.protomat_list",p:[41,5,1809]}]}," ",{p:[50,4,2187],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[52,6,2251],t:7,e:"ui-section",f:[{t:2,r:"name",p:[52,18,2263]}," : ",{t:2,r:"amount",p:[52,29,2274]}," - ",{p:[53,7,2295],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "proto", "name" : ',{t:2,r:"name",p:[53,78,2366]},', "id" : ',{t:2,r:"reagentid",p:[53,95,2383]},"}"]},f:["Purge"]}]}],n:52,r:"data.protochem_list",p:[51,5,2215]}]}]}]}]}],r:"data.protobusy"}],n:50,r:"data.protolathe_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[61,2,2504],t:7,e:"ui-display",a:{title:"No Linked Protolathe"}}],r:"data.protolathe_linked"}]},e.exports=a.extend(r.exports)},{341:341}],449:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,1,14],t:7,e:"span",a:{"class":"memoedit"},f:["Nanotrasen R&D Console"]},{p:[2,53,66],t:7,e:"br"}," Available Points: ",{p:[3,19,91],t:7,e:"ui-section",a:{title:"Research Points"},f:[{t:2,r:"data.research_points_stored",p:[3,55,127]}]}," ",{p:[4,1,173],t:7,e:"ui-section",a:{title:["Page Selection - ",{t:2,r:"page",p:[4,37,209]}]},f:[{p:[4,47,219],t:7,e:"input",a:{value:[{t:2,r:"pageselect",p:[4,60,232]}],placeholder:"1","class":"number"}}," Select Page: ",{p:[5,14,294],t:7,e:"ui-button",a:{action:"page",params:['{"num" : "',{t:2,r:"pageselect",p:[5,57,337]},'"}']},f:["[Go]"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],450:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"span",a:{"class":"bad"},f:["Settings"]},{p:[1,34,33],t:7,e:"br"},{p:[1,39,38],t:7,e:"br"}," ",{p:[2,1,45],t:7,e:"ui-button",a:{action:"Resync"},f:["RESYNC MACHINERY"]},{p:[2,56,100],t:7,e:"br"}," ",{p:[3,1,107],t:7,e:"ui-button",a:{action:"Lock"},f:["LOCK"]}," ",{p:[4,1,150],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "destroy"}',state:[{t:2,x:{r:["data.destroy_linked"],s:'_0?null:"disabled"'},p:[4,71,220]}]},f:["Disconnect Destructive Analyzer"]}," ",{p:[5,1,309],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "lathe"}',state:[{t:2,x:{r:["data.protolathe_linked"],s:'_0?null:"disabled"'},p:[5,69,377]}]},f:["Disconnect Protolathe"]}," ",{p:[6,1,459],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "imprinter"}',state:[{t:2,x:{r:["data.circuit_linked"],s:'_0?null:"disabled"'},p:[6,73,531]}]},f:["Disconnect Circuit Imprinter"]}]},e.exports=a.extend(r.exports)},{341:341}],451:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Available for Research"},f:[{t:4,f:[{p:[3,3,78],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[3,51,126]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[3,68,143]}]},f:[{t:2,r:"display_name",p:[3,113,188]}]}],n:52,r:"data.techweb_avail",p:[2,2,46]}]}," ",{p:[6,1,245],t:7,e:"ui-display",a:{title:"Locked Nodes"},f:[{t:4,f:[{p:[8,3,314],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[8,51,362]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[8,68,379]}]},f:[{t:2,r:"display_name",p:[8,113,424]}]}],n:52,r:"data.techweb_locked",p:[7,2,281]}]}," ",{p:[11,1,482],t:7,e:"ui-display",a:{title:"Researched Nodes"},f:[{t:4,f:[{p:[13,3,559],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[13,51,607]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[13,68,624]}]},f:[{t:2,r:"display_name",p:[13,113,669]}]}],n:52,r:"data.techweb_researched",p:[12,2,522]}]}]},e.exports=a.extend(r.exports)},{341:341}],452:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,25],t:7,e:"ui-notice",f:[{p:[3,3,40],t:7,e:"span",f:["The grinder is currently processing and cannot be used."]}]}],n:50,r:"data.processing",p:[1,1,0]},{p:{button:[{p:[8,5,208],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[8,36,239]}],action:"eject"},f:["Eject Contents"]}]},t:7,e:"ui-display",a:{title:"Processing Chamber",button:0},f:[" ",{p:[10,3,364],t:7,e:"ui-section",a:{label:"Grinding"},f:[{p:[11,5,399],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.operating"],s:'_0?"average":"good"'},p:[11,18,412]}]},f:[{t:2,x:{r:["data.operating"],s:'_0?"Busy":"Ready"'},p:[11,59,453]}]}," ",{p:[12,2,500],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[12,35,533]}],action:"grind"},f:["Activate"]}]}," ",{p:[14,3,653],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[17,9,755],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["The ",{t:2,r:"name",p:[17,56,802]}]},{p:[17,71,817],t:7,e:"br"}],n:52,r:"adata.contentslist",p:[16,7,717]},{t:4,n:51,f:[{p:[19,9,848],t:7,e:"span",f:["No Contents"]}],r:"adata.contentslist"}],n:50,r:"data.contents",p:[15,5,688]},{t:4,n:51,f:[{p:[22,7,911],t:7,e:"span",f:["No Contents"]}],r:"data.contents"}]}]}," ",{p:{button:[{p:[28,5,1047],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.isBeakerLoaded"],s:'(_0==0)&&_1?null:"disabled"'},p:[28,36,1078]}],action:"detach"},f:["Detach"]}]},t:7,e:"ui-display",a:{title:"Container",button:0},f:[" ",{p:[30,3,1202],t:7,e:"ui-section",a:{label:"Reagents"},f:[{t:4,f:[{p:[32,7,1272],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[32,13,1278]},"/",{t:2,r:"data.beakerMaxVolume",p:[32,55,1320]}," Units"]}," ",{p:[33,7,1365],t:7,e:"br"}," ",{t:4,f:[{p:[35,9,1418],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[35,52,1461]}," units of ",{t:2,r:"name",p:[35,87,1496]}]},{p:[35,102,1511],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[34,7,1378]},{t:4,n:51,f:[{p:[37,9,1542],t:7,e:"span",a:{"class":"bad"},f:["Container Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[31,5,1237]},{t:4,n:51,f:[{p:[40,7,1621],t:7,e:"span",a:{"class":"average"},f:["No Container"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],453:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"span",a:{"class":["pipes32x32 ",{t:2,r:"dir",p:[6,80,253]},"-",{t:2,r:"icon_state",p:[6,88,261]}],title:[{t:2,r:"dir_name",p:[6,111,284]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}," ",{t:4,f:[{p:[12,2,406],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[14,4,468],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["@key","data.selected_color"],s:'_0==_1?"selected":null'},p:[14,22,486]}],action:"color",params:['{"paint_color": ',{t:2,r:"@key",p:[15,44,583]},"}"]},f:[{t:2,r:"@key",p:[15,55,594]}]}],n:52,r:"data.paint_colors",p:[13,3,436]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[11,1,377]},{p:[19,1,654],t:7,e:"ui-display",a:{title:"Utilities"},f:[{p:[20,2,687],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&1?"check-square-o":"square-o"'},p:[20,19,704]}],action:"mode",params:'{"mode": 1}'},f:["Build"]}," ",{p:[22,2,813],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&2?"check-square-o":"square-o"'},p:[22,19,830]}],action:"mode",params:'{"mode": 2}'},f:["Wrench"]}," ",{p:[24,2,940],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&4?"check-square-o":"square-o"'},p:[24,19,957]}],action:"mode",params:'{"mode": 4}'},f:["Destroy"]}," ",{t:4,f:[{p:[27,3,1098],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0&8?"check-square-o":"square-o"'},p:[27,20,1115]}],action:"mode",params:'{"mode": 8}'},f:["Paint"]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[26,2,1068]}]}," ",{p:[31,1,1249],t:7,e:"ui-display",a:{title:"Category"},f:[{p:[32,2,1281],t:7,e:"ui-section",f:[{p:[33,3,1297],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==0?"check-square-o":"square-o"'},p:[33,20,1314]}],state:[{t:2,x:{r:["data.category"],s:'_0<=0?"selected":null'},p:[33,83,1377]}],action:"category",params:'{"category": 0}'},f:["Atmospherics"]}," ",{p:[35,3,1496],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==1?"check-square-o":"square-o"'},p:[35,20,1513]}],state:[{t:2,x:{r:["data.category"],s:'_0==1?"selected":null'},p:[35,83,1576]}],action:"category",params:'{"category": 1}'},f:["Disposals"]}," ",{p:[37,3,1692],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.category"],s:'_0==2?"check-square-o":"square-o"'},p:[37,20,1709]}],state:[{t:2,x:{r:["data.category"],s:'_0==2?"selected":null'},p:[37,83,1772]}],action:"category",params:'{"category": 2}'},f:["Transit Tubes"]}]}," ",{t:4,f:[{p:[41,3,1937],t:7,e:"ui-section",a:{label:"Piping Layer"},f:[{p:[42,4,1975],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==1?"selected":null'},p:[42,22,1993]}],action:"piping_layer",params:'{"piping_layer": 1}'},f:["1"]}," ",{p:[44,4,2115],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==2?"selected":null'},p:[44,22,2133]}],action:"piping_layer",params:'{"piping_layer": 2}'},f:["2"]}," ",{p:[46,4,2255],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==3?"selected":null'},p:[46,22,2273]}],action:"piping_layer",params:'{"piping_layer": 3}'},f:["3"]}]}],n:50,x:{r:["data.category"],s:"_0==0"},p:[40,2,1907]}]}," ",{t:4,f:[{p:[52,2,2462],t:7,e:"ui-display",a:{title:[{t:2,r:"cat_name",p:[52,21,2481]}]},f:[{t:4,f:[{p:[54,4,2521],t:7,e:"ui-section",f:[{p:[55,5,2539],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[55,23,2557]}],action:"pipe_type",params:['{"pipe_type": ',{t:2,r:"pipe_index",p:[56,28,2638]},', "category": ',{t:2,r:"cat_name",p:[56,56,2666]},"}"]},f:[{t:2,r:"pipe_name",p:[56,71,2681]}]}]}],n:52,r:"recipes",p:[53,3,2499]}]}],n:52,r:"data.categories",p:[51,1,2434]}]},e.exports=a.extend(r.exports)},{341:341}],454:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[3,21,78]}],action:"color",params:['{"paint_color": ',{t:2,r:"color_name",p:[4,28,155]},"}"]},f:[{t:2,r:"color_name",p:[4,45,172]}]}],n:52,r:"data.paint_colors",p:[2,2,29]}]}]},e.exports=a.extend(r.exports)},{341:341}],455:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"img",a:{src:["pipe.",{t:2,r:"dir",p:[6,71,244]},".",{t:2,r:"icon_state",p:[6,79,252]},".png"],title:[{t:2,r:"dir_name",p:[6,106,279]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}]},e.exports=a.extend(r.exports)},{341:341}],456:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{341:341}],457:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,26],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[2,20,43]}],style:[{t:2,x:{r:["enabled"],s:'_0?"selected":null'},p:[2,72,95]}],action:"toggle_filter",params:['{"id_tag": "',{t:2,r:"id_tag",p:[3,48,176]},'", "val": ',{t:2,r:"gas_id",p:[3,68,196]},"}"]},f:[{t:2,r:"gas_name",p:[3,81,209]}]}],n:52,r:"filter_types",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],458:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(459),templates:t(461),status:t(460)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{341:341,459:459,460:460,461:461}],459:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=a.extend(r.exports)},{341:341}],460:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"table",a:{width:"100%"},f:[{t:4,f:[{p:[3,3,49],t:7,e:"tr",f:[{p:[4,5,59],t:7,e:"td",f:[{p:[5,7,71],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[5,69,133]},'"}']},f:["JMP"]}]}," ",{p:[9,5,193],t:7,e:"td",f:[{p:[10,7,205],t:7,e:"ui-button",a:{action:"fly",params:['{"id": "',{t:2,r:"id",p:[10,47,245]},'"}'],state:[{t:2,x:{r:["can_fly"],s:'_0?null:"disabled"'},p:[10,64,262]}]},f:["Fly"]}]}," ",{p:[14,5,345],t:7,e:"td",f:[{t:2,r:"name",p:[15,7,357]}," (",{p:[15,17,367],t:7,e:"code",f:[{t:2,r:"id",p:[15,23,373]}]},")"]}," ",{p:[17,5,404],t:7,e:"td",f:[{t:2,r:"status",p:[18,7,416]}]}," ",{p:[20,5,443],t:7,e:"td",f:[{t:4,f:[{t:2,r:"mode",p:[22,9,477]}],n:50,r:"mode",p:[21,7,455]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[25,10,532]},") ",{p:[26,9,555],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[26,57,603]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[26,74,620]}]},f:["Fast Travel"]}],n:50,r:"timer",p:[24,7,508]}]}]}],n:52,r:"data.shuttles",p:[2,1,22]}]}]},e.exports=a.extend(r.exports)},{341:341}],461:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=a.extend(r.exports)},{341:341}],462:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,186],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,220],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,233]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,262]}]}]}," ",{p:[9,5,315],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[10,7,350],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[10,20,363]}],max:[{t:2,r:"data.occupant.maxHealth",p:[10,54,397]}],value:[{t:2,r:"data.occupant.health",p:[10,90,433]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[11,16,475]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[11,68,527]}]}]}," ",{t:4,f:[{p:[14,7,764],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[14,26,783]}]},f:[{p:[15,9,804],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[15,30,825]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[15,66,861]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[15,103,898]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[13,5,598]}," ",{t:4,f:[{p:[19,7,1020],t:7,e:"ui-section",a:{label:"Blood"},f:[{p:[20,9,1056],t:7,e:"ui-section",a:{label:"Volume"},f:[{p:[21,11,1095],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.blood.maxBloodVolume",p:[21,32,1116]}],value:[{t:2,r:"data.occupant.blood.currentBloodVolume",p:[21,79,1163]}],state:[{t:2,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"bad":"good"'},p:[21,130,1214]}]},f:[{t:3,x:{r:["data.occupant.blood.currentBloodVolume","data.occupant.blood.dangerBloodVolume"],s:'_0<=_1?"LOW":"OK"'},p:[21,232,1316]}," - ",{t:2,x:{r:["data.occupant.blood.currentBloodVolume"],s:"Math.round(_0)"},p:[21,342,1426]}," cl"]}]}," ",{p:[23,9,1525],t:7,e:"ui-section",a:{label:"Type"},f:[{p:[24,11,1562],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:"data.occupant.blood.bloodType",p:[24,35,1586]}]}]}]}],n:50,r:"data.occupant.blood",p:[18,5,985]}," ",{p:[28,5,1689],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[29,9,1725],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[29,22,1738]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[29,68,1784]}]}]}," ",{p:[31,5,1867],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[32,9,1903],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[32,22,1916]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[32,68,1962]}]}]}," ",{p:[34,5,2046],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[36,11,2133],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[36,54,2176]}," units of ",{t:2,r:"name",p:[36,89,2211]}]},{p:[36,104,2226],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[35,9,2088]},{t:4,n:51,f:[{p:[38,11,2261],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[5,3,159]}]}," ",{p:[43,1,2357],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[44,2,2389],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[45,5,2420],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[45,22,2437]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[45,71,2486]}]}]}," ",{p:[47,3,2551],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[49,7,2612],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[49,38,2643]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[49,122,2727]},'"}']},f:[{t:2,r:"name",p:[49,132,2737]}]},{p:[49,152,2757],t:7,e:"br"}],n:52,r:"data.chems",p:[48,5,2584]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],463:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"' +},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:4,f:["You Are Here"],n:50,x:{r:["occupied"],s:'_0=="owner"'},p:[10,7,491]},{t:4,n:51,f:[{t:4,f:["Occupied"],n:50,x:{r:["occupied"],s:'_0=="stranger"'},p:[13,9,566]},{t:4,n:51,f:["Swap"],x:{r:["occupied"],s:'_0=="stranger"'}}],x:{r:["occupied"],s:'_0=="owner"'}}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],464:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,23,82],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.drying"],s:'_0?"stop":"tint"'},p:[4,40,99]}],action:"Dry"},f:[{t:2,x:{r:["data.drying"],s:'_0?"Stop drying":"Dry"'},p:[4,88,147]}]}],n:50,r:"data.isdryer",p:[4,3,62]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[7,3,258],t:7,e:"ui-notice",f:[{p:[8,5,275],t:7,e:"span",f:["Unfortunately, this ",{t:2,r:"data.name",p:[8,31,301]}," is empty."]}]}],n:50,x:{r:["data.contents.length"],s:"_0==0"},p:[6,1,221]},{t:4,n:51,f:[{p:[11,1,359],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[12,2,391],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[13,4,425],t:7,e:"section",a:{"class":"cell bold"},f:["Item"]}," ",{p:[16,4,482],t:7,e:"section",a:{"class":"cell bold"},f:["Quantity"]}," ",{p:[19,4,543],t:7,e:"section",a:{"class":"cell bold",align:"center"},f:[{t:4,f:[{t:2,r:"data.verb",p:[20,22,608]}],n:50,r:"data.verb",p:[20,5,591]},{t:4,n:51,f:["Dispense"],r:"data.verb"}]}]}," ",{t:4,f:[{p:[24,3,703],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[25,4,737],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[26,5,765]}]}," ",{p:[28,4,793],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[29,5,835]}]}," ",{p:[31,4,865],t:7,e:"section",a:{"class":"table",alight:"right"},f:[{p:[32,5,909],t:7,e:"section",a:{"class":"cell"}}," ",{p:[33,5,947],t:7,e:"section",a:{"class":"cell"},f:[{p:[34,6,976],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[34,45,1015]}],params:['{ "name" : ',{t:2,r:"name",p:[34,102,1072]},', "amount" : 1 }']},f:["One"]}]}," ",{p:[38,5,1151],t:7,e:"section",a:{"class":"cell"},f:[{p:[39,6,1180],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>1)?null:"disabled"'},p:[39,45,1219]}],params:['{ "name" : ',{t:2,r:"name",p:[39,101,1275]}," }"]},f:["Many"]}]}]}]}],n:52,r:"data.contents",p:[23,2,676]}]}],x:{r:["data.contents.length"],s:"_0==0"}}]}]},e.exports=a.extend(r.exports)},{341:341}],465:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]},"   [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,r:"adata.inputLevel_text",p:[37,78,1447]}]}]}," ",{p:[39,3,1501],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1540],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1579]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1674],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1708]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1804],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1894],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1927]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2039],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2077]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2204],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2238],t:7,e:"span",f:[{t:2,r:"adata.inputAvailable",p:[47,9,2244]}]}]}]}," ",{p:[50,1,2308],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2339],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2377],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2394]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2449]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2519]}]},"   [",{p:[55,6,2587],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2600]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2617]}]},"]"]}," ",{p:[57,3,2724],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2764],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2785]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2817]}]},f:[{t:2,r:"adata.outputLevel_text",p:[58,80,2839]}]}]}," ",{p:[60,3,2894],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2934],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2973]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3070],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3104]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3202],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3293],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3326]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3441],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3479]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3609],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3644],t:7,e:"span",f:[{t:2,r:"adata.outputUsed",p:[68,9,3650]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],466:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:["\ufeff",{t:4,f:[" ",{p:[2,2,33],t:7,e:"ui-display",a:{title:"Dispersal Tank"},f:[{p:[3,3,73],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[4,4,104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.active"],s:'_0?"power-off":"close"'},p:[4,21,121]}],style:[{t:2,x:{r:["data.active"],s:'_0?"selected":null'},p:[5,12,174]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[6,12,223]}],action:"power"},f:[{t:2,x:{r:["data.active"],s:'_0?"On":"Off"'},p:[7,20,286]}]}]}," ",{p:[10,3,354],t:7,e:"ui-section",a:{label:"Smoke Radius Setting"},f:[{p:[11,5,401],t:7,e:"div",a:{"class":"content",style:"float:left"},f:[{p:[12,6,448],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=1?null:"disabled"'},p:[12,36,478]}],style:[{t:2,x:{r:["data.setting"],s:'_0==1?"selected":null'},p:[12,89,531]}],action:"setting",params:'{"amount": 1}'},f:["3"]}," ",{p:[13,6,634],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=2?null:"disabled"'},p:[13,36,664]}],style:[{t:2,x:{r:["data.setting"],s:'_0==2?"selected":null'},p:[13,89,717]}],action:"setting",params:'{"amount": 2}'},f:["6"]}," ",{p:[14,6,820],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=3?null:"disabled"'},p:[14,36,850]}],style:[{t:2,x:{r:["data.setting"],s:'_0==3?"selected":null'},p:[14,89,903]}],action:"setting",params:'{"amount": 3}'},f:["9"]}," ",{p:[15,6,1006],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=4?null:"disabled"'},p:[15,36,1036]}],style:[{t:2,x:{r:["data.setting"],s:'_0==4?"selected":null'},p:[15,89,1089]}],action:"setting",params:'{"amount": 4}'},f:["12"]}," ",{p:[16,6,1193],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=5?null:"disabled"'},p:[16,36,1223]}],style:[{t:2,x:{r:["data.setting"],s:'_0==5?"selected":null'},p:[16,89,1276]}],action:"setting",params:'{"amount": 5}'},f:["15"]}]}]}," ",{p:[19,3,1410],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[21,6,1476],t:7,e:"span",f:[{t:2,x:{r:["adata.TankCurrentVolume"],s:"Math.round(_0)"},p:[21,12,1482]},"/",{t:2,r:"data.TankMaxVolume",p:[21,52,1522]}," Units"]}," ",{p:[22,6,1564],t:7,e:"br"}," ",{p:[23,5,1575],t:7,e:"br"}," ",{t:4,f:[{p:[25,7,1623],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[25,50,1666]}," units of ",{t:2,r:"name",p:[25,85,1701]}]},{p:[25,100,1716],t:7,e:"br"}],n:52,r:"adata.TankContents",p:[24,6,1587]}],n:50,r:"data.isTankLoaded",p:[20,4,1444]},{t:4,n:51,f:[{p:[28,6,1757],t:7,e:"span",a:{"class":"bad"},f:["Tank Empty"]}],r:"data.isTankLoaded"}," ",{p:[30,4,1809],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Eject":"Close"'},p:[30,21,1826]}],style:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"selected":null'},p:[31,12,1881]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[32,12,1936]}],action:"purge"},f:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Purge Contents":"No chemicals detected"'},p:[33,20,1999]}]}]}]}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,2,1]}]},e.exports=a.extend(r.exports)},{341:341}],467:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],468:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=a.extend(r.exports)},{341:341}],469:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,8,97],t:7,e:"ui-button",a:{action:"jump",params:['{"name" : ',{t:2,r:"name",p:[4,51,140]},"}"]},f:["Jump"]}," ",{p:[7,9,195],t:7,e:"ui-button",a:{action:"spawn",params:['{"name" : ',{t:2,r:"name",p:[7,53,239]},"}"]},f:["Spawn"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[2,22,46]}],button:0},f:[" ",{p:[11,3,308],t:7,e:"ui-section",a:{label:"Description"},f:[{p:[12,5,346],t:7,e:"span",f:[{t:3,r:"desc",p:[12,11,352]}]}]}," ",{p:[14,3,390],t:7,e:"ui-section",a:{label:"Spawners left"},f:[{p:[15,5,430],t:7,e:"span",f:[{t:2,r:"amount_left",p:[15,11,436]}]}]}]}],n:52,r:"data.spawners",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],470:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{341:341}],471:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=a.extend(r.exports)},{341:341}],472:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],473:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],474:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=a.extend(r.exports)},{341:341}],475:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 1:return"good";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,173],t:7,e:"ui-notice",f:[{p:[14,2,187],t:7,e:"ui-section",a:{label:"Reconnect"},f:[{p:[15,3,221],t:7,e:"div",a:{style:"float:right"},f:[{p:[16,4,251],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]}]}]}," ",{p:[20,1,359],t:7,e:"ui-display",a:{title:"Turbine Controller"},f:[{p:[21,2,401],t:7,e:"ui-section",a:{label:"Status"},f:[{t:4,f:[{p:[23,4,456],t:7,e:"span",a:{"class":"bad"},f:["Broken"]}],n:50,r:"data.broken",p:[22,3,432]},{t:4,n:51,f:[{p:[25,4,504],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.online"],s:"_0(_1)"},p:[25,17,517]}]},f:[{t:2,x:{r:["data.online","data.compressor_broke","data.turbine_broke"],s:'_0&&!(_1||_2)?"Online":"Offline"'},p:[25,46,546]}]}],r:"data.broken"}," ",{p:[27,3,656],t:7,e:"div",a:{style:"float:right"},f:[{p:[28,4,686],t:7,e:"ui-button",a:{icon:"power-off",action:"power-on",state:[{t:2,r:"data.broken",p:[28,57,739]}],style:[{t:2,x:{r:["data.online"],s:'_0?"selected":""'},p:[28,81,763]}]},f:["On"]}," ",{p:[29,4,817],t:7,e:"ui-button",a:{icon:"close",action:"power-off",state:[{t:2,r:"data.broken",p:[29,54,867]}],style:[{t:2,x:{r:["data.online"],s:'_0?"":"selected"'},p:[29,78,891]}]},f:["Off"]}]}," ",{t:4,f:[{p:[32,4,989],t:7,e:"br"}," [ ",{p:[33,6,1e3],t:7,e:"span",a:{"class":"bad"},f:["Compressor is inoperable"]}," ]"],n:50,r:"data.compressor_broke",p:[31,3,955]}," ",{t:4,f:[{p:[36,4,1097],t:7,e:"br"}," [ ",{p:[37,6,1108],t:7,e:"span",a:{"class":"bad"},f:["Turbine is inoperable"]}," ]"],n:50,r:"data.turbine_broke",p:[35,3,1066]}]}]}," ",{p:[41,1,1200],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[42,2,1230],t:7,e:"ui-section",a:{label:"Turbine Speed"},f:[{p:[43,3,1268],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.rpm"],s:'_0?"--":_1'},p:[43,9,1274]}," RPM"]}]}," ",{p:[45,2,1337],t:7,e:"ui-section",a:{label:"Internal Temp"},f:[{p:[46,3,1375],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.temp"],s:'_0?"--":_1'},p:[46,9,1381]}," K"]}]}," ",{p:[48,2,1443],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{p:[49,3,1483],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.power"],s:'_0?"--":_1'},p:[49,9,1489]}]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],476:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{341:341}],477:[function(t,e,n){var a=t(341),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,331],t:7,e:"ui-notice",f:[{p:[17,4,347],t:7,e:"span",f:["Safety restraints disabled."]}]}],n:50,r:"data.emagged",p:[15,2,307]}," ",{t:4,f:[{p:[21,3,442],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[22,4,482],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[23,5,513]}]}," ",{p:[25,4,559],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[26,5,592]}]}," ",{p:[28,4,640],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[29,5,673],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[29,26,694]}],value:[{t:2,r:"adata.vr_avatar.health",p:[29,64,732]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[29,99,767]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[29,140,808]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[29,179,847]}]}]}]}],n:50,r:"data.vr_avatar",p:[20,2,416]},{t:4,n:51,f:[{p:[33,3,935],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[37,2,1031],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[38,3,1067],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[38,20,1084]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'}, +p:[39,4,1151]}," the VR Sleeper"]}," ",{t:4,f:[{p:[42,4,1253],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[41,3,1225]}," ",{t:4,f:[{p:[47,4,1376],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar"},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[46,3,1349]}]}]}]},e.exports=a.extend(r.exports)},{341:341}],478:[function(t,e,n){var a=t(341),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=a.extend(r.exports)},{341:341}],479:[function(t,e,n){(function(e){"use strict";var n=t(341),a=e.interopRequireDefault(n);t(331),t(1),t(327),t(330);var r=t(480),i=e.interopRequireDefault(r),o=t(481),s=t(328),p=t(329),u=e.interopRequireDefault(p);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(485)),window.initialize=function(e){window.tgui=window.tgui||new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(482),text:t(486),config:n.config,data:n.data,adata:n.data}}})};var c=document.getElementById("data"),l=c.textContent,d=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(d,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var f=new u["default"]("FontAwesome");f.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,327:327,328:328,329:329,330:330,331:331,341:341,480:480,481:481,482:482,485:485,486:486,"babel/external-helpers":"babel/external-helpers"}],480:[function(t,e,n){var a=t(341),r={exports:{}};!function(e){"use strict";var n=t(481),a=t(483);e.exports={components:{"ui-bar":t(342),"ui-button":t(343),"ui-display":t(344),"ui-input":t(345),"ui-linegraph":t(346),"ui-notice":t(347),"ui-section":t(349),"ui-subdisplay":t(350),"ui-tabs":t(351)},events:{enter:t(339).enter,space:t(339).space},transitions:{fade:t(340)},onconfig:function(){var e=this.get("config.interface"),n={ai_airlock:t(355),airalarm:t(356),"airalarm/back":t(357),"airalarm/modes":t(358),"airalarm/scrubbers":t(359),"airalarm/status":t(360),"airalarm/thresholds":t(361),"airalarm/vents":t(362),airlock_electronics:t(363),apc:t(364),atmos_alert:t(365),atmos_control:t(366),atmos_filter:t(367),atmos_mixer:t(368),atmos_pump:t(369),borgopanel:t(370),brig_timer:t(371),bsa:t(372),canister:t(373),cargo:t(374),cargo_express:t(375),cellular_emporium:t(376),centcom_podlauncher:t(377),chem_dispenser:t(378),chem_heater:t(379),chem_master:t(380),chem_synthesizer:t(381),clockwork_slab:t(382),codex_gigas:t(383),computer_fabricator:t(384),crayon:t(385),crew:t(386),cryo:t(387),disposal_unit:t(388),dna_vault:t(389),dogborg_sleeper:t(390),eightball:t(391),emergency_shuttle_console:t(392),engraved_message:t(393),error:t(394),"exofab - Copia":t(395),exonet_node:t(396),firealarm:t(397),gps:t(398),gulag_console:t(399),gulag_item_reclaimer:t(400),holodeck:t(401),implantchair:t(402),intellicard:t(403),keycard_auth:t(404),labor_claim_console:t(405),language_menu:t(406),launchpad_remote:t(407),mech_bay_power_console:t(408),mulebot:t(409),nanite_chamber_control:t(410),nanite_cloud_control:t(411),nanite_program_hub:t(412),nanite_programmer:t(413),nanite_remote:t(414),notificationpanel:t(415),ntnet_relay:t(416),ntos_ai_restorer:t(417),ntos_card:t(418),ntos_configuration:t(419),ntos_file_manager:t(420),ntos_main:t(421),ntos_net_chat:t(422),ntos_net_dos:t(423),ntos_net_downloader:t(424),ntos_net_monitor:t(425),ntos_net_transfer:t(426),ntos_power_monitor:t(427),ntos_revelation:t(428),ntos_station_alert:t(429),ntos_supermatter_monitor:t(430),ntosheader:t(431),nuclear_bomb:t(432),operating_computer:t(433),ore_redemption_machine:t(434),pandemic:t(435),personal_crafting:t(436),portable_pump:t(437),portable_scrubber:t(438),power_monitor:t(439),radio:t(440),rdconsole:t(441),"rdconsole/circuit":t(442),"rdconsole/designview":t(443),"rdconsole/destruct":t(444),"rdconsole/diskopsdesign":t(445),"rdconsole/diskopstech":t(446),"rdconsole/nodeview":t(447),"rdconsole/protolathe":t(448),"rdconsole/rdheader":t(449),"rdconsole/settings":t(450),"rdconsole/techweb":t(451),reagentgrinder:t(452),rpd:t(453),"rpd/colorsel":t(454),"rpd/dirsel":t(455),sat_control:t(456),scrubbing_types:t(457),shuttle_manipulator:t(458),"shuttle_manipulator/modification":t(459),"shuttle_manipulator/status":t(460),"shuttle_manipulator/templates":t(461),sleeper:t(462),slime_swap_body:t(463),smartvend:t(464),smes:t(465),smoke_machine:t(466),solar_control:t(467),space_heater:t(468),spawners_menu:t(469),station_alert:t(470),suit_storage_unit:t(471),tank_dispenser:t(472),tanks:t(473),thermomachine:t(474),turbine_computer:t(475),uplink:t(476),vr_sleeper:t(477),wires:t(478)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(354),titlebar:t(353),resize:t(348)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{339:339,340:340,341:341,342:342,343:343,344:344,345:345,346:346,347:347,348:348,349:349,350:350,351:351,353:353,354:354,355:355,356:356,357:357,358:358,359:359,360:360,361:361,362:362,363:363,364:364,365:365,366:366,367:367,368:368,369:369,370:370,371:371,372:372,373:373,374:374,375:375,376:376,377:377,378:378,379:379,380:380,381:381,382:382,383:383,384:384,385:385,386:386,387:387,388:388,389:389,390:390,391:391,392:392,393:393,394:394,395:395,396:396,397:397,398:398,399:399,400:400,401:401,402:402,403:403,404:404,405:405,406:406,407:407,408:408,409:409,410:410,411:411,412:412,413:413,414:414,415:415,416:416,417:417,418:418,419:419,420:420,421:421,422:422,423:423,424:424,425:425,426:426,427:427,428:428,429:429,430:430,431:431,432:432,433:433,434:434,435:435,436:436,437:437,438:438,439:439,440:440,441:441,442:442,443:443,444:444,445:445,446:446,447:447,448:448,449:449,450:450,451:451,452:452,453:453,454:454,455:455,456:456,457:457,458:458,459:459,460:460,461:461,462:462,463:463,464:464,465:465,466:466,467:467,468:468,469:469,470:470,471:471,472:472,473:473,474:474,475:475,476:476,477:477,478:478,481:481,483:483}],481:[function(t,e,n){"use strict";function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],482:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],483:[function(t,e,n){"use strict";function a(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function r(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(481)},{481:481}],484:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;a||p.textContent.toLowerCase().includes(e)?p.style.display="":p.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],485:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],486:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var p=Array(o),u=0;o>u;u++)p[u]=arguments[u+3];n.children=p}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(p){r("throw",p)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(p){return void n(p)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e Date: Sun, 28 Jul 2019 23:55:25 +0100 Subject: [PATCH 403/608] Fixes, but good. --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 8535b9498e..1c0be3d097 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -131,10 +131,11 @@ /datum/reagent/fermi/furranium/reaction_mob(mob/living/carbon/human/M, method=INJECT, reac_volume) var/turf/T = get_turf(M) - var/obj/item/toy/plush/random/P = new /obj/item/toy/plush/random + var/obj/item/toy/plush/P = pick(subtypesof(/obj/item/toy/plush)) + new P(T) var/list/seen = viewers(8, T) for(var/mob/S in seen) - to_chat(S, "A [P] suddenly flies out of [M]!") + to_chat(S, "[M] suddenly coughs up a [P.name]!") var/T2 = get_random_station_turf() M.adjustBruteLoss(5) M.Knockdown(50) From 4c01b7ad57d5ece3f15ea415f4769981abef1196 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Jul 2019 23:56:30 +0100 Subject: [PATCH 404/608] Maybe Oxy so people don't kill themselves. --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 1c0be3d097..3a571fcd14 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -131,15 +131,15 @@ /datum/reagent/fermi/furranium/reaction_mob(mob/living/carbon/human/M, method=INJECT, reac_volume) var/turf/T = get_turf(M) + M.adjustOxyLoss(15) + M.Knockdown(50) + M.Stun(50) var/obj/item/toy/plush/P = pick(subtypesof(/obj/item/toy/plush)) new P(T) var/list/seen = viewers(8, T) for(var/mob/S in seen) to_chat(S, "[M] suddenly coughs up a [P.name]!") var/T2 = get_random_station_turf() - M.adjustBruteLoss(5) - M.Knockdown(50) - M.Stun(50) P.throw_at(T2, 8, 1) ..() From d472177a4ca43a1380c559bffd5ae24a86862538 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 28 Jul 2019 23:59:33 +0100 Subject: [PATCH 405/608] A casual cough. --- .../code/modules/reagents/chemistry/reagents/fermi_reagents.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 3a571fcd14..d20280bf0f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -134,6 +134,7 @@ M.adjustOxyLoss(15) M.Knockdown(50) M.Stun(50) + M.emote("cough") var/obj/item/toy/plush/P = pick(subtypesof(/obj/item/toy/plush)) new P(T) var/list/seen = viewers(8, T) From 5e5f2fea54f7b31ae11731c91bf857b8e219e564 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 29 Jul 2019 00:05:26 +0100 Subject: [PATCH 406/608] Heck --- .../chemistry/reagents/fermi_reagents.dm | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index d20280bf0f..68a6f7a479 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -130,18 +130,19 @@ can_synth = TRUE /datum/reagent/fermi/furranium/reaction_mob(mob/living/carbon/human/M, method=INJECT, reac_volume) - var/turf/T = get_turf(M) - M.adjustOxyLoss(15) - M.Knockdown(50) - M.Stun(50) - M.emote("cough") - var/obj/item/toy/plush/P = pick(subtypesof(/obj/item/toy/plush)) - new P(T) - var/list/seen = viewers(8, T) - for(var/mob/S in seen) - to_chat(S, "[M] suddenly coughs up a [P.name]!") - var/T2 = get_random_station_turf() - P.throw_at(T2, 8, 1) + if(method == INJECT) + var/turf/T = get_turf(M) + M.adjustOxyLoss(15) + M.Knockdown(50) + M.Stun(50) + M.emote("cough") + var/obj/item/toy/plush/P = pick(subtypesof(/obj/item/toy/plush)) + new P(T) + var/list/seen = viewers(8, T) + for(var/mob/S in seen) + to_chat(S, "[M] suddenly coughs up a [P.name]!") + var/T2 = get_random_station_turf() + P.throw_at(T2, 8, 1) ..() /datum/reagent/fermi/furranium/on_mob_life(mob/living/carbon/M) From c36f9e25965738663d8d7716908a7fd78b70bee1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 29 Jul 2019 23:04:10 +0100 Subject: [PATCH 407/608] Fixing merge conflicts. --- icons/mob/screen_gen.dmi | Bin 115810 -> 116171 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 756dcfa981281eb26d9ad3afb712d8d5b1512ba7..3cd7388378f66a55d7d823c000fda1aa58362c97 100644 GIT binary patch delta 49397 zcmZsC1yq!6*Y40A($c7eNQ#s+D5yv%T~bogjl?{3hp2!G5+b5B(m621C`d|5H%Ja0 z1Dt#OzVn}T);Vh_FU~u|JhPvDUwdD{d^Aya98np~1yuI6tLhSBjOXNk{V66o+Bo`K z_RXB9FN{CLS~0wMA7%FK)xhFmS+V)I+L;uiS4UVGrH)qWm#rurM^=pR5@+gG;F-hCa;iz}g8H8+*=3`R zDr}YVp3eP&svPa7>ctN?C!$Ks8s__RRQPV*R9YV?exj=z{`c>Tb zz&zd9w1yB)K6lRop4%0y59AVshJ__(WC&=M-4qlgK)D~Umm=EP`xGuQv~zQF^F=%T z{o3uFok$dlsH3CfM^~4!ySwP&)>K^YN125m$=9Lzt3$A8yWBlAT1iijo;_eg^p5K^ ztDtdZ3%HgmbaeQM3vPdhZjxWUjnB=^J@27YQc}Vs>B8!>J)Mw|!5Ysl$L!+bGJpDG zki>=+mDAYB`ccNW^Ze|n+;c^fRRPYrf1$Pw{hu#~@JmlkP0h^mpfewG4ta>R*tm*j z)ZFF`ZX&C6sE}EG@XE`{24AYYyga}C0k!0`G$L15S5_%ESVTmG-)7aQ+w!lgegOds z8{-vBckHPf8yjDxrba%=Rh`?KYN&;u*N(8ecJi9VO9vBofx3!f>C4UUTngWhG(F>@K z&a>KDDSRTL1@JM(8efW?9<1}i+1hPW3=9l%%^G~Ze*1RC{PNeY$L@!6G8M-9`V1e$ z9eMOA#_;JufiQ;?u6_r@1|6kNczAfp@88F$L{ZM=M6n~=s1)J@jZC-@ctqGl#bx ztd9;98HsuQ9U=k!r1;_mKX_8uvnKzTrXZ(z>h#T^qbhf5uNa@x|#t- zO+yn38p~;>nN7^Dw;hz`3M*^;cJmn}5hbglwl=kXiD?Y{{M52LRgg*43ja@)W7J5o zNu0S-U48w0eimFA4wt{{wHlnA%~>uiC?=*;;BI(<)7HF8XhL{XNzA}cHF*!6ICsT))&qO`Qs(CklxuP~2RX8fN&#^?=i zC)Gd%{JgzO>B*BT*kg-*8@uga@5Q9NR;eQ?SRz61$2IwaL*eG*!=NSGIx-{&$4FhA zt_wHr531Xb6kUy^WFw`bqVn_iM?y0*=0*J(@ z`FUJ$`?1}BetLk{xA#CpmUodkpA@PleU>zg7ZXmjQVNdUXP@kr)OK7aC7wj zzE^m7IH#nfL54#!IM${JI2&{}F*Cco9I2D9Ik&&|J32bLWw|FEy{j%vHq$LF(qr9{ zzSkI=Hw(cm`pc4SkY?U&9po z*8SN^wZ7ZznwhdOjOKw)F#N9;!hbvN$|fN$&$rz?Jdm3cHBU@T;@aEqJ^pa#p=?eo z=!Gln?38J?LX>PR>8RkDdarb&zK^VVh;2z2j1%_oo{}zY2%Jdunx#ggQD4#r7K+{~ za)<;?vMi@?m(;;m)zSp{v?7z^3Vm2>@uA`3%B?ASIk@^c9g-x}P1o?)Wu|$7C&1rz zk}s1ImX{|v5gw5+?C*q1^Z}<+q4@9bn!dMhr+mm}OQY`Z!OA4%uEO>S-C#^tZ&SiH z7}||sNBd3zgY5F1J?YRv^0aBZ5z61N3 zwcq*ZtV;|LIJPBnNi`3tFXrfAii0vHbm+d1M?5f#p1*xRw5aiwpfOg4W+T4psM4Ub z#PrY2;1j@tySlEzY^_m=2X5ZyUHtMvXKy3nSzFD4100MIEV4xmfo&?hdz%x)>e}CD zH@ET(*}-o=zqb9I|kaCVTl69w4Q711GkB_ZVPcoD_)q*0Db#Y58^&Z+_){ zHrF#YjwPYxnVs)|;@*inG87aRVrPTw-Y+q~!*M$_8pVMZETtpK$qAG5-&b^Y7F11S zjR7diB`L`W<`9#F6H`V;Mz(%oN9G5ObO}oUY_MQ}h?pNl*ctPUodVpG2ePU$xAUG?89WY8tD-<5k2w6nLvier-)I^V?9Yp zMNu(WqhR3W%a`AgRdVMANeUNCqN1WddV21!^nRS%*oX(H9WADCd2xhTIGTY_v|6$u z8yimU^EfE?S}-~9`fkO?F$!DtW=Mlc38|tI**fm;($dg~_->gF4Gmd<(j7K3;Edl2w#tff;O7*A&KEDa7`@oPkX(Rp)cu3-OvMV;= zYf-ITGb@Zx?UPmw<$O={S0*m6d~V#Z>&{ySr^kY5T70ED;XHw;2d)YbF;}AoOW$>{ z+xWOmvVIOg=pS!Uaq1BND%3AV@fHTGx(LP9tb813=<9j}>vvIe;JW$fjF6~BQVM2t zHb}9RPT;~&4K-CF;5O+Cvm=cWBj>DAL-nK4!*(#fyHN7p+E%ycQB_!7x{3N*gUR2d z3mfpM7D0-$dh$%!r#p~6t{<5kfuH`%YQ1BdGg~ghnx%U;5ju|_lW$Gdg@xb|#pgN@3HfKdC{o-j&o;>D$ z;Zn(T@o8Drdg()gagy)$UtWEC@Aop>8h$=I;dVq?<@9a3*FIUb@2~-!l6S0Hso7r} zQ7U>hfh^reo6PePE6W$*3KZkZ;MUKXsQe1sxm)S*yHkkK%xA-%s5twV(1(I5>dzXv z&yGjN^Jj~owwgi?SkB$a)_hu?q>Sj}Z5lUpA1+LJl>n6!VR9>Y;Z;gjViCq`Lqn@` zdjI)bM^ZJxN#o)3#r2EJrN^sI1AkIis*Xsaa{^ucze`cBjZIF5d+!Ke7zKkLCGv9d zp4ZM=c#njY+LAg@lkMM8y^Oi#nu>F z-WGROFo0MD+)}#{sO&Q z;FA&>85zyLe%#yJ>xV(3usdTx0smKBe(bBK8hq8f?nGQsq-ieoBVl|~pZHnJxBz3z`#(~YAZ8vwcKNMcbS5XsjAMBoYo}&JNT=_WYF?myP zlr%@(D$Q!EQL_BT$nm{y(Bu0rZEk8_xKr?6))K;`P7>T^cH5}ge@~83%>569yrLq@ zxvRk8=Y>3a`Y}u6!W#l~qrCe*qov29KkU8Ymz}oP)FqOE73bGzTl{n1$VSOAkZ0?! z%Tuzp?AebN$OTTEwAKU}Y{o4&`xO6a!+yK+K4!meFo!4$jp(%}2|gta1y`^F?tJf7wrPt}*QXA1x|h)LN6 z8X$tuD$55dUqNS2Hv0Vj+-A`1D)e(iagx&9AAkkYGL4gl^NeKe1O=$ z%-Rbs@p4};-x<(~^CJ&~(b7A`TovNQ*ZT3@qKmJ)_L)#|$!fLhXhr^=s>#?9+z)mv zZS;7eQ)zkZy%`%dQB4$FuQ*j8Cp2Bl39T~)P52TRlk_1B;c6qEUJj!LK~wUN(YQ#% zO9ASnoLS|mJ@2I9r#^X~3oeW6o{@8kIz7(NBe;!O?Zcaf-3~z;baoxeoL`)6kAXcE zFbg!Gfb(4`w_w3w6(lAhA^BQd+@Yf-$DR4j9&Ef=9+A1R7!H^O=t~HofyLp*I4qc5 z&VLrX%JBR17{AmqE|tiZwl+KfB~g#^kYJPF+@*3++<`qiI(?h=WvBj#qg$%e#>U1H zJO=Ml*LiEivac@+>*43if63*S4l8W5wfj7muYxp91(Pp2`_hLvztiK;ST;yYl$qgo8SI&nL)t`X2FHpJb_eexa22q#H0i9g8#4D?Y`ddpOVQ5G<{;C)u*z&QQT0?^ZyF#pw z24r=0Ws!eVO+G^`NGwkD%q%%+|`12gHC7<}_A@6A}W2D8KTp z#@uJ3mJLQgm-2tAoylNUS^j{FC)#i<1l~Q{2?+^#(DPs^^pp^dn8HxpPm8T}UqGP+ zO{&{d;{`Lc>^PcNpI(XTolUY~UFb~UK-t;Y#N_u9gmcs5%$6c9lqag4-7PM0*7dqe z{cw`Z=tCvLsfDV)z^v|@&OkH~F)WgCZ!ViJw@hHlXKfWK>pkL1KB^y{$vHMzq)dw! zD$tsU!J_FcgVgu$2L@?m1isv5nY;Y_W~LpMTp`E0xshFY2%^5H8A<9iNtx|x!-Qy*<>=0*!- z;N5Z-$y#06&3JB$?V>F)Do;9%VBV+~Bn?lW4llHIwo|O(VxAI{ui-Y5S~PY9NX#TX zrX*&u9)#-_8kBZ6LNE7P9GMRdiVQ;_%mT+e;pGu@NyN*`+jz2^&L=3?@go@-KLY5_ z)jruhaxC=(0AsbkI#3&Ua{HP8!&N;O06ZBVKbAX<-xe^dr(;D~9{e5lJKL-gweBRZ zt*wpL^t=jguCK4JT9jIN479Yg1c;Lg0Jc}JUxz|!96@v;N+E&0d91y+#^R3FHri&| zHR#Ov=dt(xXWHvJ0Azlmfq3)Qt3;K~6AYP|nNk6V0!Sp%4fNaFw6t8n)@niP;D+J8 zWMpJy?Uu4NqQ*jxvpB+wf1FTde)GgUb8iVB}eW}gMIhB{q9BMvO=dbzVPQL#p|9A)ti8`|59d-5q_ z5as&KT*$*;mLq(an)p+B?jk~rdlFT9;aWZ`hf-{LmQON^{nvY1q;nH)Y~Y9^oSAYC z);|1XG19fkex!pzUw$nn?rI&xM925T-)qaJCk&Y&Gm5>Xr2Ktkj!Ej8?RYSF$&~v- zuXka)JzzXE_r;=o})ExD97%D{n66?cmS3uLa2b2S4 zW#yfdl`OzM*kCXq4$;xm&z&F5pn$MInzPU zo+OJ4`X)ohmoi@~t22U((d~5K0dp{F?zj7scOYMj1B|(AB7CnDQr+Wk)$6ve5jy)I zAg>whfkq;g!Tyz^5s46`Exs=kKa$1Y9{e^JU5@YlEX`smnIlAJ3sV|&gDJnb1aUwqO8&U zQZQNiP6pybw4DZ8QCucpM^+LQc}RUk~mG+TotedG?EMw2D$-b(AnXAU0u47 z60^UqbDCo~qXB-+CLH_(n z!p_b?1%&n`{nZxqtuukDtBYYJz^WP&WhRjrcE1yIt0g>aR4t1ruOh z`&Q^xLGq4|uu;04n;X-1(_ZLhNwW{p&B2zmGM;DKk64T9Wqha8=e-?F2n%s5obv<* z6nOI}AI?svYD3&~>gSI*5aO6{_y^;!L6G){4G;0nPNZZZyl+lS!OYH9!EfPPa0PWD z;lz`6nI7_)__-$K+4a%;8I|^%{FU;COX-&CEAQ3w+pSqBEj$M_D-PTIOT4!$3}7|Y z=2ecPLfBCS7EquG5fPFz1-FI~mgW3X9NOpy}2fb^xt;&z~DxtO(%jtI)xJIvIG z_RhZ5SCA@%Ps9mL)k`!cQwl7q9^%t@ip!0{N_<#pAxZhiwd{Y(?*-L*)oFy*vLd9v ze$o6Gdx=?5V3PK@F*!9gP+}%S$H-{i&zbY7=J`*WO4k|oB-veJ4^K~QsTy~XWB^)} zJv?q_zFfXqTUR#+q#!Kz0ENH}bL_6Gt26;VJx4sLp|?iSYBCK04jqdbnNcR>;a(gz){~?PH;P=zDxwr;MUH!a+@UB!l_E&G z=^q`{ShNPNzOMGB`g4h(g4$!!4!^?Jt*G+7lx_cv$nnVeK48o_ur}aoQ7)_e%L+=< z1AnCA_w-T0-AU46bR_1fPr^hodzOH!I9*CjjUqc3vf!YAPcrd^oWV8 zC0OaPS`bjoT#rvr=Ye3nI#SGXanc9P14LB=dhqTZvfp`T4w)lTL^SFFT&P zy|KRbt02=r058#^bUbC~I?<5_j9Q$(O91*aeI1s_d96!8&du*?nr%4;DFdQc_T_a z4Yfu#vysouWtzzGm7{S9-<=*7cn%$mu8x*+obIoM0m=L-*b|YTAHLBxGK#?pD63Nq zlD0h`A^?Y!l9mQF5iqT#{`Tz~lbrvZ-Yf+w1qB7H0aN2Lg&g{()4C@+I5Y>wjPKu}+g{t#Yyj~jm{KHE z4w<$&B-)=5@sj2$>`Hd2D1SOaT zJF-bY3?P-8mngwWO-qYg_e~FNXprgZ?q-?pS5~EDZ%6Uocy}y7Ch~Z%<_L4U>?aod*(~lajTmDN8Vn9&o@;fudQP5 ziD&dXy?D6&FBM^f)myC>QvvOsMXS~Zj|x6Sm>+ruj)B$-BHvbM;L#DdACa`pJ zS$ts8wELAo2|IqVz*D@QIG-hEu$p9EW1BwWtrHy+Eh3X)vT*D@;7OC{pJZ~wKG5sA z!nnKSvbEET!Ybt=iO`YOJf50FAm&D!F{?>k_)EMjD31SZU zKhQG$+MzQ$gC^UzIv2+oFjikxUJ{uK@U>s)tTD;HeA_DTw)W7)@Yvb@d+r^tiiyE2 zWj)hpl3_RDbh`?b2D4ciLz3Pr&7@1FM>5NPYc&kt(@ zj)YPLO(H@2IZf5m|Nf%U2I{pl9RO|Pz_2b2Xuk{vh#mO0VqY}UdA7#7yUEyOeA

      Vq5BLaBPeR zK5dk@n|o+<@s8Ni`+eR-b@W_10s37uagQ}cl!s@MIZv!!!zKnN+i*|p>0ZT6-IH$z z;eHlOfZzGYuV0SbEx9xq^ln}%inaRt(~nt)AP|+fE$)1skblOiPme{Z48GY-J$?7)zH0@w)1zaFN)4R)cALJQ zCk?6%cl>rabTC#OXR$odr9?glY2%?!jf_YD=>cXi5ipXKfh+{dN0_-XP;RXj2!we1 z-(M08ua*uAr09UUfhvQY@!H+H%;3JLd3%fNL&e4sKt0L<&Le*c=?wf#(Dv865MXHL zYH{TF^trPNnbulVJWK=#shUQ4Cj#$`$}Lq$)SlGruFpM7_wtb-fk4fyJ0wx?bG;Eb z<)uG9uV)`l@WZ)nCG_@qAk7R1k!lm+_#6vNSv$;2%5e&XJQ|#}z`RT5a#UDmhaeR` zBOI5nHRGLcDASdX3CU}SuiSg1%8X2Kw%)p6Q7340q1cJk`hMNQ@8eF*N-^URQOoSN zRc}y1HLdEc_ae?slu~VDx5L3o_hM~risNrCV(G?BX+1W1&DFLMika@|GY7DRzk514H>C>oYUg%Xg>E-r@et@K#~?cT7`{tC=u=<5@( z3V@$<*PC>^aWApQzomFe$g1>^*5QX~RbZXpWhl2g&{rY&dDSziVO0G4-vjw8*XO+z zzao3zNl)3cw1BpUnnZMJo-sADWQy9pP(-sP2G#EksfxynI5*L6hN(3fPo#)DY zx@&VQuuq?unNfgobZ9jXk{$Oz9>LVqRQu`EP~ZU^A0Jx)$RVbpQUmPO|8T=$qn4GF zL0&TG$gGK9Bp^Q7eHIp)1vlP?>lYgeRm?Cbe^L;CK zJ+p^5A<~U2P$BVM`~opfWx?#)hrg29Br}(%jM*m^4#f+u{7ipUYV>wq#D?^CTDy34 zvq%iQ;l9GtqAX=m+cjnWy;wT2^C^zx!Tv5qRuSp}@k(n59*5}MOZS)Z5?o@=>+FU4 zd0C{aLXoce=eDCk_0ZX_!ZObs77E1kTPZ2VGwQq^t@{xkuyG325VNzImM1yO9K#du zKB0kA5X|hjThDvln*9(pR29e}MWBXai6IWUZ`t8~t({`9_)=Ug@R z5zIk4Q@-}r-`=#sSmd23=ez8Tpygj7>8G#@-kze2Us^4=Q#HDxmEw}1(o9|BHn z`)=MYI>klfc%+7$t1zB%^=0!LKoPKM3=rvnDFS#Xf4OJd-qFD&FVC(ee{ur?A(lu6 z!SM0d=0OMaApR2$c#qWu=7f)*pT&`8Kxytg8BTC% zcx`$V0FCjmzQoNPrF{s3ObwTw4>@`dZ^k4!mIfkuY$Wd8&A|D2)j7A7?++3IIwsd7o1M9RdBtbc%3O3}tnMtEaD zG;rs6I8|o+C`xq!wD{^kok1Am+M&_O+OeS8#kXas8lvZexo+R4nF-vZc=mFM9veKV^E@1 zfpm)IxPI-%uyYP{aASG#ia{lKJ*3@KfAQl$ZGWGwWh=y^D14hXUx5hSY>c2Zb$jSWX&CC-y^LD zhk4-L(!l{szWvBz`b<(*N?7d^kEz+cyos4x2)t~Ur8l7v8DnLl__kNch-Z`+&fo`v zP69$)c(Xhq+f&2i>6DBDb_JKmlK|t}H%;#vn+0r$6>nxHop8AXqBzP5{c7&+z_m@; zvum223(Og(vISSX_6zuW23=}gXF35TyTZYdw7P09yWg*3SnI|G6alcl31%kB^YfEp zV@FXCC0qZe`()V69S~@+2`+RWbV0k_bi~deUu^49@$u|1`-Q|1q{qCZ!ON0)-4K3Y^-dn*C1>qhrTJ*e{HT zD0m@*JTZMCqs5_m*zC|5c(b*x%eTYtELK>r{xR#To8V>@^cm-vg}6+GYYlJQ!cXFm zZyFV!4oj(vKBS#}~Vwlsfsx8Sm^}7x% z*RZhzDSqcamB4RJV|;c@dtj{g3nHH(Z`$O09YorDSLhiZEZgWxp0iA)>u<_8SqZ_e zG72!omp0NZ?(-eMYAq%sYcJXjG}wDX;HqP(WLhs=y}i5JaDW*sPcb01qdsz8iTc^6 znjMtxV?R^u4ZxV9S_%{_F<)g$g9>S3rel0C6Kj_8Ca}pp0 zf+2VX7*xOWwH8414Xe`tLo4U$H*J0WNNi*bNDt2%4T}=@WRw1zQ+=SNh5B?qZU@`0 zAo&srG-_;O0i>m_C}4K*K;9q(@WxL-kgX(*#aAixf2XV>*SS#?udt=jrY@}ZLhg|B zm<9Tawzcap{myJyqq?GmSNP#wC^rfOgXVq!`@Bxc`H$ZpuTPI3{_IgY-SYK5fApIf zSumok{j98IYWB|*MY%AXhQsk?`-~<>f7h^<{GnHq zXNqZ~JI)gQQMg4>2oY8Ogys&2WvGwh_(JuY_|qES$r5QZ$+FeYPS<_9(PD&0WF@0} z#c|lUP%yPN9xm=;R&5(TNCcdUXj!8RVc3icF$F~j(CG#BiwX-1(I5lL#)_J&=#y^) zJ6nu|^PgD&m>odN+1ad_nFoIvMk)IG`cSj2VIY7Q333|PDOU^pCmxr{+7PS_!~tPM zK}e1$aX|zqHcsQ;@5`ph zX{p`6Pk@a)X0Cv<2igjJ1%_G287v1C1$|`uJwAT*XnO|rUd--QMn-%~iz3iaEq}b? z!sbbzfc~qQ_E!&NN4d|oP}GdJN~mIWmvmZwoF0b>6Bs&+JDN8zS(EVXr-s8yCfN3S z#uqGckXzPuL*|C!t#FywKi@s|8ogk^JNDmG7Uv8txh@q7Ar;?T2r$$FCg4t^&fn*qGGeX2koF|HKmk zUqyi|a&UNH*8Jpl~+~>>JC{ihs)6*RfY^2zxut7m;4Fb{NimqI7WMAf#^b27Q zPCh>E^>{@b92{OF;z4KWvM)2#hr6D^{{1Z>4`lpxlNSsI75bga>(8!F?LfSCqcSXS zn-US@E6ziCtx^5RaD;+qawOC{IcaL0{s&*}2*5M-J)L`nxIz>P%bBraH|6z$=v#)b zZ3dN9;5<}$B{Z^w*HTYm{uvVo?&Z8)Z>|4DOY9aeAY>oP&>E~>t-2}6B#Aa2}1dMQD*hqBq zx$T>&&Xzj>@~w@oOeYdBC5gr+&KY0Ww9H^2gaU)S z(avOrUDELwAl^2cDyJFXmkGvuI7+2mzjIvz*Mb1ml_G%_6OjJbs`kI!a7MR99~Trm&a2Vj!B#ECv=%b$GVsuIsEPAV60cyH|K zoEPd=e$n?B1zujF%Ts6+0fWUc2;u^}jL-_GCRRJPNy4VJ+OEVkOK6h{(yjf*mv%zj z|89zUj4B;s`2^o0-ve&*3%4Y%tNB7`ZPqdmR#Z8&0fVo9rVfO05u0sF@wha8)N=mx zoLKktcEo z_DHk++P{M2VbBj|-)2M`t>JW>gGVb61)9y4+fdpWA)i@ZwO%h2He;TEB6MIm~M5Y^T%? zNA`u-CFqNC`+;l4{KxM^*(ysas40mB`A-XGmQNFsbv{@RpI-sc(H<835GU|KT78!o znbM>Ez;22VM&*}PUefipSv5~)pr-Z>^aoE&GKd}B`zc|*wD?uU)btRV_;WeGjacZ} z^}yh_Fw?u`K}Xf>VO52QqTQh5(TZcA>0IJQ4*XfXunCj-zMnr^onR{rf=FrD+=oTO=^5g?!@h1%I5nz{!FoZ%(mCrNgh#!mBGewOpU$S z2MKBigC0*FZ&fp=!rwyVArx%TKXWhAI{EB0EtQ0RHcM5O?a1~~!RdGq(NI>B-=9zJ z;*m2=a-9~%e_aFr@2#C-vC8xMcNG$i8!-6>g);eylD|dIXG(A4JeCss1hZ2*m>5Iz zI%tMk^M$LufY^zGuZD!Ui=ZFJQ=H_LWp4L57ADKWWp{pSeJS|m!J9y8pza#A{qXzW znaB*$vP0T6XB{4E_Pbs`=G~X?bdQ9)hV&B$)?1x9{ZN4fKe+IW-Z@q&vH0zmPH9ub@E0P?avG|94wsTSEtQ`81bD~Zd{3^8E z5H|LAO-5#-$ih}2_@kz#o`OUPoN1k(#C(v`g_MF#fo!T?0f&=^Tdzr%h9*yG(im>` zs2kcUP{0+LX;V3W>FhnZ-X~wE>RfeIO=w}vX!XKMuB2J&*?QeW^CE+Vs&SYA*}@lg z1h-)>ZpNE03Z{t0Qvu~Hn$woFzKvp|MD4R*uSdQHn}q5m&a`K`O6P<&<*Y?=I^2JH z+G*Ey+Xm%pOOkRU0^{jRT6ncFa-0xlsSZIE3BhSL#IO@@l`^kuU+dsg2+5#zN64V3 zEX#bxdYBo(gj5MX%cB+Ta8>pBaD3#tinGQ%A%IyuG)7>$ysB$+WMu_gE=hJVNXv4Ol02Sofu99R}E8R?#k>7 zchQ}BKQGh2c~wdC9N`y`RcRtyG95yb0;a?=@`F9@8>-agJat;QhSVj2)Q$6R7Cv9T zQMF%_P@oB_?-ZdCaS)%uy8QdW2hP%?yu@y-}^N_8|HO!E+D&DUlBITfQn3 z9{Npwug*O*5iZ>+mgFaSd$>+(c9xS&`h~$WcW+`X+Kr~c7-<|`#QCOYA}Q*s3Z^@d>A6hJ zqmCC_wtK5k?GRaqsDXP`Ez`5yw%}3Q>j5LCRX4dNry*$M84f=6X{*sez!q$QcU}}_ zUV7Pp6Mql_tiLGb0FHXOxk2xifWwU#5yK00Jr8M-U2w1#c@Z9P>pk3!B}rdt)h3*b z1Cxphb@?IG1+Otq5pBz_HJqA5bow7Wml8zf22@fH!bjLERY>r=>k=?-ChjsR;!p(a z6vC;8xya#TE4iINPNwHv9mk0`z<&syP59!N7pWZ<)x8)!8BkRS=0hK)rKiV%rNIc| zeq~GDR#WcXQoKeb?v_<9@0QM{P#mfZwmaEiLx1HP#jwmbZ*nQg$%pP%oe4+4AX1i0 zw{c)r(N)BL4O#anSA~h?6HUHe7>)WSH=BA2#&+k&vs}dt>JI>v7}A+q66)HHZgg-r zNtjR&7jqlfTs$)(U@h&jb>>rr(t)Gou*2o|{N1w-vsw!-)CjV=+8SV7wOpo<0bWwQ#OqwkWDGJ2p4&Lg7VTFj=?1UW|&cpk-2|uTrUe zdxK-tW?qUb|6dt?kx<|$W;=(eADs!1W;Ou^0Ug=6X)gp3z!(ZE+>2_=W$K^@#zq|Yz&TXO){DrL< z=Oe6lWF!%Y)60DiJ`N6%yz@wAY1uCh{Im_%@drK+T<6sUp3Ao^y%vQ~w`-Zk|r&|7`O##yA-fS?#8< zxaO4hm-XsJb8%ByC5EB!&c2mj4xPsJ=1oiap<4{kbnn@44*y0jtP4R4-peX zBjVgvC#+Af*6{hhyC?3~=0~-4?>sT&jv0~DGzdENg4x7gBmr67+o_vY#3_+#L32+T z)!V-0o?&?*@=AXLxn*m|wJ<$x{c{O!zltCUe6s9L%xOPkvv*<6q_m&4R7Yk-?07#wHu8HyCEgp-Ei=0w=G34oHLWf%a%?BTaz*TDUUFU zx#2Ufa?4Ni!V@TH?IhPDpQwP}UY-n1PKN$fmKD&?0RL(^68k95pm!{dPFtgASdCSw2S zqaLo|{P+9t>qenWzl|dM+n1?M@bZ;p#2{_K~}f0a|!L)TTxM z|9yjZ^euYkAvK4JKZH3}d;y2wePhmbDPVK1*>`K@D2u&&B~4KO5%%FroLwD)N%CXa zJT=Ate1bcAzbI$*xMocUQws0t_QCR>a~nHAJyBg}DMjtcSrDj9KLRJ?b;{14kF#{e z;SH#32&ZzZLQzoJMb}e!K`@rOgFoSHIWVyPDp9Mx(pmd%Bc2F`0kp7_HRdt&0zQtD zQ6=-W8P{A6j}_*I^Jn7T^)6ds*jc^aU*D%K+Zf8@4^#vQp_07nvq!p#GpT|~8m+F~ zsjSiv+@u;GyjAR}_$E(pMa!s@$ZU}%iGL8_W-AiQ;De53y1vmlnX$+Qx=fyg*tG+#2+|I(HcInG}AtOFqdZwgz zl+G-XInMsX@Jusw_*~%Y8hcH%yY8qkk71AS0TZ)Y59G8hDM1-$T>;3n~ z<1vD21HN5~9hhX3YY|!R9NfS~TVJ0Yo+N{b;Lz?TwvE6e!7|h>%ogUw`o@;6@?(~B z!QM1qklYSYv? zg3DuCmuuy+4bJu^I{X&k+J??j>YFfU zb`Egl4kYEYrdIh}fDpSGgAXuKDnprmI?4q3DL4gUD2~VF$NL_Vo>@90@>ah4HWA2w zNSYU%N~&W_%bhiIReFNxezJrqNa#BK$QWketUI#Z_zt@yUAq`tVxFVU;MelP(;&GEVown?c{&H z4(K|aq{v`Ff)FF&B%K^~Q;@eh_@MpuzhUh#R_CO}Sl=HZTK`bb?EydkEx)yc z7Ne||e&>G+U=7cA&HMk*pNhH1EZuYP5}2e6>3=V*t2?{M{=Ing|AjGS!jU34cC+wx zQux0>6vCqDC!Ej2!j2_KMSx&4PtHj*??;1ALT0wA%*ZVaGINcWm4?lqK84zij-S`p z9GGFZC@r|BkQdM6|H0#-e|sPnpM1h`rT$yWu`8sr|3NQ&OEtd#gJhyI!4m-_OyC0n z{QJ*OQ#*<(+Tp##o0GI&qq}q{$Hc_u>YEUDvO>@AfBpn!mGxQD-C8I&?2Pf&Mi%x; zvoMJ(R51rDqCl7^QaDMko!KDuyC(7BO!vPR4^f zg7Y)0WCdi%c^duUEzE_=zw3W=q5=_~UO%^QwkiyHHFNiZ#|Q_Evh0_{plJ7W?)$*f z_8#`7W)U82%Fu|>AEZ}MUk~6EU|cw#T&TmN4k}`x z`Txb(n+HPm{g3}6Whra4$Q}}sqU?;N?0bZyp+d4I`!bg(QkH}vTe23}vop4`FIlq= zNp@o&X1l*T^?JSEpYQj#e1Cs1_ue`8?C0@Z&Y5%iL&zFc{J_vw!7pNS$v_G(`fMw! zW1tl$k+p0<*kO+~1#eeK-crF|&n(XzkvUn)dT94D@{q~~!Z*+~fz)40D94BE6YaK1 zm2`7!aBjJB(1rDx9bt!kpIUnPl}x8wD2on~jacam3W3zCZbPdWM%PxgjMNbsXI8aN zHwCng*f8*Yd;Qny7_jy;8^H+%CrKL&oOj!VOpFH$&Bjt@hZ@f5HxHI~9%1eJ0 z@gd-Tw=qTXd!kt->iTorB_43);)V5N7WRVlA8p9$?Uf%tKynQeymCG!tvWzeri%m# zpRX`Ekx1)jfOpbNS!CES0kCph!eWM>SOgMjX6E;)AvXruYE*^^N3)m6i!Ocgqt(qB z5_PKqhGPwg&iSgUKc#buHKPJGmD`ao3O5(WUDPMvnS`Y6bb2<3pW5Gc2s&TS+1HE= zoiEAZjl-*--e2Vo*C!>Ww$A`}F2&H#UZtV{Z6+@0x*0&B%TIDgq}IYc(8}EzG~TSv znZ-aKvY*}qSuNzRv!%wi;Qi+qFn(WQlK_FQI36xIir5Wr!@ot-;~hEFTFz&S)97R_ zy-a>2qNt|5gpGlSs{Nttn}J14{Pq2jVd9&lm!u73Bo9coj9zzm%FZ>4{?<$)uGHExj?UK!3X8nmrbBB%jyrPk@aWf>0fdw&9QD5)0>EZw@jF;|T3;i$R zqJQVTn!mTCm-HVA@;}o4|2736G%MWqhA~^t6))}T|Btk{-=ZDyy%zF9f}qLP z0dnM}R*1$K`Ldt#;brGd#>c?K7BrAU(&U~(e{Uwe`U6}@-Pc<^_;~F3qd39)S%d0- ztKiBBig>%GbR?b!Mk#PoOedA%!{_h}e=eB|1OQ2L$a!S7aPG|5I1R^@!Ur2R3Y5 z1~n;28?)x9Fku}#R>7IA`CCBH z*q1~w;CKXpCGtRn%i03`;(s7|O6t%w^G2|MTj*5weQ6r`9n3#H`H&H}@ zg!5KL$sqEye8O&d`uwiQw|1Koz}#fj_l38ku@t$21m6v$@Fd3|uPD=`99+*d>{}6# z-s`p?&4=td0csBF1#VEAen6@mR7IXDDMIXI7~nq#HtE^|kc*lxEag{~DqZ4w|E(X) zKe8oe1ksFYEKqLp5s)vm5PAPGow>I9bMvQj(?Lfr@ST+UdK~c&b|08shTW<15-YzT zeyhruaDfxj%%3VJyDEV9dkxdPp63+b92Eu#E?CI%8~!ck)U2Vi+#T#*$tQ#Z*S+3` z0Vw|;GM>8^910KntV9b4mTq7ru1d1d?P)jAOoI*Lg_J%Pgt0|MTTRtcOY@WvhN0NWwq@An8S z;AJ>#r30vugPps*gBg@VDq$Fwkw!8Qwn_d_4CIUpq(luYWEHIIJus&vbVKvC;`X&$CxZ=r|-RJHZcRd8fNyX@y$x_CZ zUL5C+B>4d?h3-Q@u^X4|niDEGI)R4>S*i-ay4Ah3;r;ydSCqH)g z#ukTb`Zthi?anKxt2}bZY33L9guT~ai`w06GI9?V3xTA*RVTJ`6y!dGimr3Okr>?? zhXGEnOpNq!hmVs(Cu05x>Q^8+DoVY7?C>^jwK0#YkQ0(9wfBPNee+ct_F@qJlRU@= z^Cfu*jBNa-uJMFhr{9|TeUhIZ43amL3*G&j6y@6Uf0sAF|BJw(jKjzShiC12JERH* zeuxF99bbi*T=c(xfkT|KBH_k-t0?6Djj(!vpa6J*?PYQ#FFZwHE*~ka*=$Rq<(>k} zY(aI(m#21UEq+#MaLn}O0RI`_6v(1K0(iO2e|S#UVqnDlf70Cl@j*Zt`2V5i|NjUK z{MRV>KZk}qDg0tYKPRR((_B65zl!i*;Upu6w)_j<^yFd-x(vw%IKn9L;}3}tial6H zZew&}-;dT7JgXEB>+>=<~dP^y3=>}vD2Eo6)XF2-)S9N5R4s!^lPI_Ma zF=W1HZ=NvnKMEB&(bfazur93A+(@P@B)}$-?Kq!ZeX8@}12V^EomU4>+vnws9)oO% zWldqo8PvRa>lh?0TaIpv{^9!B>UVj&baX$Pn;@eBPf+iCnFJs=NSVKG{BiC_uOg(y zsG*tOsgu))C+Ik~s|owO)A-iIKo7Y<4fcl;0L~s8DV>WWy#rcbL{V?|Wc{Xz# zJ#ty+(jbrpW;EcK<37{^I5H+m?0jL}Mf7c>8%N7ktsi)s-JiWo){FF|kCd5C?N3wDfc&^tVjj&4Vv`oO));Gg5(H~%y&5EQ0d#(M0V-=t5n8{oFveOs-1kX)Q$>dwRAd4nT}KPnVPN?1p! z=INsgle&k7nYhQaECy^fGsB=lm|D4M&VHS1Cw#AK_c9k&!yfuQfgQTgZeHv51JK&pg0qhj8M1@6qhtwpal!L&5#R%_wLn`^fk#1 z2Ly)`hl-D8WH~mqStVx+cwK#dVGd7lJ`d!%=9VfI`&H)BRztR17aG61QjVgkPaWfV ziUhrraEp}!`rtR(GC+O8rUk3aY>`XwnTs*R0d9K3o}=@$0bnL*N+n=$F92uPysp)b^;e&m6Rfewv2U|W ztUt*4s@bd6bxEAGJ7fp|IR^{+FP-sJ)#fkt2#Xj@dS|v-K7fzgpDMUv0oKWlrHPf`Bn8M=&}$xYR!k~blGL}?&|idhcU0vK9yRv zuLWZc5l-3Agw8UwB?aXlS#{pfl-hufKa53jY*lhcV2~8znHUckgFZR@$id5vbU3k~9f(uY9lw z?UHB)R&7)e4k!2fEse&>x_x{P7x=JWLINCwV%;_W08YA;UqRc|n4!fV9)|0KsmBu5;e@#DEvY}n zh*fQ#TlanjsCnKBgf(WdN-G>0bQ^1*K(7ipejruUv#K- zOpl@zc9*(oB~SX!o^Y~e0lMgG5jw(eDGwoJ0!x?L*bUp)J5>Ln_%0LEh)7J~k}cvE zfbZk-%;G*o6Q*~J6~37s5{5*zjoYV#<{t^?GJXb_(E>IFIAbYC2GgDqsw{dIEb(nD{j5RT>WnJZt9|BUaqET z%(<8UCn(F}HE}w1$cM;+M=x%JrCVud%gTA$zpdiTZysOqzIK1FbsfTPIv!AzkXp60 zPg@LgjN1;JXJfsSJit53^cIQshI02^qa3lI;xp%`fmEDDsaF3(>A7&t(kDDYy z-S;3s^Ef26v}&H{mvVWe)L7Rz^v03~CfDDPe091tEN2-(8vd557xx70az33`Bviuf zh&R7{>_t>zw<3oeFjmFwNDxw8zp~Kp7&;hTw^)(=8=WPzGp0~fg14NSuD$GqZY$;< zjIoaxF?8u6D0<=>*3U|pG5G*a*{e{VE`w8+hX!s6$jxbdA^Kk6YTp8E<<=JMmj}I~ zBgH-h!ePU@5d_@6ah~3b6Ig3=w2RFk7B`V1!Qkws0_-_dg?rcuuDtYTN8fr;kvscBVfsQ^ZKv@3jjjevm*ezhS&tPi$T`~p&v0Se9Ct?>zeIc@X`VFus;mp46 zH&8#r@DLY034+C>)L~5RR_s*TC_|PmL+AXGkS5$chkUbk6?BR^zbv_w2bAEk z#Bl%rveP2w#`W1h5+G5Hx!JT(56$;K5dVa}`>i1dsv6oVV2_RSGu~x()y+}6eoBj~T7F~WFB)ci z(%q($`-H~x$#N$|Co^tq8<+xjgs7k#Ocp1myx!RP15u`@Uf4wCzy~^Bzi^b;J4qf> zfTI(6t$JvbX!U8@+qr)I_&nLrWr=eWy&v%eEGYzUapE_-UiU1*fsNfZ@~4Zm41NQz zB=JpE8*4|e@rM08SiDrSh@EmBW9Cb!J&+||gGAkO)iTCvdU-TZGg&4Y{PX~OI#rX$ zlk}J;l&M3${aa23S!cid{m>`GD3=@1$xUjF0CcZQ8!Yd9_LGJbRBWE~F4f{Y9P{Kr zcL&p*&7C@+hN>Ow|$@XkLpfB2$tT3XD9%1b;6^aIPEp!5|p@Jc@uC9zYGDE1Ab+e`Hton zZrwBC8DGC{b@ycZB3l;9cKzH@%PF3Kt1nU)mdRezV)xJxz6n z(D;{8$D{!5kN8D<+;eg9kaevgbQ$N_+vX@gNuMG&g@2Uej3JsFZcO!h(+tnpB7Ly>x2dkoB7EZ=j|j6YY{w#qxm z#6~XhPTD1WX?=mPtFQx~i9qZuPscv}h4GRqcpkWsmiI$s@R=w7=cQZWK(A;3GMQAlfEtHGLmN|% zut&ez0%URl#Pne}Hw*Fi7!?H|aFRcf>qRV!8jT22!8bYRd(h@zE+H}yy09Yq3>TZp zVtcg9dwY;Fn9K9W-5{0-o;yE2-v{KM(MGBMrEOVzEyu`xSME0Gt0AC>rl$G>B((_sAM|fgfw!mtpg6@++*3O2U-eTW2rzeHgu-W> zWd%!JHNMEgBD|zNJ(vHSWXE_L{B|5yT<8vR|0zKtQO0W5XJj~{#*4-J`gOH54Je`Z zfJY*#mNMmcrs{I~CoB(ZlSl63%N*A6{iIK3V4n035;6R{+X#BP3>1MX2*A7pjbD+A zCeCe1v@+l6))_PeZT3)xj0ar_8eV%EE`L~_eK&$TxZAlv{9$Ej9BFd7Y6Xa-byWQ-Pa+uf}y}n#Q;Grmgm~4wK*^$4H6aEQN?-W56`!g?eBL zL7fu9Oxi_-BCHq>WOAXPntGGusA8ofC_fu2DQak_p^9y&#DL07=Hj0GzBGQDqbIEu z7>mJ@G2U%uYx24=QC$2Zp~`KkRq(_rXnGVa!>8X0#xLvvkJWjV{|cP}iSo%9*QHjk z7o?RdPM{=_4>^TkI}Czq9k^mkVvs zhcMSRN`hbHGcvp*Hd0(5XkUW&O1LrLHYO43ihhTEAAFZ_qBT*eCd-}4fQB1+y;zm% zWnXDBq<-Ednb~rWKP>Ts>d;;ZvzQME+_bp6yKoF&@O5_}ryWQ5 za&ylIDxKh0M83eIljvVNkwBdT>4aBX#R{Uvqz)8`K^tlIEH5HYJ#uU&){rsm0?3z! z3UT-oUPo`CGg?ne^f_rxkZqNPKR;GTG?3UmVelKL;F#DSE`INI4y(M8@E#D*u(E?a zRUy0sKUGGCZH7^yGt8A`mT?d|ww0!l2^Xg?7T+Sq_!FPY-#_h7nyzgj^Ww&A?qgLo zxwo1LigeuEBZIre$omgwOPeDASF-YWHee@nrSLLAC`sXe(?)p_US^NUpGvw9!^;5& zsQeuO8qzLK9NxXzc%i%q=eqo~yg5@(MDYa4m=sfOiLhFgC~w^Ey3s71y+#Y0Iz7nL zi%j10Dt?`B?m(P)6Nk8$?0Yk<6T368h7%j{|Ef?v7=017Gk-wR$zclk?KQb`#~+FA z$ww$CBL<54v13e}$S>T|B-oYCGWhW)#3z8R*@uTs!uvcBaG|lqpAoPqvTxF$52hCs zwZyP0BR-MM3M9e8JEwj?$fI=%4keLXIiaL0F(mkV?p&gri_yfJTnOClTrcF&4EUBr zR-ePrek@x3A5)cFn$;!t@8q+`c0seIh00GE3Td!6mjZyo6l3w5uS+g^cMf+j zW_F7LuQR@nIB8QU=4cp;Ns{T2O-Rg*B9~v0BPuE^_L!~e&vGIH+Ey09E{1?rgxfeX zgPP~N%7u)FhdWivv^4VT-wn}>MdfR#wBHa+$!d=bS|_V_Z&ET#8E}((&>eIUI)YUR z{+r5ux=~cA57h-!hAWjY@X1*wIO(QJb=5tO*|TVCv47q(|B%6Q%DzdAu4YHhW96e< z|9@<9wVq~JeM_tY?;+}6unMMnc2xKd z4e`zk{@oK=`X+DwDz8iZaDK@RTq;ZQet;pMrAKHGKDwK-7hp)aq@sr^z^xC<*unM` z#bWX9(44M%Ozfdnp|TIxuh$N5Ik%4+o3gle^cy6FEvd-yOR6>)b5iu+#P_hVl$1pN zqK!}F3Q{Sxd$LQ#F;cSgB2hTeYHw1_-pU34C!4!gd+!8PLR7syl^u1) zk4Gp$2dW!4=4iL($?vpQ-#b~H^MVcuAkVdaH#>3FyZOjk&5GzeGTEA|&W38g@Q&S- zM7h&-TIQcN`oDKF;6C!m*Rw8fUI2^Dp{PO!D((xuEGSD0kXGPem5OV(-mnUUc4U0= z_Uqms{|&_^TE}uLMxd|`RJ@E(l(Wlg_HFP$+5KG<=OZd!HlChtf0{IwoCVy6bQT7v z^U{{1^dC{dfq{Y83ct{Iq8z5a%xkSHE0SPO+AF1k+qM)c@t9KmQeyrvuerU~ z)|r(E#}TwgjyD*}17t=gJveg-cIVC&NWujCKan}@A2Q=Gmurbg;ogl>yRG||q6R|b zKVnwRGJxXuO37ez>>h2fFv9_U1rsJBsr{QOun5Kr9h z3af>~mvDZM_6Z4(7r1Z5d*7%@S%wCEy`Q*;hqVPs%oKHvik1g{&}^k3Xdz8%l^IR)KP0#SEB~ ztWnckKPt(J_G%T=hXNp1gThJ3g2a>mA`;d%_x06hJaf|w-t7_XK7nPu>cFHi7>e9wABg2)#?u5Sfnvy06SYNcvA3OiB}*RPr1-UB3)fGQzJ6 zI8G#jlHD0-eadwV5-;rH9&QKDo`2rWB7F=0FL9tq%oBkUB`&(ZWK?57x!r;slBUla z{ZTA088J^%KVWo$n}n~{T5CRy)DXnbXGH@+h}+VnN&wtV*?bk;Zo(hjqaHB@HuR4y zuQ&y>Scu+uFR-RcdCi25zl_jA_#Qnn+|a%90jgYp1M9DbFO=n$e4If(}FLwlM8H}r>(BQP!0i4Bx;uMErU?T zaL!U2+nywwr9AYrKQ-~+OetiZDB83QUaDFxer+281-SOV2Ec{W{^P`8`78@~KIna8Pt#HN>iWfR#pT=?*tJU&#aY~9n$db|hJ#FL z5ORK_n$ zh@dxth#VHRhrF9aY*3MbIf9MlzQ~POfi>f0B%RGnz0=p@Dq6Q;A^oBEQe?1qC?feE z39j3Ls6P6&v#;>m*36>EJG}XsgpK~e-?EQRonHjxU=_#b2=DNz|B8D^k`Hca7E_s{ z7WuxYyd^(cB0u}%X!+}Ma{Gq3E3AiRDA5+3#%A7aeEr|ymM|N`6FkWzD>jW)y?11b z{Kq8t`wws=oS>bRoaB`07~4xWt%biTyl#@AnT7)Xmt+-eLvq$_4@9S#OK`6N`C(*%C)Kd)%wt;Mdv2<`Tkg0G*9fKxE!y;usqT|xjeLm6P?hZYFC^_FFBEO zbWulO(9WfHIo!~m2DH$8!%jxkAk#7`$yGBbNC|*Zb{D=q!B08~b(n&J?x*jZHLb0! z-w)kTFhxgsQ;sBRJrb>YVIuQ#zlH)a(WQ(V*?nz1`U?7`_l>Q*@o31QGhzH1;h?Yq z9e?$KBtOy2P;Hk)^=A^|<0XrKrb8lBBkNe1|8{}wi)a7!ud$%4Tp=WtO~ceWX0zsq zH2fge_e<;5bvWtWq&27z17NDbiPbqgK$1F(W4r(M`3_AZ$PE96g@3$s`rfBN5Hup< zGN@$v1y3_B%0xh0IWplb!#gX1+EPt>|jLAO$(J3jk4|G9lDN3_{LR>QF+%ia^*U$+6- z_l4~|B(D!r51@{TNr%&M1jd}bdIZ{KR!5x`h-7Gt;q*SKtW0ctf@WycjH24#J3Gb( z{njHehU3`oTKVK@H9dh)>{VeZC3+@!Ce=axYSAfkrG2N0NIiyu-w&e~kWjyG^%{%3 z9}4@ELIwr;%PciVb9$dlh1LZ!F>nzZia+*ysX*kL+zF8LT#6->G`ELie0TxrA7fIR zeA$Cb<1&9f{D9dvVILH1KUvCf4nRHlH;KF0TUM6$Lv8Iu+UVGrgR@|~4-eS*lv2r= z0;^Mwn#`V@ob(H0@X*jz{%@~2lSa!^1Ttg0X6M>xZFt(MZ_(tg&-A}B(z4s!k*|JPUZAo#sMOqt^*`n%$|aMuLkD@|oEj5#7;=D|8oOM%U}V1@+$G zbCvqh#~C8j%{w{)r>~Y?_--?JPx?XG=3@la&nA%ab6S7p-grLxMbF{>%#+khaX+6toHQI zozKI~or#}(WOXO2`DmJNY}ft$oaE??nQ(-WYnF>+6b+l_PgNS3H`MM}A#6#Z)j4QO zVF))0NOUG`L$;h?CT1Y?o->2?BWgLk&hT=swg8>OroN!ZZbJT${#y-}zS+9KC&z=# zoS8!@5)GK#S)BHyC976fN&SZQo%s@<CV%ek0H9 zDxxyL4^Kugap`*|wE2d*O|ELKmEnbc5+%jv+p7%n+URJa%P8yskjkmDDsN|JC!pd=~# z{&@8IvBhM0uTKg+HvGiL-`<|gdtg^%kET80=$TaSDGg&%)uN$-u2X|Vplgdn)0;I% z_38LeTKS;kf7BA}J~q|4#p%58!3ZuqOXS>QQR`y1>=y^!WYMb7p+aJ#0dWT-wQh%? zCW-bzgYZiL&F=RZI@_(~jn8o}P~wf}yl)t|Jrd=ccFc6964D?5&y;LmU0d&nK$Pef4h0oi=UuIjuF zjn!>6tk8xqY9HL!_m*FaC60Q~fA4JZTMjfFx>MvL%LE}cKHsOxb5V|0ZP7i<80#vs zCmGe{s;LE}|TdJcw5iuVr5z#}pNZOQ?6`Z$Y?VNv_p0!w9(Kb?N;YCyf@+$B1ixoi^) zU&Xey`FQ$v^(2NClswCcVS1*cq3)EqcwM88_iBud?F_xdG$myj0Ryd?4>XtuWtfBU z_67U4p&N{i3k}9+_+$V9X#PI?3PV%p`x`WvZ3+H_FowoG?vf(U{nYJ1nV#sd zvf+@V97P0ebQl!Rlb77V67}r&_m3S8jggP}9xwymJ}oCCo@+6xG2-Rc0y9s<6JkB{1#ur*R`$x8_6QH?RinlzAHfo#}=p^OJFDqKPn#T ztHNJVetuL}kJR&`3jLs#DchGwMwd%;B(@0_j^7S-t8rG-N%*251vtd?|Bq){j%EAv zJ(%%!J6#WkF}>n0vUO~bV1xRnbAjDnQZLU179UT08~Zcj6s6=x_{VJ~)7Y)6eiwR) zcwQ0OxAZ-IRIRMJQbDBFwbydhWXVRSqh+3-C5{o$uX}qhv#@C0z<;CGs_R_cYLT3i z^QTZ3mYjj+#CYNQfAtF*kvf=S)VuX-n&$jBgdK;S^W9!})vdRYEddLrbA}4ElL3naf%tHY*oQRg)U&&E!72eSoFfaqO3Roost6k!Tlx zq|)G-@3tLpiuw@MC0)M#kHc>VJS?$goX4L3F&Se`UO<}FUk%e1hDx!7CSy??j?-5n zWX_)t4XJQF+s4Vts;0x8B6I1;V4baTO_4c8(a(9QaAP)yMP8vJ_lb|On&&(dtMBQs zKBh9qDeHI^HP4?+-+dIrqL{iiSb~_K=UofFKIZh)o078*;M>N~zl4|^@^K$#Q_~XJ zE`Q)n^5Jlg@6H##$7rHc_;+qrjcCJ&dSgk&iRyQSei|(z52GNvBfO91=2woNbcZE# z!eOyGb~)6m1kh4A<`+4GMe>ozW3J5?JDhFMhLE%uQklPRJq|Ao!KCp=KXP{V%&1~^ zJo7W@it?r+f0*exiav?yNr|j%=V@hL?3HQ+GrYF7zK_Ws3xc^~D(Er1Kixq?Iu6ga zzTg6&85hAS0E0oNtUmv!7jZ6dY;^Pp>>MX&vmQi?Y~9vF#t)yfs9~GXX}t$y?L1Iy z*c8cQGHw%L(C(j#lfz+?&u1xFT)J3$^d~w3K3nbgiGZNli86~q2qX1!UkO64~x|blu98rBIneIYjfdL507}rDY=Z|_J2m| zr@$DF&Uwi5hcR4;WNKpOmj9*fJTN)As!YjTf6Tdao5j%95R`+8YyEcIZ%NaE#_FM^ z(v*Ci$OvF+XlOXlzV((fmQAh0rbU%C;VGqZpyPXReh37wo=*!GAm@=yAU1_i+X!<} z@=U2@83p+P?@l3D@aUO)DzAdKNZ_H`tXcaUrI;5*L}A4bw>5%0%b?v(1%&x$SZxH? z*Vjjx)u5=)ax*r+db|CIZlMtw7VCano&}vO!wlOj_FzAoG!0@dA5C|8d<1s4)R7Ik z_(|qf0Sc(UC;oi-etmDAjD~uKuik$&J>s+NYf$svaB*>&q2Ms8^E(Ss>*=-B_iPfk zAnlG-t!FF6nRXab3ul|3pO^;qH$X%q(Zh%R>>(hs#yKG`U$_B+Q^R4S@g|XC+!oVd zzr3Fy4z#1A-b^|gg}?v!S`zTy7@=c#Ey;tSg(HwnEw~4HZ#`HPl=%YUR)g_7-4YTn zS+{%l_N@$Lp34x#!Kz-k z^8Q(Aw;5+~Iib4~-{M=wfg(39z7# zTqgmqg6lvTIqCWvTxaBfltmT#qrOONYMB9^2J$0_>b+lK#WKjB*b2a{DN zaA5Y}_>xKoYcP4Mv>kYzk$=tlhoIgxrD=aYb11a?L0c|5Xy9 z;T~(DI503vlg(@)s(M&6cQStU%;jO}7UqB7L|N2v0^=d=LZsPkMdB2CEv>UIZhC&f%O05O?5x($REWXvAva%qqc+Dy^?v!{s;QSo(C~X8!gq`I zGB{QWI>7#}y^K%=ET9}wBv*v$e|!zGqLYk#ZPE|gqcFU7jY@Ss>2cmxG;A#)?hGS% zR!DQpmK8hN_M!g4*8#Q{$_`m_IY+47O*|^(Q*NX@8a(&onD{M7WBitSPQKE}u)pXz zB_i6mkcEGz()#%VVUx{1BB`)=HGor;<2%hNABh@Azep4b#iplQpCIw9DCX9zS4yyx56_`8NHFerC%{|hdM*NUK|UJ zWLwoopH_MK35rQoaHBw&EHRrIU~_2J4+5W6X0G?cBhdp6EWggIvlwJ82CcjJVVS4M zGqXc%*9fkle)N3GG4s5aQww28u-=6ZI(M~pVO7jy^6ZjZH(01f5Mz2^uXnSSTgal~H0z;`2KYmu4mG>y zc5L7rK%y>U?_hWW+-a7Gr7vtqel&@snQfDwQK@0o;tD%c-t*Q_c^qeZ&To?{Sa4k7 zaHg6zQw@o0sya{POG<=4=7jd|zeq^V<%N}843xV-bPNOqtETsly%CI^3CNc*-lS(g zAb&O@-nVL(B+jhz z9NgwBe^W*~_n!I*J79F7+-BdblBzjGWma+`%g%jhTQk#Uzg+3ysmz=NdvMNj%*o*8 z%@`izS1-LXyp#2@lm7GjujQvGCdq@~7vK+FRPhW2LoY=5G` zL?zG4`w|M8-H_Hkv->e7)JzX?B0S(=JA1}hM%|POnxV)_X`KZr#7{;3wnkW3WL|I^ zWnD6tfB7Plrm!}mT<3l!&jO7wF4lx z&@BOLERnnDqcGDk#@3ImJ1N^WHDLNs08fV!-Knnp@WbcSTTM#f2~~1I(IGCC z+R7AtM>o}zG$Orp4{V+_d`d8Xh6uvWs5c~8$Z)Crj>AJeE$JHaQVX%)+4tCX5D5$L zVhv*MoNx^wiA_s{4o|u^oV!y6DjBvYo#p3aF)Qz%AU%y`t0s(u)sdyAyjS0O64SkS z{aXeWHKODfiXR_po};<~bH@6gQOP}RB_E;}u4RSvZV?nxPkH14QQ+s7Z+gG$tZ4?u z^?Wm;>m|kdw&3CRlGsd;Xyt~*k+wDS)aIw9d$^5sBk3;YN9#e zptCiXuXljE^S${S%=>WC0ea5IkgpPBbt3H{DFaEw40z1@v$kXHt`LT%$d34tw^veD zixc56>Mw;^n!`W4I5Jv_VzF@8UAg&N2mP4O{ZBh>uITXHdpU^~B=#Nu4wM}%o>jUZ zrJy~zkKTI>Ybx6pR!~xX*zc)0PNK3)NV?6J51_Et~Rl@qD z9$iwSiZ%O*a_0Sw{pcJr`wmY^$|YbJmO9c=I*iqk^$Z978BR1XpZ2N(_`!@S zNUX7MTW{hpjkE3HHF*&SynuJH1UurhOhm}Dz*S+s2x9JK{cZqsL-{yy z-lQkM`Ia}8?@r-w)5ynzcU)^S=buJ$hON>yh79IYAr1#<@_>Rm%zDseDQ3|TuhxOF zAX!g2^S*=l0G7D%jFRqR53S2=NVE-t#^&27{5^H12rxh&{COR*jN~}my@r8$mh0($ zP9tcUFGdQY(lppAFL=9Uk#`jQaJ~}!nK6kAFn~D|T;BFJ)wMAaUj@01ADwk-l+`Re z{K-{{oW=t;<~1~*WPc$x_f}Tg60)q`Z-+Eh6`Y`21^qA~ZazGR{495&N zUh1;wUMRFe^SHrx7_vhj8X4-`1Lhe&cSoNLTRq+wGQ}YK%^*Fh^sU2W{s~m_Ido{u zui?2oo0VT%$528j)T0o>nPs*6T-XNRQL37S-2n) zsCf;6hhOtWY~Op_S&*ni^<;${(Q2N!w~zMH?{g17wJhKCFo5nGCQ=RTQu+B;IW%RqJrqPiTV|dA@x1_;#B^@0mq9&8B4UzH3+4QynLi zGt^Y8i)J~EBxf@or7C%EKlFLWI1Hp=ipZpc`2vaX(do{^U+QV6D+SDq!*_Is5EtoA zF@;6#LEwx(Otcs$uiIAw?0SR+cc*QWnscuO_X_e+Kh5gVFDph7myTZsp_%VzZq{x) z1cv~Ec`f|7WL=?h%QN@uoSz%ptz1vG^IqS?1r%fGRiHi~$x;s-ygUK}8fUORkGJNOjMfDncx zf!QB-zzU+VLJ)xeVu{1kez_^mSax_gx!c{nP;SpOb;)h=_vdP-<)Lb_81t!J1eg%M zO)R%hU%Y&VuDZ@f`b643w%?L<{pi5AMF}*}5_0j&I)EF@`+m}vP{m$HI&lCTg5I;> z%oh9@3B*N%+F#uslN99T1F7$F+)#*qyAxruF&C7<0vxIH_G&-=p+Pn9YMMI90M>N@ zW`5Y4DhCU;a&j_u*5Af^t)@Yj-xUiiq3$@7);FtwqSTKcA=$xwhn9DC-66esi~!eK z*r7k(;&luIbKe#|=MbZ?S{PGc$fI-y_$zLAmX7$q#WW0GE@Swbq| z1%Mvl<{Htf@7$9(h1LfT?S$^Y8Po?t+Ntvx z@Cz64cokbCmMc@o-IiM5fH~ukuL`t3xw5!2j=K&W*cupvco~V<xJW3zAw6VPYwRUfHj!qWp>Ny*^iHwp5QjYVJ<0Ex9g!Iat`gE>B8r2NW|%E(RwkYDDGVfbXYbkB?7R4C#%4( z19Rny<~KexrcSm(E6{>w>(BB1i1S=@&N`jE9%BO~>!1twByc#!Qb}qhBFGrFYX=!P zoP%5Bg8&lMFT1MHiQO=!hm4Ij?Xppj(PXDP3RXlA_Rida{zcYn;CConLy2 znFTKJcdo5uoxq~wJNZ*kgP-!vle9w4sj!PGQAwgA7wCgK_fU2m9}mrc`5*tHUIjN` ztW6!8z)27+m&xSkA|nbCI@#d!V#P2rVk#KWMLv0u55^&;B5uMiAAXI>ELdFJR>v*! z;*S2<-N)IZzu-^Y4e1)ckd6UT*D;Z2ClNJ50nz9$zQB$`F)e{p0RLtXUsXwi&-&RL z*S#HA-A#YKP){hT2@UmNSklPU|JBudKs6OC0mGpeX@Uv}h#*xuNbjg1(gakbOK)Q6 zq2@|aK#(p)nhJ<0O%Xy5RX`LF5JXBsml}E!LX!XDd++6G*GUJ0Yg7m={a){{zNRQj{D>l}*VRdW) zk@qpP-?m9ZW9bd?5l_D~^;9#_X1R2@(5c2X=Y-$LQbqJ01Q*xtxxJ7z$5d~cS zLU76M_>DWUzmRuGaC`R)g*yNK`DV^O81se|g|cvj8y(*#ZtyGOviI%DSN5k-XZ=Q~ zU(Z%*dk_#5p42w&d#?%2n4@9$Z&!TDg~-61<;UcR6&#`NOQj4Nz=yq-dkd^#m8mByCrJBqQD~OB6F=`>e@jf=H^1w$TkrsKeBxN{Uq5Geud~D9H~faFv+`&p}Vd zjj^XWPclFUsv}}&&RFKQ0!y2d{Bf4 zg3Yud+Tmnf9N|0ns*WQI%mzzYLu`^LddQ&%%}Q@ZGWR!4R1ET4kn;@s2lO%yQ(rwj za;M}VP-UOL@gQ64a4U7kw7K{AjD1vMcwm|y91^+-yaEii77>JM@=m5!^2%rvvF=6_ zRIAqacyuYX?UlzY@@)~USV zbpl?2R6EAl$D9#Na6!9M2IKPuX&tRwMHv%`{-*Fq*?E5WXncEp z_iS+!ClT2w@ELiuJMB;Nff50fw#WnFa0#_`ARU1`nUnC9Z6_N#5zQ~#4NQ@~8Qwx4 zvC^kSA&~OWk)z>V2?A0F>A}yp4vmYjnBRax2M;B-etjlYQTa-(R5$8~?7X~^(8GO( z7t)Fe|-!L;{J=Jf3nX&17F)FQ( zP29@uhZn-b!$-Y8+`rWJSI`bSYV;=tt#@tM`@&?~0sAQqWP>GkqT5@`!8G%#+DMkmD6NM2HNXEU}9oSRnZKbY4nbH(V&b=F0$Y+(zU< zJk68UT+5h*Kan?4z*k1d>?Vd0eXM0dxn!T-QQvE(6s)!EE7V_ zl}RFDQw^+O+BT01=HUjv>F`pU%jZ=Db# zw2m>TSyGZmGsQ=nXBn%*v{~NeH(!qV4EN-XJ?{Dpa$6ZwufZ9j`9cLSwClleNTm}& zO(vK%`?hUOe7u4KF3qAI^gF)X^*~yxZq)d#SLC$6q>u-eb6Utb@`kqs=R%3h2B*8u znwpxSf4_fck=VLyCry5%Fg$J(&aRBh{!8CwBu52b5zSHg!C8>6aPbLB*T5lM6C@@P zvrEyiaMbgy0IK>;3O0y{iEYdc()k1jvefits(1PiM<>~jUk(nWn?e4dFI{7=LP}og zpK$!D>kf2s;9cC?17{#X_@u|Nx@6GL6uiXdb=8rbU$q;#XW6>*GG35Cfg_QYma(;& z&e-)n!M}LY&9=SL zN$K*EzYj|ex>mbFF3RDuC;}YVcIpL*dlmuTbvn-a&2+TMbsj4VgrK*4CQK}LLwcA!kVkk%fNc!&fdOKtsIP~@8s zrSn)~KAwM2KH4=7tuVr>=4wj0{bCK%fBb8?_YfhtPw+BEL!V<{2&4uBl%_q74&6em zqswjGN@WG_I@$_w>XuvR2~mCMSs&>>G(Jc)%{GP zFVxze)U}kkV8;>`ix29Bsmwn2WvX1?F|3I^w*_O3+4ZC5^|-0T=0)RviN6~uxZ#){ z2K|)hd46mfnRSx#gk#cibF~e7N2Wb$@?IDrUM4YB5HAyXB{1@^8UTG_ap8zgJz&Z1 zh2F`qBW+qQoMnhnm;-e`PMhbXSE}XPF4g1Wv%XBbrOpxxLh)5WSGk$HP} zao3h^m9`_})~PlQ39DH#S&ohudC9w#d8 zzL|x>wJD>uPjwITvslun>fXQKz#QAsouspVoeN2Lr2gm07&3?X6$LLqd_h6pS=OeJ zz0PFcPLXr+wia-n^$QBd(oG~2=81DRNF+ilg6sLwASUvxuvj~3A{SoVVBj>R8TdK) zTL6L8^)2vJ80=tsGC5z_31_85ndIU8caOPoDPMU73Sdi-%xp;oi7%RuaK@nAC0A`OFsT+H_F7J{?FhmKgRD5 zHTp#YJZ$PsKYH5NK!W!t^_%T}7lLpSTg#;h;cEVoZ2Xb4Gr{V!Bdvgx@(`PM?T+wn z`u+s!a_Olclq0;tELtzO>5@PvbAoiwnfBO(&!lE#;Q9Gs+LFP7^MV|4t0^}h%p46% z0#~2}0yWB$oid--11)qJ#=U#e#5n-)RBZpQV8- zGq2QV!D~FX`3@S8yAVeFFMKd>@*+-D6DcIRGqK>9HSlD5@8j>^q?dnl+{EVcAA}KQ zB9{ds56uuX$F`3P1Vkp7QzI2B_3nOKh0fHt$IVZXh8SVw{RtlaH|Qg)6#!~|61en; z{A3d$2Plom9Qc>6(8+hgloYfN;@%9uxETE0w)-;_1y`n@F!AtM4Rhdx{65Ip*$TQP zEJ)?f*9psV`v&2KxUy~EjG7IBu(-15ZIJgaf`W+R;lutqiyecuF za5!yx1MrvOdNEZ1l_f_gm9H)6a4%g**9{f8EsPTZ_kn2D7rr<)L#`b0{tI7yPyVQE z0wcCiXzZi)OGpyuwIy+)(s<((G+gFAewMMN`G zT03T~(dP5z7vq4?H>U@pbJ*uPthKPTzr6jbhZYgZrTt9j-su?USrii%&T%zqNU}y+ zMTSaZpKcy}VU64CfDzv>20Heenh|uwz#=nM@&8-oJloVhHpbH9hSq%d>1&}9ZAatg zfq?}}oEtjoq_-rpyqqs#u!GQ;WUy)i1JLL#x>07ZOmpe2S@Re##AAkOUWKIrMeZ9v znIZd;OCrdNwlQzjacP6e;SpxXYc;OqhgY^bY%>P5RCDFaE{zS5E6K)|mq*p;NnBG>3y&jGL$4#{ie8e)1U{x$Sr{?%e8eMxH=iMu-AqK!U6>kULuH@Fni?f2hl6FN$?cQvn*h%`P;YBlVHFwRv zza!%7%_{*8)33j0-e=SDAMl7{YW49r(Oj)}i0lII@_2;fR(2EwKOEgm3Ur9jCcs7~ z1x6XWn#l7c11zae8N5yfxU1wvH|DPz@hwbnvqQA}%;lG{Xl?slasOol{#Ab5=f<&? zl+pmUEIMs$$ErB}EBxB}cWq!TwsCz-4<>T^(#alcBsc9l%&q0iVyy5vs^S}_sN|p+ zKkmo~DrjN>NpO^*%WY?ixm7sen6{K7ZV)}q6Kb?{;1EgaA=z{T_&fA}P}p=+wjm-b zR@-Y6c;@LNApXj}r5UPv>MuX_PzMDC&3s-Ns1IWehGX^v-jtMd!`dEILvvf~5L9Ul ztzcv`rC$H&IqQtKfswm}uZxQ=|M%U^yE_k*5;LtAe+ZppY`-Vn z?s@L(wTY$i1ktiPJ5}!{aHx^i-Tl@w1X{&J)Z+7{f9U?3<60$H)sB(&pxn4~Dz%Kc1v1c~HMvj!|T;9v^k z!5eW8di@J*|5Z^mt8TkVKd&`8TeNAYGk5Ssn-#CBk`g#rnpoac{bf=)Sr+jlWJ-tm z{jbeNM}xuF;k!b~+#GF^p5JrFYTb;=S*nc2{4l*;=wIF!9iDo$DZT<2R6Qz1tppLz z%oK*W)v1TH+Bl`(8CQ#IWU67Zv1f+4VmUU}oqrH?u|77$a+CKdicm9xZWXC+NQLsX zA4Ga}EArD$q`7LyCYQeP3{M!zi37WkrjKN!>>kQJ7e?Y3%8l!m*&q@F$=yV=g0PZp zV8-kot}PlmhrvF|xdH+r4<`VpPHEOZ3fR#bXs;Yq7j2 zHMg#v6HY3vS+`s$=e7IuK^k+6r&J>12WIO4k2z++?bEbaf zHj@6iz#s5aRPLa_AM6?U{PP)o%0e<%Nac)N^g4XQyB5sH;J(j<=Q}fBqgQ$Q!odD3 zh1sR%qHyn7Fh$Ikc1?Rbsm43a`!lm{ajejq(jA4bVCWLD4STqm*zfkiAk1tIW*!B- zlYbJk^6c5O-&;A??QdEGJXX+eg|%%D`hSgNi6@TY*qBfc61kkZjp8A=pf0A|qAZub z6kTRwxU#F7?MiUhL4NhTs9;>bHSnF_qfl|!YMM(i7TiHJlk+2UJO$sFnVGR+2GO;_ zP4=`-@R~3)`V&*OR*clS$bm`Xgrl$JZy%@qaQO~l1(q-2lq(2gv@t_+HKyZdiGj@Z z^bHwg(p&@0%Y;w{HHs14@rLw;Fyb$5O18ZDj&nx`uKKxoAtVn=&1=5EEJ04`5Ga5d zhFX#hJTE#dXI6|3?gML7uYE~wC@df+(x?$p(0$RR$!Ih7~ctf`4Qn@+t9$jweHXkhM!PK4# z@7l$CwHzzy)#g-F0Y3n_-|3Su&ds>6gTvWRpO^jT!R5)XgCdFgi+-;iirEXsTZPDv z&)*%SY#sjPwO+!7fT=pAsO)e5`K9^S=;GUuJ9nwZY7e2Fo{eVi`NYqt^=pS`53E-? zO;m2Wbx`2KTQ_*he1)`J>JD>ikjDnee1SG|on}J{A>X}17k>fTE3F1}dk?XL)mNsd z>`A)SUZLl~35j!bkEa@}nUcI@4d724kNt*z3*@a*s#2sBNVCSRCjW@U23_8eAvZeF zfva`5sxND7Ia=2Ahr56)aT%oIp7Cc2QR>$R*7nex!9&jeSwmHcH21O{Sd`~3a%8c2jV`sjM5 zcC!R?1qb?Vppi^5Iz?WhK?j^;!O!q$oM#LmI$(!#emuEQ`ny9|lIuA~96`#U+HAzf zf91uoYFxd{=8~w%iD`I@Lw?}lCZV-{3v}M(hyfBBr!M@P1CoRIe>~1P7W3tge%Gl$ zTBsC1dNS+eKaikLCj*E=xJ`&Xlvti3YVYM1=U4C}jfSNVm zI|M1<+tS5HQz2}&4Q^^&+jFWTKMhTD=(PBPbK!?M`Ra24btWL;b->hKm$S^&kO;jw zM@>`PeCjDUQ&2lSZerNzAg&{oTZ8(gl&9(=keDDHGd|oY^HF-8MR5?}nddI1F7TqEavt71~m5kMcUfyCZ zT5!KYfunu*RKCO8HsiGf7o+VnY<+E5Fm1HC+HG2z6(xloC*jN97c?sOy~Z_x@) zU>(T~VZ4w<5!0`8M0J5N={~Jvt|zbJ22K#=tFsUI-n|W&_`3*vrc)IqMBW!ZfCk9#C9y4~w7+#j zSI_o6*M>)=5-~MVXGII-#ILnff%~v%k|-5c`xvXe9n3hzV5*gBiTOyo46hl~@jkWH z6h`KTp3EJ+2ly7dV(Kl#(%LUG znNPVrp`;)dG)}U@%`QRmq6l+^&{ex*J_QmJND9+Y)$J2?`&*m3cc5q2PsMyyg!WOC ziF^5IWoJQ{uHq4ft6y!|j`EUnTG;KR;i25L%wWL6T*1uitP%?}OD;TwrZr^^_3!3UO&{LOYOn8*BUR5q1%8ws1X9>OiMAL*h~v@e#M9rB)&3j~-*9%`S-rZw7{7B2k*PG<@jRu~?R@-kt3tR%ck{T^UwUx4x7s zpVaSvSQa-Ff9K-%PD9w*V?^M(yzV{IzHdN6|6Z0*FggIZQ07vG4X)P^=Kd$L=1Aq0 zn7E2M4u^|da%UkQ%Q(Du3ct`!D|!3EM((}RtI46G1Y>9aZf)IkbOb65D)v{hk!rRG zCf5ml51FkLZh)2-5)nSvIrpedI1Pn?Z)78{3`o5pZ%kPgczoD{rF+koX^a4Px1u6V zIDN(p`*DsLc?v((&PwG7L}5S8Bxl7JZxPuHA2YNa!?uPp1(d)1{=D_@Z}j$n6y~%k zRM-i@^f$AV*57Rw&5@`P;>C=a3{pCsvYM0fco@vU(ew4}7#wWCko-NCr;yc=i6s)z z9;Ii>*O#E-H;jvgdIm0SZM}(Z2yIeG zFDCGB1EX`~M$jQ_n&vN_^&&g3&pEsBoFeYe++p<#k)@H55kJRMgS14yaBmWn<;5Od zYd>aKCcYzXzu9dVyQ;}}6)HE+^7fqwq7Q2e^<^%A?JbD|+hk463PnSSydjf3qgIxH zzPZ`4{S@0k@qoD!45Gb)e5HVfY}BG#<1l8Ogx7^B%TAElp(8#4jk0{LEhRFtRF@83@mAlVvqfo9l+y}5iFKGhK4O4m zAm)F6asgCk&PQG;dOgVkd-3&?%TG)ZcN`m~!Q9-XTng6kt^Vn0juzp61TjJKphp9u zw~*{~$e}#*xz$1$Z(60w{etz>QEM}nSgw`KZlSMh-??&9Qc`SFE@_764Vb2R$6NE2 z)cpQRC`^)9OH~^Rvq1iln^KqhhS3#GS#0D6cCN>3b%4{+TcoK@#Scd0bw*Rs`Jp?a zN0vVzidgfv0o3^S>wU)+)?%1W=w|NN{xj-Ky6!4lH4e98A^9`QZKW;27`bcAH30^E z{ZU(sJyW8I-}UfruRwLSr>gDl6tYCy|Hx3V?hZWf-D`nPaH0I)cMf1GUy?@F`R9=qW|mt@4g>b=?o0u#mX)R&|SSTQcRa zpr9qGJ|5%njls74XXbzPH3Fv0*PDM$GXCIH#<6%CfZ`U;+RUbRdh(S`udx%x1!gYn z0ktE!u)TAwScg#i@+WNTTT8Jq-h7CH)b0(S=5fbwx$;#ex`y&qK4W#@SvsM{cQ!)O zLrfOZF&Ct+6IOSJ06S>0eit}WY#EC`E^_%p5W~5>>iTTaygPV}=9k<0cev5GF*ZqN zYrpMmYQZ}Nf)t)St&aTtzWO8uz*IV`Gt;{A@I0DualTvd*<|D9?_9R356sio{^Z;O z%*`97^fjt__>H0r?|Ff7ds{~JB8lUo<3X7hg3DTOc)eo&Qz}f6Z(-$pmey&q$ZeBr z)4Z!#mTGWDYX(27iv8Xeh-q3a*nI-E5e=H^hEcV)Q78nPuJ-?c=hzmyh+nfGzyr}qq%*O(d zc2-#*uI!7B(71Ve{uR8_!Xd;a#coIw+x!~R@%_88>l%%r^Pe!!M_KR984^M(=Q!E$ zHhccRCKq^LWI>zB8F2(h$lLY=HYdj?>ye)lvi#I8A-G0+$a70BUboZk{xSRd0zgm* zqdz3sFR<^pFRa%mv4nK-@kCJAw^?tJN~of-hy!=3q}M}5#GYHnH%_KS$s6dW+9723 zr+=a~-v{x%H`PTl7TJd-AfxUmWoVr(*CO%LY2&I}T0V2FBi~`r_<82vFQ5>*Xcv(& z(FI5HVoa>|?BaH0b2Ha-rPj-y0G(Rq8prN5mOO+%8U(f+I79L>r=!d{DKpoUcaspq zsx^F5t1A*Mb}1=Av?0ASbBN9y=xNzUu#7HsGcf1sXw<_caY?D1lkC{oDYR)Ws|be6 z5SfVQC{`yL^vzfx5nO>|(GrU6(%W%(zkuFb$5MJ_B2`n-{d?@ddYtp;6KeD@Kk4KX z7Vq-7MJV?7`n0`S$9fcn;ni6G8u92VD=O0%JLphp#iQ{D8NSv}O4?82h=~5cuSA|@ ze~@Jm!%Do-{2q3bz3)u&(aq9~PrZM*!C*DTAxQv7zA`k$q=Qd|r3}4*QY1h7CO2)U zB5Zn4TQd2D-Wzc97f8E3)g4_`mA&D=rqA87`vN(uAbe*Sd(Sp5ud*%cjcY|YLNjP^ zb-8!?K4E8$uxDh~cONiNK(Qb$%qH`Wa@R_%2ADG^2Hz`L^m!Tn% z4CSBC-TrFSWO^>pzMsn&Nr5@j(c#~St)qgsAta}&UIN%{M;oR4aKY|k?GwDq@qW2D zO=KGfmZqoYosK!>$!6U!Nn=y_@&|HJt;+%@TNy*{E#5u`lRCqOWh6r;L+F*;cW7bT zF*E6C);OW(m*91i)erqvr5}pg*@}<9AzgrURLn#{8~_K~H4a_z@r}?f!b{8%s(T+b zi$0H~-Fis1ZfPXv!ze_k90B#WzK7b=|zx zZt@F0c!$y91}DUp#NmQ^)n>fBpTcSSZq+J(th7_aQK0%e9_} z<%75znYji)3xkhSQ<|_t9(QJ1&iE4Npfk^#q#IYyh~;bzU{4Z<3peE^%gSn1TWsx0quXB!16DnJqwlR+!=B~E27ykIv)EdRIYFV{LJM;t zhetiOuJb=+3O3~$d-oN@q?l;D+bbL!nenu^{djP>)fH=-8W{}&UY{=It-towU8Y+o z(9j-6I;nPbQ-)^`wYy3eZx3M(+mU0k6pna=G%8dA7im|% z6U0nE6kY^q4%JAYHEjtqKl0UO6&CALgmzgt z{POaZb1tb;aE1~4faOsU?iZ0@!`&d4E-~_C_+}%Mv4{^N9cmyM!JDePq{?Rw(_mfK z>cdP+Y7c!Jo;l^JfJ6V;>*eL8%1mw9p??{MJ`FM<9jYMV47ZD0+>Ev!+Zoaep?!3z zEMd=_xSn~5L{fNgz1#iEsDl0#U9O7xy65cah|%w&9Fk?~t~4lkwpsWMgk`88#h` z>Ys9SDPe8^_xv%UjDx1Ffi71WUiu>LFf+-yPpBm1~=q}7oE1gqme{j%1*&wwb)E>{u&%&!6wkHH32udd*k}L2fOSTsV-6Jx4Z4KsHWbyW7PFOblm?z%LKvQ7*aE!)~!CnXWGan67!O1kX$UYs88yz5bW47 zKhs}B%uK^5Blm$WDIa$DPQMn|<&J*KXzY;jEDbubQHlYht+tX83RUwH-kF>92%*@y zF?0W7k!Ax*c=s{jb!}&Ei&c~YvW@2kzxNy-23svEkKOp0y{dtHAUX6Pb7yg}&z>DK zKR@3QF*Y^^(Kw3`o_`x@W^7D7$HUK$1(f7~n;pQ*C0iAQewQUjP;pNKz)(3lZU#MWo7PtWAX7?||mmSy|wm
      PU#J$iU2DN8U4{ZXWLM%&>S4cRjQq9K68_>90hRS% zA`s4Wy<>r=ZFP+tEP4@r(ceDfn=)E>(JVP+Vmx6(*6*b0#vXI%K&bl{4ywLl1vP*j ztPHr$OsTsDkxKs+L8tGSyl7-GT;|!y*zJyI?aO}teu%Ya5TWw5;{?3r_#U1`RkS+r zHW%rw_J3gm5H|QPY&eU*x2(QYaBbfTllLKVvIuniDu7G*f}s!^QriZ-zL4}G+2q^9 z23NO7?BAB<{~TKZ?5WTVN8KhnB_-rWv*!;Mp-VOLO5$b>!M5CkIPvk8 zqe-Nx5BX}l;-9CRKZ*J)!^s-4*|VC7!(LOfF8@Ao0id=Efl5aW+(w=EMxkAjq90HWrhj`^a4n&hn#jIs?|vau0WJ~4iYVY)EIrN zKgp~%1JWmvCdV*E`?0Z^8R3j{CND64t9iPt%13l|OP<-Vx-bYa2wW3t3K^Z19!vZC z#}L+H9Q(uPbjEIr`Q9uZ&hgU(=yZZOv$mpmvPJ{WXJ?;Lk!3H6vy8%x2Iz`QS-r{H zNUo$RUo5lpP?S<`9WY-T4RGaC;RDY!S%by%6V7L`&y^uJV7g(St877xQ+T+VJVW{7 z;n!T9%@Foyw*d=>_-l&OhShk7O)*v;#crAFGi9H&yu9CK+U=M8Hvb_%7u!ITOAeeT54((EvnrFP;&?hWW@pPWbel{_|^0WW4WD=7!+tJ=Z!@c zCjn9M>u=iqnE(zCNuE7M`_3t?vPWA1?1l zc}f;h6{nZE`LB;eQH; za{#?ms-jB3ppHeOl4L8XXl)}McZu%%cr+_7Fcf?gLfr!*#h2BtgVhq$BhRMXc$m~=q_w|m<0v^#5 zwf+3}^AkaAzpc*pf;$$iOapMs@RPwDnZ=Ja?Rr|p*uIg*_i}snAnkIomR;NlkLt)gpa&+)9Qb#HG`oT;Ch0T` zQ~m7M4=F^&5%j*+6mRQ{A6 z7(ja1$7k$y-TtI;Gw0eFiMG9SZN0DalCfuEI=a5a-3fc1X-H-Y;Kj@cosn3^_U@gt ze=K$3CFgzM`LcNPNY`zD|K*(>S<@m7>$<-dcFA5BZ#S2$w=T|k2?mhGc1L5z^A?OE998{A+r(fG+drf_lry#rIS>KW8)Gq@L9j zFhKCQ*UsuSi``dE$B{qmbNSlg0xn)o?bV(ekHHir>s@Ary=rH~G3TM<=Y40T*366x z{KTe2T+f1;XkbR+yEE@IGHZK_7lvQij*`{jS#3V_(*x!Ds~5XM_9}ihJ*zE@^!`$9 zK5MF_DN-Hn-DIfw=|8iwdkfUVs_5>`eT1c4tvmD6Fl0R9aLD|Poped=#`8$+^)_cP zUaS9cZuQ37FS7i2_`l+(Hmo07tuVZq{V^o2H-GAT4(hX7+_~Dby(ihmCT%wGlgIyI zs)^_QZg+NPZ2wFj8u^2XY%c}vj;xq?;aNKUBE~ABgN?LjIqJrCRozhcz{`=+2+#z5 zQ;#aM6aAL?vA-?&egx^MG7|9nW|?yx zcwTNUy*)%#Q?sfNp0rO@?kiFiimHtD!0`uwkA}h)>BgMkY=@ zz5nQAmTGZcb5iG{ftoXpHqsA6-hc-wWQa;wXuqqx*vf}3`jX~1X~~>{_I~m|%OpOi zq%2NG_XVqZ0bb*tL}mY)(2{p_p?B>Ye;l;v^302odA|1bz4+dCs*iT1ye!s5@;4U4 zq2V6u-oOm{R4-*vzhCqeuI;TI{MXsn1HtC>F`&-cI|qPcdM77zRX5#o=V!X<(!MYf3)6DkTb_13Ht82v zNo@E{u$^HTyL)W%y%?vF7874Kw_pn7f=XF(>9F8k3yT^Wfi@4&89;B=nX?)YtsOUT z&@y%FbK@wQ(zxoJ-4&w97Yn}^2l*qnI~7MUuL4I)(HGa0-{iyu9{-SK8XFfoq~PSV zKLYJ>VX>^_B->xpI(9)#Rps3>y6KsIJfY&DRytkN$5tZ~NcJ?0bM+vm$QfX?Nj4M@ z&5c92(~W#?p~K2Z@knT=p9R~|nB~V&Q6oMmCq8(_o+FSt*)>>Jobrbgp~|C3XXh?`Lg!ua#^{6mTQ6gHZXpx@y|k>@ zy*xLgb8J#-)Tv5z2hEmnUa`mHw`>QYQ*~#j2}+PBGINm1egwU*6uHM!l(ue;lY$)z zxxZvv3XuQi<`1}{H@9?b$&8Sim1#{!9Z(zjyd(b{)a)O-FL66If)>AT8H(Ch3N@{? zB-0_ZOZ)I%yO&QmL{W{LZ>GVEAELpEPt#y-JSEz{uN9S}5M9@v&z zoFN4)FLSXW>sv3QvfA5gGT=#fy*nK%TW0{O9;lQ|zjE0ye?=)u@TJX8$BDn~;2BWs zugQWZh1R2^3H&Yfk@wn(pt`??b+LN?RhB7}$&EtvRu9AUf>hw0SEz>2!L$U+kGlB_ zQW>Cv9L!5MH1|g5hw|YWgg8o2XyHbQce`QCGM`KZ-y11>_G)U^(n*)|_a|{w^?;ys z*<5?1)z@`;mCHt#y>HsxZu_`LSHH(`)=AD?CnnnFY>oxg5ia2pOsx?Fx9%w$N1D$M zK_C3)}+6`ntksTM}vNQk5Q2^6aKgu6-MMf8Mt6Sj>7CwzPcl+Oyz-`+3JhQ7Vu zMe!6I_8xOB*lyipr+)@vn%`xy1t**$s(H_Zo}GpIrYsY3<$+Z@gKk&!Yx?;4NxO}2 z$^y3q;qjV^Ij(y?29ERcmA`ip3;C)_?b1&1CVD~m*@IE09V?n43agrC-Gw*$=8KZ SqC_CzpW#i@8`XLbWBxyCU^Qa^ delta 49049 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

      (Ji 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 z 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 From a9330b784a162534231aef8c40cc1a046adf1fb1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 30 Jul 2019 23:16:05 +0100 Subject: [PATCH 408/608] Reward those who try. --- .../modules/reagents/chemistry/recipes/fermi.dm | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 2b01707576..078e1c8a71 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -29,10 +29,22 @@ for(var/turf/turf in range(2,T)) new /obj/effect/hotspot(turf) - if (1101 to INFINITY) //If you're crafty + if (1101 to 1500) //If you're crafty for(var/turf/turf in range(3,T)) new /obj/effect/hotspot(turf) + if (1501 to 2500) //requested + for(var/turf/turf in range(4,T)) + new /obj/effect/hotspot(turf) + + if (2501 to 5000) + for(var/turf/turf in range(5,T)) + new /obj/effect/hotspot(turf) + + if (5001 to INFINITY) + for(var/turf/turf in range(6,T)) + new /obj/effect/hotspot(turf) + message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].") log_game("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].") From 1db0ceff1f52fc8441b2464208c3f3654840650e Mon Sep 17 00:00:00 2001 From: BurgerLua Date: Wed, 31 Jul 2019 03:33:33 -0700 Subject: [PATCH 409/608] Added --- .../antagonists/nukeop/equipment/nuclear_challenge.dm | 2 ++ code/modules/antagonists/nukeop/equipment/nuclearbomb.dm | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index c616459bd1..f68da8bc28 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -5,6 +5,7 @@ #define CHALLENGE_SHUTTLE_DELAY 15000 // 25 minutes, so the ops have at least 5 minutes before the shuttle is callable. GLOBAL_LIST_EMPTY(jam_on_wardec) +GLOBAL_VAR_INIT(war_declared, FALSE) /obj/item/nuclear_challenge name = "Declaration of War (Challenge Mode)" @@ -62,6 +63,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) for(var/obj/machinery/computer/camera_advanced/shuttle_docker/D in GLOB.jam_on_wardec) D.jammed = TRUE + GLOB.war_declared = TRUE new uplink_type(get_turf(user), user.key, CHALLENGE_TELECRYSTALS + CEILING(PLAYER_SCALING * GLOB.player_list.len, 1)) CONFIG_SET(number/shuttle_refuel_delay, max(CONFIG_GET(number/shuttle_refuel_delay), CHALLENGE_SHUTTLE_DELAY)) SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1) diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index ade5458765..add3c1d9b0 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -373,6 +373,11 @@ S.switch_mode_to(TRACK_INFILTRATOR) countdown.start() set_security_level("delta") + + if(GLOB.war_declared) + var/area/A = get_area(src) + priority_announce("Alert: Unexpected increase in radiation levels near [A.name] ([src.x],[src.y],[src.z]). Please send an authorized radiation specialist to investigate.", "Sensory Nuclear Indexer Telemetry Calculation Helper") + else detonation_timer = null set_security_level(previous_level) From d6885d41a99518a40df7dd635e58c1a26747f7cc Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 31 Jul 2019 07:54:14 -0700 Subject: [PATCH 410/608] Update quirks.dm --- code/controllers/subsystem/processing/quirks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index bd939cf977..4af54b8c70 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -33,7 +33,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) cut = filter_quirks(quirks, job) for(var/V in quirks) user.add_quirk(V, spawn_effects) - if(!silent) + if(!silent && LAZYLEN(cut)) to_chat(to_chat_target || user, "All of your non-neutral character quirks have been cut due to these quirks conflicting with your job assignment: [english_list(cut)].") /datum/controller/subsystem/processing/quirks/proc/quirk_path_by_name(name) From 18b03f90536749d3ee7422aec0ad01c1d64519a1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 1 Aug 2019 03:38:06 +0100 Subject: [PATCH 411/608] Furranium fixes. --- code/game/objects/items/devices/scanners.dm | 2 ++ code/modules/mob/living/carbon/human/human.dm | 2 ++ code/modules/surgery/organs/organ_internal.dm | 11 +++++++++++ code/modules/surgery/organs/tongue.dm | 2 -- .../reagents/chemistry/reagents/fermi_reagents.dm | 11 ++++++----- .../modules/reagents/chemistry/reagents/healing.dm | 14 +++++++++++++- 6 files changed, 34 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 2585e9b1ee..925e14f7c9 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -171,6 +171,8 @@ SLIME SCANNER var/obj/item/organ/tongue/T = M.getorganslot("tongue") if(!T || T.damage > 40) msg += "\tSubject is suffering from severe burn tissue on their tongue.\n" //i.e. their tongue is shot + if(T.name == "fluffy tongue") + msg += "\tSubject is suffering from a fluffified tongue. Suggested cure: Yamerol or a tongue transplant.\n" var/obj/item/organ/lungs/Lung = M.getorganslot("lungs") if(L) if(Lung.damage > 150) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 67596a828a..85d6e0b85f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -811,6 +811,8 @@ for(var/datum/mutation/human/HM in dna.mutations) if(HM.quality != POSITIVE) dna.remove_mutation(HM.name) + if(blood_volume < (BLOOD_VOLUME_NORMAL*blood_ratio)) + blood_volume = (BLOOD_VOLUME_NORMAL*blood_ratio) ..() /mob/living/carbon/human/check_weakness(obj/item/weapon, mob/living/attacker) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index b16967b6b0..9f910de9a9 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -153,6 +153,17 @@ // if they have no mutant tongues, give them a regular one T.Insert(src) + else + var/obj/item/organ/tongue/oT = getorganslot(ORGAN_SLOT_TONGUE) + if(oT.name == "fluffy tongue") + var/obj/item/organ/tongue/T + if(dna && dna.species && dna.species.mutanttongue) + T = new dna.species.mutanttongue() + else + T = new() + oT.Remove(src) + qdel(oT) + T.Insert(src) if(!getorganslot(ORGAN_SLOT_EYES)) var/obj/item/organ/eyes/E diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 549f0cc953..3eaaa8de92 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -253,8 +253,6 @@ message = replacetext(message, "ove", "uv") message = replacetext(message, "l", "w") message = replacetext(message, "r", "w") - if(prob(20)) - message += pick(" OwO", " uwu") message = lowertext(message) speech_args[SPEECH_MESSAGE] = message diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 68a6f7a479..914a2a09b1 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -171,15 +171,15 @@ T.Remove(M) nT.Insert(M) T.moveToNullspace()//To valhalla - to_chat(M, "Youw tongue feews... weally fwuffy!!") + to_chat(M, "Your tongue feels... weally fwuffy!!") if(17 to INFINITY) - if(prob(10)) + if(prob(5)) to_chat(M, "You find yourself unable to supress the desire to meow!") M.emote("nya") - if(prob(10)) + if(prob(5)) to_chat(M, "You find yourself unable to supress the desire to howl!") M.emote("awoo") - if(prob(20)) + if(prob(5)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers for(var/victim in seen) if((istype(victim, /mob/living/simple_animal/pet/)) || (victim == M) || (!isliving(victim))) @@ -189,7 +189,7 @@ ..() /datum/reagent/fermi/furranium/on_mob_delete(mob/living/carbon/M) - if(purity < 0.9)//Only permanent if you're a good chemist. + if(purity < 1)//Only permanent if you're a good chemist. nT = M.getorganslot(ORGAN_SLOT_TONGUE) nT.Remove(M) qdel(nT) @@ -199,6 +199,7 @@ else log_game("FERMICHEM: [M] ckey: [M.key]'s tongue has been made permanent") + /////////////////////////////////////////////////////////////////////////////////////////////// //Nanite removal //Writen by Trilby!! Embellsished a little by me. diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index 0c1707d5fb..fef1f9e013 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -22,6 +22,19 @@ C.adjustOxyLoss(-2) else C.adjustOxyLoss(-10) + + if(T) + if(T.name == "fluffy tongue") + var/obj/item/organ/tongue/nT + if(C.dna && C.dna.species && C.dna.species.mutanttongue) + nT = new C.dna.species.mutanttongue() + else + nT = new() + T.Remove(C) + qdel(T) + nT.Insert(C) + to_chat(C, "You feel your tongue.... unfluffify...?") + holder.remove_reagent(src.id, "10") ..() /datum/reagent/fermi/yamerol/overdose_process(mob/living/carbon/C) @@ -40,7 +53,6 @@ else if((oT.name == "fluffy tongue") && (purity == 1)) var/obj/item/organ/tongue/T - if(C.dna && C.dna.species && C.dna.species.mutanttongue) T = new C.dna.species.mutanttongue() else From 88e6fa47037a8804d4afd037cc750248197197a7 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 1 Aug 2019 03:42:57 +0100 Subject: [PATCH 412/608] Yamero! --- .../code/modules/reagents/chemistry/reagents/healing.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index fef1f9e013..52f6215eae 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -16,7 +16,7 @@ var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) if(T) - T.adjustTongueLoss(C, -2) + T.adjustTongueLoss(C, -2)//Fix the inputs me! if(L) L.adjustLungLoss(-5, C) C.adjustOxyLoss(-2) @@ -39,7 +39,8 @@ /datum/reagent/fermi/yamerol/overdose_process(mob/living/carbon/C) var/obj/item/organ/tongue/oT = C.getorganslot(ORGAN_SLOT_TONGUE) - + if(current_cycle = 1) + to_chat(C, "You feel the Yamerol sooth your tongue and lungs.") if(current_cycle > 10) if(!C.getorganslot(ORGAN_SLOT_TONGUE)) var/obj/item/organ/tongue/T @@ -69,7 +70,7 @@ to_chat(C, "You feel your lungs reform in your chest.") holder.remove_reagent(src.id, "10") - + C.adjustOxyLoss(-3) ..() /datum/reagent/fermi/yamerol_tox From 3f75a42ff2233e8eb87558547cb0127e562ff70d Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 1 Aug 2019 03:46:30 +0100 Subject: [PATCH 413/608] Guess who staged before compiling? --- .../code/modules/reagents/chemistry/reagents/healing.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index 52f6215eae..b717948a20 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -39,7 +39,7 @@ /datum/reagent/fermi/yamerol/overdose_process(mob/living/carbon/C) var/obj/item/organ/tongue/oT = C.getorganslot(ORGAN_SLOT_TONGUE) - if(current_cycle = 1) + if(current_cycle == 1) to_chat(C, "You feel the Yamerol sooth your tongue and lungs.") if(current_cycle > 10) if(!C.getorganslot(ORGAN_SLOT_TONGUE)) From 1f73e6eb1d1d4f2b6f97fb7cdf90489cec4e25f9 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 1 Aug 2019 03:48:35 +0100 Subject: [PATCH 414/608] Notice me!! --- .../code/modules/reagents/chemistry/reagents/fermi_reagents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 914a2a09b1..0a343abb79 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -171,7 +171,7 @@ T.Remove(M) nT.Insert(M) T.moveToNullspace()//To valhalla - to_chat(M, "Your tongue feels... weally fwuffy!!") + to_chat(M, "Your tongue feels... weally fwuffy!!") if(17 to INFINITY) if(prob(5)) to_chat(M, "You find yourself unable to supress the desire to meow!") From d5b0104a3e87a60e8103406bcf9a973f70dedea6 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 2 Aug 2019 05:46:49 -0700 Subject: [PATCH 415/608] Update miscellaneous.dm --- code/modules/clothing/shoes/miscellaneous.dm | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index e6554f6125..1aa35baafe 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -219,17 +219,13 @@ var/atom/target = get_edge_target_turf(user, user.dir) //gets the user's direction - if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE, callback = CALLBACK(src, .proc/hop_end))) - jumping = TRUE + if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE)) playsound(src, 'sound/effects/stealthoff.ogg', 50, 1, 1) + addtimer(src, VARSET_CALLBACK(src, recharging_time, world.time + recharging_rate)) user.visible_message("[usr] dashes forward into the air!") else to_chat(user, "Something prevents you from dashing forward!") -/obj/item/clothing/shoes/bhop/proc/hop_end() - jumping = FALSE - recharging_time = world.time + recharging_rate - /obj/item/clothing/shoes/singery name = "yellow performer's boots" desc = "These boots were made for dancing." From 1c1ca84c3a81a7b55cdda7d298b6f87fa7e091eb Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 3 Aug 2019 00:49:57 -0700 Subject: [PATCH 416/608] Update miscellaneous.dm --- code/modules/clothing/shoes/miscellaneous.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 1aa35baafe..4659de3e6a 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -221,7 +221,7 @@ if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE)) playsound(src, 'sound/effects/stealthoff.ogg', 50, 1, 1) - addtimer(src, VARSET_CALLBACK(src, recharging_time, world.time + recharging_rate)) + recharging_time = world.time + recharging_rate user.visible_message("[usr] dashes forward into the air!") else to_chat(user, "Something prevents you from dashing forward!") From a0a21dc01fd6d81feb9fd236035fe6dc2a3ca28d Mon Sep 17 00:00:00 2001 From: Chayse Ramsay Date: Sat, 3 Aug 2019 18:36:46 +0100 Subject: [PATCH 417/608] !iscarbon to !ishuman --- code/_onclick/hud/screen_objects.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index caa8d23df4..00ec766ea5 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -278,7 +278,7 @@ screen_loc = ui_internal /obj/screen/internals/Click() - if(!iscarbon(usr)) + if(!ishuman(usr)) return var/mob/living/carbon/human/C = usr if(C.incapacitated()) From 46e4023ba9b9f70d56390d988637c614e01ff02a Mon Sep 17 00:00:00 2001 From: Chayse Ramsay Date: Sun, 4 Aug 2019 05:07:24 +0100 Subject: [PATCH 418/608] Monkey business --- code/_onclick/hud/screen_objects.dm | 4 ++-- code/game/objects/items/tanks/tanks.dm | 2 +- code/modules/mob/living/carbon/human/inventory.dm | 6 ------ code/modules/mob/living/carbon/inventory.dm | 6 ++++++ 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 00ec766ea5..75349c5789 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -278,9 +278,9 @@ screen_loc = ui_internal /obj/screen/internals/Click() - if(!ishuman(usr)) + if(!iscarbon(usr)) return - var/mob/living/carbon/human/C = usr + var/mob/living/carbon/C = usr if(C.incapacitated()) return diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 3cc5249b56..0ddca78c95 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -23,7 +23,7 @@ toggle_internals(user) /obj/item/tank/proc/toggle_internals(mob/user) - var/mob/living/carbon/human/H = user + var/mob/living/carbon/H = user if(!istype(H)) return diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 3dd4807251..d35df6b789 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -77,12 +77,6 @@ s_store, ) -/mob/living/carbon/human/proc/get_internal_slots() - return list( - head, - wear_mask, - ) - //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() /mob/living/carbon/human/equip_to_slot(obj/item/I, slot) if(!..()) //a check failed or the item has already found its slot diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index bc2d6132e1..2c4627b0ee 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -140,3 +140,9 @@ /mob/living/carbon/proc/get_holding_bodypart_of_item(obj/item/I) var/index = get_held_index_of_item(I) return index && hand_bodyparts[index] + +/mob/living/carbon/proc/get_internal_slots() + return list( + head, + wear_mask, + ) From 0a7054c6048f043156679c2551328a768e2890c8 Mon Sep 17 00:00:00 2001 From: Chayse Ramsay Date: Sun, 4 Aug 2019 05:26:02 +0100 Subject: [PATCH 419/608] Update code/modules/mob/living/carbon/inventory.dm Co-Authored-By: deathride58 --- code/modules/mob/living/carbon/inventory.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 2c4627b0ee..388cf81a43 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -144,5 +144,5 @@ /mob/living/carbon/proc/get_internal_slots() return list( head, - wear_mask, + wear_mask ) From 5e757f1012355d761c865b891394bdccfdd21e19 Mon Sep 17 00:00:00 2001 From: Chayse Ramsay Date: Sun, 4 Aug 2019 05:26:16 +0100 Subject: [PATCH 420/608] Update code/modules/mob/living/carbon/life.dm Co-Authored-By: deathride58 --- code/modules/mob/living/carbon/life.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 999544d1f7..9f4f7ba868 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -318,7 +318,7 @@ if(internal.loc != src) internal = null update_internals_hud_icon(0) - else if (internals == FALSE && !getorganslot(ORGAN_SLOT_BREATHING_TUBE)) + else if (!internals && !getorganslot(ORGAN_SLOT_BREATHING_TUBE)) internal = null update_internals_hud_icon(0) else From f9d829b111fd18e56e03b4734c80752229a0ecd9 Mon Sep 17 00:00:00 2001 From: Chayse Ramsay Date: Sun, 4 Aug 2019 05:48:08 +0100 Subject: [PATCH 421/608] Proc to define --- code/__DEFINES/inventory.dm | 3 +++ code/_onclick/hud/screen_objects.dm | 2 +- code/game/objects/items/tanks/tanks.dm | 2 +- code/modules/mob/living/carbon/inventory.dm | 6 ------ code/modules/mob/living/carbon/life.dm | 6 +----- 5 files changed, 6 insertions(+), 13 deletions(-) diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 03cfde802f..5e200c38c0 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -230,3 +230,6 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, typecacheof(list( /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy))) + +//Internals checker +#define GET_INTERNAL_SLOTS(C) list(C.head, C.wear_mask) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 75349c5789..4c666d708c 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -293,7 +293,7 @@ var/obj/item/clothing/check var/internals = FALSE - for(check in C.get_internal_slots()) + for(check in GET_INTERNAL_SLOTS(C)) if(istype(check, /obj/item/clothing/mask)) var/obj/item/clothing/mask/M = check if(M.mask_adjusted) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 0ddca78c95..d409e40575 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -36,7 +36,7 @@ var/obj/item/clothing/check var/internals = FALSE - for(check in H.get_internal_slots()) + for(check in GET_INTERNAL_SLOTS(H)) if(istype(check, /obj/item/clothing/mask)) var/obj/item/clothing/mask/M = check if(M.mask_adjusted) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 2c4627b0ee..bc2d6132e1 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -140,9 +140,3 @@ /mob/living/carbon/proc/get_holding_bodypart_of_item(obj/item/I) var/index = get_held_index_of_item(I) return index && hand_bodyparts[index] - -/mob/living/carbon/proc/get_internal_slots() - return list( - head, - wear_mask, - ) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 999544d1f7..19e04fb43c 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -306,12 +306,8 @@ /mob/living/carbon/proc/get_breath_from_internal(volume_needed) var/obj/item/clothing/check var/internals = FALSE - var/internalslots = list( - head, - wear_mask, - ) - for(check in internalslots) + for(check in GET_INTERNAL_SLOTS(src)) if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS)) internals = TRUE if(internal) From 40d6dc1812fb45b03a29a621b019bb45d3aa2f81 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 4 Aug 2019 14:54:40 +0100 Subject: [PATCH 422/608] Oops. --- .../chemistry/reagents/enlargement.dm | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 39cc5824d1..d603f3ba10 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -173,12 +173,14 @@ /datum/reagent/fermi/BEsmaller_hypo/on_mob_add(mob/living/carbon/M) . = ..() - if(M.dna.features["has_vag"]) - var/obj/item/organ/genital/vagina/nV = new - nV.Insert(M) - if(M.dna.features["has_womb"]) - var/obj/item/organ/genital/womb/nW = new - nW.Insert(M) + if(!M.getorganslot("vagina")) + if(M.dna.features["has_vag"]) + var/obj/item/organ/genital/vagina/nV = new + nV.Insert(M) + if(!M.getorganslot("womb")) + if(M.dna.features["has_womb"]) + var/obj/item/organ/genital/womb/nW = new + nW.Insert(M) /datum/reagent/fermi/BEsmaller_hypo/on_mob_life(mob/living/carbon/M) var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") @@ -342,15 +344,16 @@ /datum/reagent/fermi/PEsmaller_hypo/on_mob_add(mob/living/carbon/M) . = ..() - if(M.dna.features["has_balls"]) - var/obj/item/organ/genital/testicles/nT = new - nT.Insert(M) + if(!M.getorganslot("testicles")) + if(M.dna.features["has_balls"]) + var/obj/item/organ/genital/testicles/nT = new + nT.Insert(M) /datum/reagent/fermi/PEsmaller_hypo/on_mob_life(mob/living/carbon/M) var/obj/item/organ/genital/penis/P = M.getorganslot("penis") if(!P) return ..() - if(!M.dna.features["has_penis"])//Fast fix for those who don't want it. + if(!M.dna.features["has_cock"])//Fast fix for those who don't want it. P.cached_length = P.cached_length - 0.2 P.update() else if(P.cached_length > (M.dna.features["cock_length"]+0.1)) From ffa717e8d7c6b5e7dc56e33446f6584b06ae6561 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 4 Aug 2019 19:39:14 +0100 Subject: [PATCH 423/608] Prevents Eigenlockers from teleporting people to CC via cargoshuttle. --- code/modules/shuttle/supply.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index b54fceb3e7..2249f5f10e 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -60,6 +60,10 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( for(var/a in T.GetAllContents()) if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types)) return FALSE + if(istype(a, /obj/structure/closet))//Prevents eigenlockers from ending up at CC + var/obj/structure/closet/c = a + if(c.eigen_teleport == TRUE) + return FALSE return TRUE /obj/docking_port/mobile/supply/request(obj/docking_port/stationary/S) From fb4709f6dbe000f24adaa8c9048171821fbd0701 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 5 Aug 2019 01:49:28 -0700 Subject: [PATCH 424/608] Update hierophant.dm --- .../simple_animal/hostile/megafauna/hierophant.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 6577553a6a..3a495766ac 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -158,6 +158,7 @@ Difficulty: Normal else burst_range = 3 INVOKE_ASYNC(src, .proc/burst, get_turf(src), 0.25) //melee attacks on living mobs cause it to release a fast burst if on cooldown + OpenFire() else devour(L) else @@ -426,6 +427,7 @@ Difficulty: Normal /mob/living/simple_animal/hostile/megafauna/hierophant/proc/burst(turf/original, spread_speed = 0.5) //release a wave of blasts playsound(original,'sound/machines/airlockopen.ogg', 200, 1) var/last_dist = 0 + var/list/hit_mobs = list() //don't hit people multiple times. for(var/t in spiral_range_turfs(burst_range, original)) var/turf/T = t if(!T) @@ -434,7 +436,7 @@ Difficulty: Normal if(dist > last_dist) last_dist = dist sleep(1 + min(burst_range - last_dist, 12) * spread_speed) //gets faster as it gets further out - new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE) + new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE, hit_mobs) /mob/living/simple_animal/hostile/megafauna/hierophant/AltClickOn(atom/A) //player control handler(don't give this to a player holy fuck) if(!istype(A) || get_dist(A, src) <= 2) @@ -472,7 +474,7 @@ Difficulty: Normal duration = 100 smooth = SMOOTH_TRUE -/obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caster) +/obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caste r) . = ..() queue_smooth_neighbors(src) queue_smooth(src) @@ -591,8 +593,10 @@ Difficulty: Normal var/friendly_fire_check = FALSE var/bursting = FALSE //if we're bursting and need to hit anyone crossing us -/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire) +/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire, list/only_hit_once) . = ..() + if(only_hit_once) + hit_things = only_hit_once friendly_fire_check = friendly_fire if(new_caster) hit_things += new_caster From 58f8920008768b3b8fccd83a244830cb3105c4e4 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 5 Aug 2019 01:51:51 -0700 Subject: [PATCH 425/608] Update hierophant.dm --- .../mob/living/simple_animal/hostile/megafauna/hierophant.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 3a495766ac..bb80e34d19 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -158,7 +158,8 @@ Difficulty: Normal else burst_range = 3 INVOKE_ASYNC(src, .proc/burst, get_turf(src), 0.25) //melee attacks on living mobs cause it to release a fast burst if on cooldown - OpenFire() + if(L.stat == CONSCIOUS && L.health >= 30) + OpenFire() else devour(L) else From 48db0b129ea152ff6771e1361048394fb305325a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 5 Aug 2019 01:55:05 -0700 Subject: [PATCH 426/608] Update hierophant.dm --- .../mob/living/simple_animal/hostile/megafauna/hierophant.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index bb80e34d19..cca39cfea6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -475,7 +475,7 @@ Difficulty: Normal duration = 100 smooth = SMOOTH_TRUE -/obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caste r) +/obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caster) . = ..() queue_smooth_neighbors(src) queue_smooth(src) From e3c3742aec72785534988a2a4c9895b35d5e4e14 Mon Sep 17 00:00:00 2001 From: Sishen Date: Mon, 5 Aug 2019 06:27:10 -0400 Subject: [PATCH 427/608] Update guardian.dm --- code/modules/mob/living/simple_animal/guardian/guardian.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 1a918766b6..12cb81bccb 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -58,6 +58,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians . = ..() +/mob/living/simple_animal/hostile/guardian/CtrlClickOn(atom/A) + return + /mob/living/simple_animal/hostile/guardian/med_hud_set_health() if(summoner) var/image/holder = hud_list[HEALTH_HUD] From 9f5b54940c21d2e24e58d4bc4cae4a775b95962e Mon Sep 17 00:00:00 2001 From: Sishen Date: Mon, 5 Aug 2019 21:31:17 -0400 Subject: [PATCH 428/608] adds in a memento mori check --- .../modules/mob/living/simple_animal/guardian/guardian.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 12cb81bccb..ba516046cb 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -59,8 +59,12 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians . = ..() /mob/living/simple_animal/hostile/guardian/CtrlClickOn(atom/A) - return - + var/mob/living/carbon/C = A + if((iscarbon(C)) && (istype(C.wear_neck, /obj/item/clothing/neck/necklace/memento_mori))) + return + else + . = ..() + /mob/living/simple_animal/hostile/guardian/med_hud_set_health() if(summoner) var/image/holder = hud_list[HEALTH_HUD] From ee0d7a4ed33f9331c0951239959660ccc00dacf6 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Tue, 6 Aug 2019 07:43:28 -0400 Subject: [PATCH 429/608] Fixes issues with femur breaker by replacing the forced speech with a proper scream emote and making it guarantee landing in crit --- code/game/objects/structures/femur_breaker.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/femur_breaker.dm b/code/game/objects/structures/femur_breaker.dm index 077eb25688..ede0331d3a 100644 --- a/code/game/objects/structures/femur_breaker.dm +++ b/code/game/objects/structures/femur_breaker.dm @@ -83,8 +83,9 @@ icon_state = "breaker_drop" /obj/structure/femur_breaker/proc/damage_leg(mob/living/carbon/human/H) - H.say("AAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHH!!", forced = "femur broken") + H.emote("scream") H.apply_damage(150, BRUTE, pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) + H.adjustBruteLoss(rand(5,20) + (max(0, H.health)) //Make absolutely sure they end up in crit, so that they can succumb if they wish. /obj/structure/femur_breaker/proc/raise_slat() slat_status = BREAKER_SLAT_RAISED From 7a22e73a79fc78d4cb104aadab8374f73a2f75f7 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Tue, 6 Aug 2019 08:47:10 -0400 Subject: [PATCH 430/608] Update speech.dm --- code/datums/mutations/speech.dm | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index 21adc944f6..f02b7f185f 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -91,32 +91,29 @@ message = replacetext(message," oh god "," cheese and crackers ") message = replacetext(message," jesus "," gee wiz ") message = replacetext(message," weak "," strong ") - message = replacetext(message," kill "," hug ") - message = replacetext(message," murder "," tease ") + message = replacetext(message," kill yourself "," hug ") message = replacetext(message," ugly "," beautiful ") message = replacetext(message," douchbag "," nice guy ") message = replacetext(message," whore "," lady ") - message = replacetext(message," nerd "," smart guy ") + message = replacetext(message," nerd "," smarty pants ") message = replacetext(message," moron "," fun person ") message = replacetext(message," IT'S LOOSE "," EVERYTHING IS FINE ") message = replacetext(message," sex "," hug fight ") message = replacetext(message," idiot "," genius ") message = replacetext(message," fat "," thin ") - message = replacetext(message," beer "," water with ice ") - message = replacetext(message," drink "," water ") + message = replacetext(message," beer "," liquid bread ") + message = replacetext(message," drink "," liquid ") message = replacetext(message," feminist "," empowered woman ") - message = replacetext(message," i hate you "," you're mean ") - message = replacetext(message," nigger "," african american ") + message = replacetext(message," i hate you "," you're a mean ") message = replacetext(message," jew "," jewish ") message = replacetext(message," shit "," shiz ") message = replacetext(message," crap "," poo ") message = replacetext(message," slut "," tease ") message = replacetext(message," ass "," butt ") message = replacetext(message," damn "," dang ") - message = replacetext(message," fuck "," ") message = replacetext(message," penis "," privates ") message = replacetext(message," cunt "," privates ") - message = replacetext(message," dick "," jerk ") + message = replacetext(message," dick "," privates ") message = replacetext(message," vagina "," privates ") speech_args[SPEECH_MESSAGE] = trim(message) @@ -281,4 +278,4 @@ /datum/mutation/human/stoner/on_losing(mob/living/carbon/human/owner) ..() owner.grant_language(/datum/language/common) - owner.remove_language(/datum/language/beachbum) \ No newline at end of file + owner.remove_language(/datum/language/beachbum) From ddb29551fc32fbe57033e4ff1cdcde3c06c1a8de Mon Sep 17 00:00:00 2001 From: deathride58 Date: Tue, 6 Aug 2019 11:28:01 -0400 Subject: [PATCH 431/608] paren --- code/game/objects/structures/femur_breaker.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/femur_breaker.dm b/code/game/objects/structures/femur_breaker.dm index ede0331d3a..e3002a8fae 100644 --- a/code/game/objects/structures/femur_breaker.dm +++ b/code/game/objects/structures/femur_breaker.dm @@ -85,7 +85,7 @@ /obj/structure/femur_breaker/proc/damage_leg(mob/living/carbon/human/H) H.emote("scream") H.apply_damage(150, BRUTE, pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - H.adjustBruteLoss(rand(5,20) + (max(0, H.health)) //Make absolutely sure they end up in crit, so that they can succumb if they wish. + H.adjustBruteLoss(rand(5,20) + (max(0, H.health))) //Make absolutely sure they end up in crit, so that they can succumb if they wish. /obj/structure/femur_breaker/proc/raise_slat() slat_status = BREAKER_SLAT_RAISED @@ -172,4 +172,4 @@ #undef BREAKER_ACTIVATE_DELAY #undef BREAKER_WRENCH_DELAY #undef BREAKER_ACTION_INUSE -#undef BREAKER_ACTION_WRENCH \ No newline at end of file +#undef BREAKER_ACTION_WRENCH From f4c5e6fd2f550488d1313b0b52a04d621176e8c0 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 6 Aug 2019 16:43:55 +0100 Subject: [PATCH 432/608] Attempts to deal with the potential future problem of people stunlocking --- code/modules/mob/living/simple_animal/astral.dm | 12 ++++++++++++ .../reagents/chemistry/reagents/astrogen.dm | 16 ++++++++++------ .../chemistry/reagents/fermi_reagents.dm | 1 + 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm index bf0c1f8fd8..d58788ac51 100644 --- a/code/modules/mob/living/simple_animal/astral.dm +++ b/code/modules/mob/living/simple_animal/astral.dm @@ -22,6 +22,7 @@ speak_emote = list("echos") movement_type = FLYING var/pseudo_death = FALSE + var/posses_safe = FALSE atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 0 minbodytemp = 0 @@ -40,6 +41,17 @@ ..() if(pseudo_death == FALSE) if(isliving(A)) + if(ishuman(A)) + var/mob/living/carbon/human/H = A + if(H.reagents.has_reagent("astral") && !H.mind) + var/datum/reagent/fermi/astral/As = locate(/datum/reagent/fermi/astral) in H.reagents.reagent_list + if(As.originalmind == src.mind && As.current_cycle < 10) + to_chat(src, "The intensity of the astrogen in your body is too much allow you to return to yourself yet!") + return + to_chat(src, "You astrally possess [H]!") + log_game("FERMICHEM: [src] has astrally possessed [A]!") + src.mind.transfer_to(H) + qdel(src) var/message = html_decode(stripped_input(src, "Enter a message to send to [A]", MAX_MESSAGE_LEN)) if(!message) return diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index d16db2aaf8..8f2626647f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -52,10 +52,10 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die qdel(O) -/datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! +/datum/reagent/fermi/astral/on_mob_life(mob/living/carbon/M) // Gives you the ability to astral project for a moment! M.alpha = 255 - originalmind = M.mind if(current_cycle == 0) + originalmind = M.mind log_game("FERMICHEM: [M] ckey: [M.key] became an astral ghost") origin = M if (G == null) @@ -64,7 +64,8 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die var/datum/action/chem/astral/AS = new(G) AS.origin = M AS.ghost = G - M.mind.transfer_to(G) + if(M.mind) + M.mind.transfer_to(G) SSblackbox.record_feedback("tally", "fermi_chem", 1, "Astral projections") if(overdosed) if(prob(50)) @@ -77,13 +78,16 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die if(G.stat == DEAD || G.pseudo_death == TRUE) G.mind.transfer_to(M) qdel(G) - else - M.Sleeping(20, 0) - M.reagents.remove_reagent(id, 2, FALSE) ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) if(!G) + if(M.mind) + if(!M.reagents.has_reagent("astral")) //I have no idea how you got here with a mind and no astral, but this is in case. + message_admins("No astral!") + var/mob/living/simple_animal/astral/G = new(get_turf(M.loc)) + M.mind.transfer_to(G)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end. + to_chat(G, "[M]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'") originalmind.transfer_to(M) else if(G.mind) G.mind.transfer_to(origin) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 0a343abb79..275c244a83 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -138,6 +138,7 @@ M.emote("cough") var/obj/item/toy/plush/P = pick(subtypesof(/obj/item/toy/plush)) new P(T) + to_chat(M, "You feel a lump form in your throat, as you suddenly cough up what seems to be a hairball?") var/list/seen = viewers(8, T) for(var/mob/S in seen) to_chat(S, "[M] suddenly coughs up a [P.name]!") From 564aa9b4cb755b0f74be1247a0f92177560e0bcb Mon Sep 17 00:00:00 2001 From: Cebutris Date: Tue, 6 Aug 2019 13:01:49 -0400 Subject: [PATCH 433/608] Gloves of the north star now work for hugging and patting --- code/modules/clothing/gloves/miscellaneous.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index bc36353ac5..86d770ac79 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -72,8 +72,16 @@ M.adjustStaminaLoss(-2) //Restore 2/3 of the stamina used assuming empty stam buffer. With proper stamina buffer management, this results in a net gain of +.5 stamina per click. if(warcry) M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry") + + else if(M.a_intent == INTENT_HELP) + if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) //Can't hug people who are dying/dead + if(target.on_fire || target.lying ) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions + return + else + M.changeNext_move(CLICK_CD_RAPID) .= FALSE + /obj/item/clothing/gloves/rapid/attack_self(mob/user) var/input = stripped_input(user,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 7) if(input) From ee1b04eefb0f005652df9040371b67383d6830dc Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 6 Aug 2019 19:54:07 +0100 Subject: [PATCH 434/608] Fixes potential "trapped as ghost" problems and examine+scanner text --- code/game/objects/items/devices/scanners.dm | 8 ++++++++ code/modules/mob/living/carbon/human/examine.dm | 7 +++++++ code/modules/mob/living/simple_animal/astral.dm | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 925e14f7c9..8c55312892 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -213,9 +213,17 @@ SLIME SCANNER if(advanced && M.hallucinating()) msg += "\tSubject is hallucinating.\n" + //MKUltra if(M.has_status_effect(/datum/status_effect/chem/enthrall)) msg += "\tSubject has abnormal brain fuctions.\n" + //Astrogen shenanigans + if(M.reagents.has_reagent("astral")) + if(M.mind) + msg += "Warning: subject may be possesed.\n" + else + msg += "Subject appears to be astrally projecting.\n" + //Eyes and ears if(advanced) if(iscarbon(M)) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 2fa98c59de..5b224444e0 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -281,6 +281,13 @@ if(91.01 to INFINITY) msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n" + if(reagents.has_reagent("astral")) + msg += "[t_He] have wild, spacey eyes" + if(mind) + msg += " and have a strange, abnormal look to them.\n" + else + msg += " and don't look like they're all there.\n" + if(isliving(user)) var/mob/living/L = user if(src != user && HAS_TRAIT(L, TRAIT_EMPATH) && !appears_dead) diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm index d58788ac51..9bac53ef22 100644 --- a/code/modules/mob/living/simple_animal/astral.dm +++ b/code/modules/mob/living/simple_animal/astral.dm @@ -45,7 +45,7 @@ var/mob/living/carbon/human/H = A if(H.reagents.has_reagent("astral") && !H.mind) var/datum/reagent/fermi/astral/As = locate(/datum/reagent/fermi/astral) in H.reagents.reagent_list - if(As.originalmind == src.mind && As.current_cycle < 10) + if(As.originalmind == src.mind && As.current_cycle < 10 && H.stat != DEAD) //So you can return to your body. to_chat(src, "The intensity of the astrogen in your body is too much allow you to return to yourself yet!") return to_chat(src, "You astrally possess [H]!") From d0b8e054fdd4daedfe2dc3ee81b5bcce6e524fa1 Mon Sep 17 00:00:00 2001 From: Cebutris Date: Tue, 6 Aug 2019 16:42:35 -0400 Subject: [PATCH 435/608] Added hug gloves as their own item, removing the feature from regular GotNS --- code/modules/clothing/gloves/miscellaneous.dm | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 86d770ac79..1af24f8e61 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -73,12 +73,6 @@ if(warcry) M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry") - else if(M.a_intent == INTENT_HELP) - if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) //Can't hug people who are dying/dead - if(target.on_fire || target.lying ) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions - return - else - M.changeNext_move(CLICK_CD_RAPID) .= FALSE @@ -86,3 +80,22 @@ var/input = stripped_input(user,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 7) if(input) warcry = input + +/obj/item/clothing/gloves/rapid/hug + name = "Hugs of the North Star" + desc = "Just looking at these fills you with an urge to hug the shit out of people" + warcry = "owo" //Shouldn't ever come into play + +/obj/item/clothing/gloves/rapid/hug/Touch(mob/living/target,proximity = TRUE) + var/mob/living/M = loc + + if(M.a_intent == INTENT_HELP) + if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) //Can't hug people who are dying/dead + if(target.on_fire || target.lying ) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions + return + else + M.changeNext_move(CLICK_CD_RAPID) + . = FALSE + +/obj/item/clothing/gloves/rapid/hug/attack_self(mob/user) + return FALSE \ No newline at end of file From 3e6112fec06007475dc4f95c51ad943c4c19b48c Mon Sep 17 00:00:00 2001 From: Cebutris Date: Tue, 6 Aug 2019 16:48:49 -0400 Subject: [PATCH 436/608] adds the hug gloves to the arcade reward pool --- code/game/machinery/computer/arcade.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 8d0cfb95e8..e38445f606 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -57,6 +57,7 @@ /obj/item/stack/tile/fakespace/loaded = ARCADE_WEIGHT_TRICK, /obj/item/stack/tile/fakepit/loaded = ARCADE_WEIGHT_TRICK, /obj/item/restraints/handcuffs/fake = ARCADE_WEIGHT_TRICK, + /obj/item/clothing/gloves/rapid/hug = ARCADE_WEIGHT_TRICK, /obj/item/grenade/chem_grenade/glitter/pink = ARCADE_WEIGHT_TRICK, /obj/item/grenade/chem_grenade/glitter/blue = ARCADE_WEIGHT_TRICK, From de8137d6c85f8d04e206dfdbe0096cbfb02dd23d Mon Sep 17 00:00:00 2001 From: Ghommie Date: Tue, 6 Aug 2019 23:19:28 +0200 Subject: [PATCH 437/608] One line fix for invisible zipties. --- code/game/objects/items/handcuffs.dm | 31 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 36a92b3db9..a306b48385 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -164,21 +164,6 @@ /obj/item/restraints/handcuffs/cable/white item_color = "white" -/obj/item/restraints/handcuffs/alien - icon_state = "handcuffAlien" - -/obj/item/restraints/handcuffs/fake - name = "fake handcuffs" - desc = "Fake handcuffs meant for gag purposes." - breakouttime = 10 //Deciseconds = 1s - -/obj/item/restraints/handcuffs/fake/kinky - name = "kinky handcuffs" - desc = "Fake handcuffs meant for erotic roleplay." - icon = 'modular_citadel/icons/obj/items_and_weapons.dmi' - icon_state = "handcuffgag" - item_state = "kinkycuff" - /obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params) ..() if(istype(I, /obj/item/stack/rods)) @@ -213,7 +198,6 @@ /obj/item/restraints/handcuffs/cable/zipties name = "zipties" desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use." - icon_state = "zipties" item_state = "zipties" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' @@ -229,6 +213,21 @@ /obj/item/restraints/handcuffs/cable/zipties/used/attack() return +/obj/item/restraints/handcuffs/alien + icon_state = "handcuffAlien" + +/obj/item/restraints/handcuffs/fake + name = "fake handcuffs" + desc = "Fake handcuffs meant for gag purposes." + breakouttime = 10 //Deciseconds = 1s + +/obj/item/restraints/handcuffs/fake/kinky + name = "kinky handcuffs" + desc = "Fake handcuffs meant for erotic roleplay." + icon = 'modular_citadel/icons/obj/items_and_weapons.dmi' + icon_state = "handcuffgag" + item_state = "kinkycuff" + //Legcuffs /obj/item/restraints/legcuffs From 2f657009133770a44f32ab8667e768c9f4f454f6 Mon Sep 17 00:00:00 2001 From: Ghommie Date: Wed, 7 Aug 2019 06:12:14 +0200 Subject: [PATCH 438/608] Fixes clock cult Abscond. --- .../antagonists/clockcult/clock_scriptures/scripture_drivers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm index 510c279f3c..6d6b1fa9d0 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm @@ -224,7 +224,7 @@ . = ..() /datum/clockwork_scripture/abscond/scripture_effects() - var/mob/living/pulled_mob = invoker.pulling && isliving(invoker.pulling) && get_clockwork_power(ABSCOND_ABDUCTION_COST) + var/mob/living/pulled_mob = (invoker.pulling && isliving(invoker.pulling) && get_clockwork_power(ABSCOND_ABDUCTION_COST)) ? invoker.pulling : null var/turf/T if(GLOB.ark_of_the_clockwork_justiciar) T = get_step(GLOB.ark_of_the_clockwork_justiciar, SOUTH) From 41feed5f7ebda18c6d14165ea54082d6d3891c59 Mon Sep 17 00:00:00 2001 From: Linzolle Date: Tue, 6 Aug 2019 23:50:00 -0500 Subject: [PATCH 439/608] adds rainbow knife inhands icon, also makes knife the same shade of grey when held in either hand. --- .../mob/inhands/equipment/kitchen_lefthand.dmi | Bin 761 -> 2025 bytes .../inhands/equipment/kitchen_righthand.dmi | Bin 738 -> 2372 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/inhands/equipment/kitchen_lefthand.dmi b/icons/mob/inhands/equipment/kitchen_lefthand.dmi index 277a7d8f0585f1ddbe44c48aa948a05fe6f7d467..93cd988cff83c104671b7a47dfe56b0f16762529 100644 GIT binary patch literal 2025 zcmZvc2{aq%7JwN`HC;T@TAp=;p$S@Q>sVjgC_S~jCe{*KTkJHO5*qERsok@bB9d1v z#!gJMk*20<37S$%P&-@OL38~#Od0JW_r zO;<3w@p2I;&wg?sm1<^sEgYH~!riczi8m%!-s^sQw#im?RlyB5^yUF$`r;Fxx~p#| zzdx4D`SF2i0)?&SKiKoPTXOps$TXr3_Sm;-4`q^bAsU~VkTZ-1PNEVyBxbUtHZ5<5 z|C(nFk8p>h9q{>5%=NWp4I#$?9X#xEhB1%Qu64P+c@zLuKzcAv7~Brgb9Hh$=Y|aJ z3RDLn#l)o7u0k%l-XUQ&sq!gs>G>1dV~aK4a~_^sbQ zXGVigB$ti#5uY~jy)bot9b~DoZeVyBe{*@o`)AL;q6cJ6TFm^-Svmh zxgUAA2HSWh;|X%?C4`Cc$cKQbh1RmQL+|ikETkTX<-mv0ydY>_e~3x(;rjEohDk?E z_G%hf5M3_54Ekj_Z4Df0;-^E|PdHeqxnN~gds;X*H#fWL;YXpAC;xOR_UU@W)Z@d& zes78}%zT5}_j3w8*4oy|nhwPQuwiXH1$&S5nhd)&>&5+n+?F(8vcLC|IxUyfLKG{F zC;L2E6-fMEyFX}!sx@=P9j;222gdm_08pv5rOC#01yCr3cHtHU!$@Q0%nD4sux$Qi zi#Uulq`-x}o@~X`4DUt2dyNp)UB23s$+xtAyNi3*!a1HYsrM~;*SQ`A&dk3;o- zt{G0HJ5*Dvj7g1k^x*<%yB6@rH*;tcWvA?{tT2w?hhE*@Lma^#%04f)E zZs2A8jNFG-y;yz}$%~~<%P(;&b&>f)-d`V$;H>QIL>Fz89wDnE$cq=+jx6qlY4E1# zny1ywiySL-b#~n#9l;Y%B3N%XuLr1f?b zS#;~S2c9pw0wE9xKJj&Zc1`+xm0>QIi$-L;0qDvP2|m0L}~LiqAmV#t}-Ke|KwOYKVpL!*4~}1aW2Rf zj&?%@@~ihG9XS=TSgZm9fiO}!Uf}&Ek<@P{$~>BF*NlVQ+qo18tT6qREajmmL%`fZb z&%&T$lOQ8rh?+BxRGk6@@4tH`EUUtRLctYgNSLQSCYV^4=881V9M zR~Hp3KkohgeL^#CXWew`6+NfFpR5aof3H`ZG6srcI71xwK55s=;c~iAunQV7hDyiD zMF<~OQCy4%LvdCV;&M^Ibi)KSCIPw9;rlFeGGBQhj<>{oC+|^+HnJ7Xf#8l0Rg9Nh zVCiyxDV5F`M55y3EllIt0i}5`ui)j_EF5qW#47guZnesaS!XQs^9vmk5^PrEhJy^w##X z$~{9A-7@J8Y1AG-3_b898Iu^&e!l6sg}a_#QaEiPliW?m{a_>5;PWR^QtAXQ_>sZw z8*b*?K+vL&$Rk|7UP$AP^94%LGwaxl=KM@LMfaweQH8U3JtxbYOiN75Lx}Jkz|@{? zcM2Z}WU;zbR*!aE=(B2)02z~_Fw;BWdfWdCH;|F9%bGNx?vPiZgRYLC<)zon=H=VI zSU3zUi@4f!v_`?XHyL|UkL#K8)3G^#q6K8OfyNfhgBO5xNHln15mvjok zdf&a`J@U=|`5Yxgk?uCI>Q^1oKfp{yIiqR#HQ<$h9cx7w8h)jyNjUiL-u@q;q?9Ec zrhYuuJCA6+i>vyrKNbEf0Z}4|s%mz{R}d1Qj_tXZUy@Rw(zp`Q0!$}Pu^!akWR2qC zNSi6)=+=_~(Gq&*LhW%S%6hs_jYrri{6LHJ<$p7&hHt&T{i1L|NGK%S~Rr{J6WwbyS_V=xfV6E_#dKW>5qCmwmZ(IbXE5Ev};!I Y_V@2)8{fP4;EU<1oin8V(#`w-2FmNzg#Z8m literal 761 zcmV005u_0{{R3dEt5<0000jP)t-s0000! zF&4jCdO%gZw}Gm(*zO-)Vz|Nr0L-;@fsBme*a0d!JM zQvg8b*k%9#0F!!DSad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1Gf#<&GbOXA7^Ibp zGp#5wHxCU64c36KlSg5U)>01FPl!UN25 zaK#dK9>F~u4#2_#NWuXOXOLn3db+Bnn}CUt_eJTl>-DQ=;-aEb0DwP$?^m|HMC5Ge zdGVKZT&1Q&$4|bcc|A?%g7?%{-k>M;JA*V~g@!)pK1<`{c?q(Hc_5F^0*ab|e;|!7 z0t%Yin13Keyc-lItfpor?E2-?OxS0%I;NlUjMGH-aQRF0*;2G1n!sTO00000ZkQnd zpx2VTN|3BuLvlSP%JRJ=P{T?5IVJPR2z`E)V01d_v`t2sx4htWlAO~SKk%Ax2?Cp7 z#+Cp8006iZYNWW3e2pUiXVd#aQ_(FgUC$J|p~d~7eu#Z-z$7o}5~)QK4UI>QQBl`l zmY~`4K-DKr*8)A84>8K%7p_bOx zMvIh8h<%wN(ON>`M4LU`AaSaqlrrRhVpe)a$|scZpP4F!hXJ zPjH1t%ksH`j2yz*K9|yPGc0M?C9p5cYIUB15x%$v9;@ROOe0e7qfPv#sM2h|P?b*i z#tEJg55G9@1b=XEHF7ul!boja{69~adi+f2YES3Vg8yCxNB{^*IciU!x=jhD_?x+!pyyyJ5w_Y^<34t*9-dyyi=GAb+|i$Dh+RF#Y{(p^B7Kf!*<@a8XzcY| z_Gfc2##dGb>Xo_*dT^KOK1JnCZD?gsew|Av@fGVbIXNAm$u&40n1;p3KmX-Jd4tq* z@ZAqOEDKs$K--0q#U(G6DT3_(em}^}W%G8>w>bSa+uzOvc*K=&iv9bkHzB9WfK0St zos@!-NU%Bl;U@~W$^?P>=W@8s)o@p($KDu{xD42xo_^-k(MT|_!4W@@7;e2~&>s~~ zdn7MtpI=yrWWHE4aVj3+aAaPk*d`mi4u{Tj6<@b5`Ol&QySlm}jKHiGugobSBEF?L zy~_uQLLFRQv!FXvS?~mM)rR}j2G?NFAy(`Ad%5jem!3^J8G|dx<(uc@y!q`wj_|)-C>pBj53yb07ibyrRRY(cR7D-XiStHA%jlDEQACrc8_6~;Mi|_S z#EvtW`klEXTt6e#!S$z=iHV5~G&^>~WSqqu8zZ=K2L@nOUDXJTSwY*+j`S)ER82*O z6~C&dI;a*sv`yui_!t@+H&U^>=gj!oR>l~7ad9!e={VIjGS-NVSrBgf!jH^cErp#T z*tfCQs|$dsMK4~f4K69(4<+GT>1#MWzthU2TzbK+?Z%9*HV;W12!yyj`sU4p6FrVA zO4mwZ$f&3fTiTkctKVx zIiI9)TkVyDc-lX_aeA(olqT~~wB%Z`@v6AO6^F`4FDVoiRDLtPGq)y)n85oL74BKy zn_Mk6juCq{_e5c_LLNasYv3mIXUok91K@lDoZ1+puimekD?khCR@NDKc&Em+wh`LlX zMD|A8hY-arCqGTbW0v*?+0sR-m?c#stn4j|{qAP0ND0-{qkGMq1|?oR(>lm7y@RTx zc|{&ID|^ELl{f7B58gs|(P7T^UgA#k-D(&8%iZ?{>6i9}2FJa&GsxGV9=0a@fmzx! zmKL_fB`{jG)MPiZ98rb5sucE-XNCn#KsF0T9wl3@oop2%sCP9P&3!Zt^GNX0@KZEW z|2_D=j#dpUB?xm;$9n+c;y)eH_J2DF(+2oI-cBc*O|2N{*L2-a)_=Q6=sL!>3el(4X zE|c(yVX$;(@$F-cf55*?47``c0K{5ZBnV67KM!K{P#}aUIuCisg7IUTf|Rr9a?OM! z!zy{dsaIm*4ZG@tWNIl;o@||m(HwViS6SlA9j8=Zz4VOBooPU5jX2Ze#AllxGEjSzBiSZI%y$SAX5Q^dCjB(GAJqKu>z)1IEkYI1SP|j) UAbcZszC{3=OZJvTbFUwM2d8cgf&c&j literal 738 zcmV<80v-K{P)005u_0{{R3dEt5<0000jP)t-s|Ns9! zF&4jCdO%gZw}Gynhpk&%&2O-=v*|98E)EdT%j0d!JM zQvg8b*k%9#0F!!DSad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1Gf#<&GbOXA7^Ibp zGp#5wHx7eLAd!WqIMVD0hPW0aMU(0`TfKlA4=qL?HB09=A1UQS~gk~EDK zi$ZRwxeJUmwR9NKP}hxze(hmon2!swVb9>vJMrjYn+F<%iEKcoLB&So13C@aOJqb( zz`EhyDlBQ|z?0B?Pe&f1M$ss|pZ)Is!$YtULl#0r00000fCDOCBKM4ccb2WDff|rS z?@6)mQ<|e0H3<(Wox`4vFJksg9*AG&Q>Js?@NMFm)E0IOGoYif5k0v90001Rl_=-% zKbqaE^a+$Qs5i?USpYNd`c{T?W4WUXpx01^baT0*3!vf+m7urFJa}azC_x7R002N+ zc zrJdhfF#&{t$>-@4b`d{>;u;}fk~E*NsvJ>8Ot9$ff}JkiKp_AC006FyoAnp>yk7I? z2sRt$vA_BDTx7PtoZ Date: Wed, 7 Aug 2019 00:06:10 -0500 Subject: [PATCH 440/608] minor tweak --- .../inhands/equipment/kitchen_righthand.dmi | Bin 2372 -> 2368 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/inhands/equipment/kitchen_righthand.dmi b/icons/mob/inhands/equipment/kitchen_righthand.dmi index 8f2841b8819657b1db354754eea2ecdead57ffc6..075b4c20336ae7990becb0f8c79729379ba6014d 100644 GIT binary patch delta 1725 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 From deeda9ebdbaa791b79044fdd2b8da0d39caf5146 Mon Sep 17 00:00:00 2001 From: YakumoChen Date: Wed, 7 Aug 2019 07:53:14 +0000 Subject: [PATCH 441/608] Update cloning.dm --- code/game/machinery/computer/cloning.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index bfa6b46134..1654768de0 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -1,4 +1,4 @@ -#define AUTOCLONING_MINIMAL_LEVEL 3 +#define AUTOCLONING_MINIMAL_LEVEL 4 /obj/machinery/computer/cloning name = "cloning console" From 2a049e3485523266963846a4d954bcab25893079 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 7 Aug 2019 09:40:13 +0100 Subject: [PATCH 442/608] Should fix the locker conflict! (untested) --- .../objects/structures/crates_lockers/closets.dm | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 737e80a26d..cd79d8ddaf 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -36,6 +36,9 @@ var/icon_welded = "welded" var/obj/item/electronics/airlock/lockerelectronics //Installed electronics var/lock_in_use = FALSE //Someone is doing some stuff with the lock here, better not proceed further + var/eigen_teleport = FALSE //If the closet leads to Mr Tumnus. + var/obj/structure/closet/eigen_target //Where you go to. + /obj/structure/closet/Initialize(mapload) . = ..() @@ -144,6 +147,8 @@ /obj/structure/closet/proc/togglelock(mob/living/user) add_fingerprint(user) + if(eigen_target) + return if(opened) return if(!can_lock(user)) @@ -186,7 +191,12 @@ if(contents.len >= storage_capacity) return -1 if(insertion_allowed(AM)) - AM.forceMove(src) + if(eigen_teleport) // For teleporting people with linked lockers. + do_teleport(AM, get_turf(eigen_target), 0) + if(eigen_target.opened == FALSE) + eigen_target.bust_open() + else + AM.forceMove(src) return TRUE else return FALSE @@ -363,6 +373,9 @@ to_chat(user, "You begin [welded ? "unwelding":"welding"] \the [src]...") if(W.use_tool(src, user, 40, volume=50)) + if(eigen_teleport) + to_chat(user, "The unstable nature of \the [src] makes it impossible to weld!") + return if(opened) return welded = !welded From 80fe0274aa4bd898bd88abcf6c9740313e81b8cc Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 7 Aug 2019 09:49:00 +0100 Subject: [PATCH 443/608] Updated ToriSprites. --- modular_citadel/icons/obj/FermiChem.dmi | Bin 4234 -> 2282 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/modular_citadel/icons/obj/FermiChem.dmi b/modular_citadel/icons/obj/FermiChem.dmi index e470b9638fedf942ef90586c3d1d6cb8f095013b..de7a86d574ed4267f45ccee33a971624f54bc5e9 100644 GIT binary patch literal 2282 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 From 7391581a26c811e695a758c1ec5372d8e3f6093e Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 7 Aug 2019 11:33:53 +0100 Subject: [PATCH 444/608] 2 small fixes. --- code/game/objects/structures/crates_lockers/closets.dm | 3 +++ modular_citadel/code/modules/reagents/objects/items.dm | 2 ++ 2 files changed, 5 insertions(+) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index cd79d8ddaf..f097d2903a 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -349,6 +349,9 @@ to_chat(user, "You begin cutting \the [src] apart...") if(W.use_tool(src, user, 40, volume=50)) + if(eigen_teleport) + to_chat(user, "The unstable nature of \the [src] makes it impossible to cut!") + return if(!opened) return user.visible_message("[user] slices apart \the [src].", diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index e7b73525c6..d1156af020 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -11,6 +11,8 @@ //A little janky with pockets /obj/item/fermichem/pHbooklet/attack_hand(mob/user) if(user.get_held_index_of_item(src))//Does this check pockets too..? + if(numberOfPages == 50) + icon_state = "pHbookletOpen" if(numberOfPages >= 1) var/obj/item/fermichem/pHpaper/P = new /obj/item/fermichem/pHpaper P.add_fingerprint(user) From a8e2311caf147b73f0d22d1623377290e26b0b24 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 7 Aug 2019 14:53:20 +0100 Subject: [PATCH 445/608] Bloomin' indents! --- modular_citadel/code/modules/reagents/objects/items.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index d1156af020..02f2db7c1e 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -11,8 +11,8 @@ //A little janky with pockets /obj/item/fermichem/pHbooklet/attack_hand(mob/user) if(user.get_held_index_of_item(src))//Does this check pockets too..? - if(numberOfPages == 50) - icon_state = "pHbookletOpen" + if(numberOfPages == 50) + icon_state = "pHbookletOpen" if(numberOfPages >= 1) var/obj/item/fermichem/pHpaper/P = new /obj/item/fermichem/pHpaper P.add_fingerprint(user) From 10b2cec4855511c0834836eac155a5cfb07160de Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 7 Aug 2019 16:52:58 +0100 Subject: [PATCH 446/608] Adds a analyse function for advanced chems --- .../chemistry/machinery/chem_master.dm | 12 ++++++- tgui/assets/tgui.js | 34 +++++++++---------- tgui/src/interfaces/chem_master.ract | 23 +++++++++++++ 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index eaa3df817a..5e1d662446 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -21,6 +21,7 @@ var/analyzeVars[0] var/useramount = 30 // Last used amount var/list/pillStyles + var/fermianalyze //Give more detail on fermireactions on analysis /obj/machinery/chem_master/Initialize() create_reagents(100) @@ -170,6 +171,7 @@ data["condi"] = condi data["screen"] = screen data["analyzeVars"] = analyzeVars + data["fermianalyze"] = fermianalyze data["chosenPillStyle"] = chosenPillStyle data["isPillBottleLoaded"] = bottle ? 1 : 0 if(bottle) @@ -389,7 +391,15 @@ state = "Gas" var/const/P = 3 //The number of seconds between life ticks var/T = initial(R.metabolization_rate) * (60 / P) - analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold)) + if(istype(R, /datum/reagent/fermi)) + fermianalyze = TRUE + var/datum/chemical_reaction/Rcr = get_chemical_reaction(R.id) + message_admins("[Rcr]") + var/pHpeakCache = (Rcr.OptimalpHMin + Rcr.OptimalpHMax)/2 + analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold), "purityF" = initial(R.purity), "inverseRatioF" = initial(R.InverseChemVal), "purityE" = initial(Rcr.PurityMin), "minTemp" = initial(Rcr.OptimalTempMin), "maxTemp" = initial(Rcr.OptimalTempMax), "eTemp" = initial(Rcr.ExplodeTemp), "pHpeak" = pHpeakCache) + else + fermianalyze = FALSE + analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold)) screen = "analyze" return diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index 7e1c48003f..3599ece4f4 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,21 +1,21 @@ require=function(){function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var p="function"==typeof require&&require;if(!s&&p)return p(o,!0);if(i)return i(o,!0);var u=Error("Cannot find module '"+o+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n||t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),O}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:h(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=g),O}}}("object"==typeof t?t:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,void 0!==t?t:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(t,e,n){t(129),e.exports=t(24).RegExp.escape},{129:129,24:24}],4:[function(t,e,n){e.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},{}],5:[function(t,e,n){var a=t(19);e.exports=function(t,e){if("number"!=typeof t&&"Number"!=a(t))throw TypeError(e);return+t}},{19:19}],6:[function(t,e,n){var a=t(127)("unscopables"),r=Array.prototype;void 0==r[a]&&t(43)(r,a,{}),e.exports=function(t){r[a][t]=!0}},{127:127,43:43}],7:[function(t,e,n){e.exports=function(t,e,n,a){if(!(t instanceof e)||void 0!==a&&a in t)throw TypeError(n+": incorrect invocation!");return t}},{}],8:[function(t,e,n){var a=t(52);e.exports=function(t){if(!a(t))throw TypeError(t+" is not an object!");return t}},{52:52}],9:[function(t,e,n){"use strict";var a=t(117),r=t(112),i=t(116);e.exports=[].copyWithin||function(t,e){var n=a(this),o=i(n.length),s=r(t,o),p=r(e,o),u=arguments.length>2?arguments[2]:void 0,c=Math.min((void 0===u?o:r(u,o))-p,o-s),l=1;for(s>p&&p+c>s&&(l=-1,p+=c-1,s+=c-1);c-- >0;)p in n?n[s]=n[p]:delete n[s],s+=l,p+=l;return n}},{112:112,116:116,117:117}],10:[function(t,e,n){"use strict";var a=t(117),r=t(112),i=t(116);e.exports=function(t){for(var e=a(this),n=i(e.length),o=arguments.length,s=r(o>1?arguments[1]:void 0,n),p=o>2?arguments[2]:void 0,u=void 0===p?n:r(p,n);u>s;)e[s++]=t;return e}},{112:112,116:116,117:117}],11:[function(t,e,n){var a=t(40);e.exports=function(t,e){var n=[];return a(t,!1,n.push,n,e),n}},{40:40}],12:[function(t,e,n){var a=t(115),r=t(116),i=t(112);e.exports=function(t){return function(e,n,o){var s,p=a(e),u=r(p.length),c=i(o,u);if(t&&n!=n){for(;u>c;)if(s=p[c++],s!=s)return!0}else for(;u>c;c++)if((t||c in p)&&p[c]===n)return t||c||0;return!t&&-1}}},{112:112,115:115,116:116}],13:[function(t,e,n){var a=t(26),r=t(48),i=t(117),o=t(116),s=t(16);e.exports=function(t,e){var n=1==t,p=2==t,u=3==t,c=4==t,l=6==t,d=5==t||l,f=e||s;return function(e,s,h){for(var m,g,v=i(e),b=r(v),y=a(s,h,3),_=o(b.length),x=0,w=n?f(e,_):p?f(e,0):void 0;_>x;x++)if((d||x in b)&&(m=b[x],g=y(m,x,v),t))if(n)w[x]=g;else if(g)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:w.push(m)}else if(c)return!1;return l?-1:u||c?c:w}}},{116:116,117:117,16:16,26:26,48:48}],14:[function(t,e,n){var a=t(4),r=t(117),i=t(48),o=t(116);e.exports=function(t,e,n,s,p){a(e);var u=r(t),c=i(u),l=o(u.length),d=p?l-1:0,f=p?-1:1;if(2>n)for(;;){if(d in c){s=c[d],d+=f;break}if(d+=f,p?0>d:d>=l)throw TypeError("Reduce of empty array with no initial value")}for(;p?d>=0:l>d;d+=f)d in c&&(s=e(s,c[d],d,u));return s}},{116:116,117:117,4:4,48:48}],15:[function(t,e,n){var a=t(52),r=t(50),i=t(127)("species");e.exports=function(t){var e;return r(t)&&(e=t.constructor,"function"!=typeof e||e!==Array&&!r(e.prototype)||(e=void 0),a(e)&&(e=e[i],null===e&&(e=void 0))),void 0===e?Array:e}},{127:127,50:50,52:52}],16:[function(t,e,n){var a=t(15);e.exports=function(t,e){return new(a(t))(e)}},{15:15}],17:[function(t,e,n){"use strict";var a=t(4),r=t(52),i=t(47),o=[].slice,s={},p=function(t,e,n){if(!(e in s)){for(var a=[],r=0;e>r;r++)a[r]="a["+r+"]";s[e]=Function("F,a","return new F("+a.join(",")+")")}return s[e](t,n)};e.exports=Function.bind||function(t){var e=a(this),n=o.call(arguments,1),s=function(){var a=n.concat(o.call(arguments));return this instanceof s?p(e,a.length,a):i(e,a,t)};return r(e.prototype)&&(s.prototype=e.prototype),s}},{4:4,47:47,52:52}],18:[function(t,e,n){var a=t(19),r=t(127)("toStringTag"),i="Arguments"==a(function(){return arguments}()),o=function(t,e){try{return t[e]}catch(n){}};e.exports=function(t){var e,n,s;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=o(e=Object(t),r))?n:i?a(e):"Object"==(s=a(e))&&"function"==typeof e.callee?"Arguments":s}},{127:127,19:19}],19:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],20:[function(t,e,n){"use strict";var a=t(72).f,r=t(71),i=t(91),o=t(26),s=t(7),p=t(40),u=t(56),c=t(58),l=t(98),d=t(30),f=t(66).fastKey,h=t(124),m=d?"_s":"size",g=function(t,e){var n,a=f(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,u){var c=t(function(t,a){s(t,c,e,"_i"),t._t=e,t._i=r(null),t._f=void 0,t._l=void 0,t[m]=0,void 0!=a&&p(a,n,t[u],t)});return i(c.prototype,{clear:function(){for(var t=h(this,e),n=t._i,a=t._f;a;a=a.n)a.r=!0,a.p&&(a.p=a.p.n=void 0),delete n[a.i];t._f=t._l=void 0,t[m]=0},"delete":function(t){var n=h(this,e),a=g(n,t);if(a){var r=a.n,i=a.p;delete n._i[a.i],a.r=!0,i&&(i.n=r),r&&(r.p=i),n._f==a&&(n._f=r),n._l==a&&(n._l=i),n[m]--}return!!a},forEach:function(t){h(this,e);for(var n,a=o(t,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(a(n.v,n.k,this);n&&n.r;)n=n.p},has:function(t){return!!g(h(this,e),t)}}),d&&a(c.prototype,"size",{get:function(){return h(this,e)[m]}}),c},def:function(t,e,n){var a,r,i=g(t,e);return i?i.v=n:(t._l=i={i:r=f(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[m]++,"F"!==r&&(t._i[r]=i)),t},getEntry:g,setStrong:function(t,e,n){u(t,e,function(t,n){this._t=h(t,e),this._k=n,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?c(0,n.k):"values"==e?c(0,n.v):c(0,[n.k,n.v]):(t._t=void 0,c(1))},n?"entries":"values",!n,!0),l(e)}}},{124:124,26:26,30:30,40:40,56:56,58:58,66:66,7:7,71:71,72:72,91:91,98:98}],21:[function(t,e,n){var a=t(18),r=t(11);e.exports=function(t){return function(){if(a(this)!=t)throw TypeError(t+"#toJSON isn't generic");return r(this)}}},{11:11,18:18}],22:[function(t,e,n){"use strict";var a=t(91),r=t(66).getWeak,i=t(8),o=t(52),s=t(7),p=t(40),u=t(13),c=t(42),l=t(124),d=u(5),f=u(6),h=0,m=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},v=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=v(this,t);return e?e[1]:void 0},has:function(t){return!!v(this,t)},set:function(t,e){var n=v(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=f(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,i){var u=t(function(t,a){s(t,u,e,"_i"),t._t=e,t._i=h++,t._l=void 0,void 0!=a&&p(a,n,t[i],t)});return a(u.prototype,{"delete":function(t){if(!o(t))return!1;var n=r(t);return n===!0?m(l(this,e))["delete"](t):n&&c(n,this._i)&&delete n[this._i]},has:function(t){if(!o(t))return!1;var n=r(t);return n===!0?m(l(this,e)).has(t):n&&c(n,this._i)}}),u},def:function(t,e,n){var a=r(i(e),!0);return a===!0?m(t).set(e,n):a[t._i]=n,t},ufstore:m}},{124:124,13:13,40:40,42:42,52:52,66:66,7:7,8:8,91:91}],23:[function(t,e,n){"use strict";var a=t(41),r=t(34),i=t(92),o=t(91),s=t(66),p=t(40),u=t(7),c=t(52),l=t(36),d=t(57),f=t(99),h=t(46);e.exports=function(t,e,n,m,g,v){var b=a[t],y=b,_=g?"set":"add",x=y&&y.prototype,w={},k=function(t){var e=x[t];i(x,t,"delete"==t?function(t){return v&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return v&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return v&&!c(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof y&&(v||x.forEach&&!l(function(){(new y).entries().next()}))){var S=new y,E=S[_](v?{}:-0,1)!=S,C=l(function(){S.has(1)}),P=d(function(t){new y(t)}),A=!v&&l(function(){for(var t=new y,e=5;e--;)t[_](e,e);return!t.has(-0)});P||(y=e(function(e,n){u(e,y,t);var a=h(new b,e,y);return void 0!=n&&p(n,g,a[_],a),a}),y.prototype=x,x.constructor=y),(C||A)&&(k("delete"),k("has"),g&&k("get")),(A||E)&&k(_),v&&x.clear&&delete x.clear}else y=m.getConstructor(e,t,g,_),o(y.prototype,n),s.NEED=!0;return f(y,t),w[t]=y,r(r.G+r.W+r.F*(y!=b),w),v||m.setStrong(y,t,g),y}},{34:34,36:36,40:40,41:41,46:46,52:52,57:57,66:66,7:7,91:91,92:92,99:99}],24:[function(t,e,n){var a=e.exports={version:"2.5.6"};"number"==typeof __e&&(__e=a)},{}],25:[function(t,e,n){"use strict";var a=t(72),r=t(90);e.exports=function(t,e,n){e in t?a.f(t,e,r(0,n)):t[e]=n}},{72:72,90:90}],26:[function(t,e,n){var a=t(4);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{4:4}],27:[function(t,e,n){"use strict";var a=t(36),r=Date.prototype.getTime,i=Date.prototype.toISOString,o=function(t){return t>9?t:"0"+t};e.exports=a(function(){return"0385-07-25T07:06:39.999Z"!=i.call(new Date(-5e13-1))})||!a(function(){i.call(new Date(NaN))})?function(){if(!isFinite(r.call(this)))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),a=0>e?"-":e>9999?"+":"";return a+("00000"+Math.abs(e)).slice(a?-6:-4)+"-"+o(t.getUTCMonth()+1)+"-"+o(t.getUTCDate())+"T"+o(t.getUTCHours())+":"+o(t.getUTCMinutes())+":"+o(t.getUTCSeconds())+"."+(n>99?n:"0"+o(n))+"Z"}:i},{36:36}],28:[function(t,e,n){"use strict";var a=t(8),r=t(118),i="number";e.exports=function(t){if("string"!==t&&t!==i&&"default"!==t)throw TypeError("Incorrect hint");return r(a(this),t!=i)}},{118:118,8:8}],29:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],30:[function(t,e,n){e.exports=!t(36)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{36:36}],31:[function(t,e,n){var a=t(52),r=t(41).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{41:41,52:52}],32:[function(t,e,n){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],33:[function(t,e,n){var a=t(81),r=t(78),i=t(82);e.exports=function(t){var e=a(t),n=r.f;if(n)for(var o,s=n(t),p=i.f,u=0;s.length>u;)p.call(t,o=s[u++])&&e.push(o);return e}},{78:78,81:81,82:82}],34:[function(t,e,n){var a=t(41),r=t(24),i=t(43),o=t(92),s=t(26),p="prototype",u=function(t,e,n){var c,l,d,f,h=t&u.F,m=t&u.G,g=t&u.S,v=t&u.P,b=t&u.B,y=m?a:g?a[e]||(a[e]={}):(a[e]||{})[p],_=m?r:r[e]||(r[e]={}),x=_[p]||(_[p]={});m&&(n=e);for(c in n)l=!h&&y&&void 0!==y[c],d=(l?y:n)[c],f=b&&l?s(d,a):v&&"function"==typeof d?s(Function.call,d):d,y&&o(y,c,d,t&u.U),_[c]!=d&&i(_,c,f),v&&x[c]!=d&&(x[c]=d)};a.core=r,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},{24:24,26:26,41:41,43:43,92:92}],35:[function(t,e,n){var a=t(127)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{127:127}],36:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],37:[function(t,e,n){"use strict";var a=t(43),r=t(92),i=t(36),o=t(29),s=t(127);e.exports=function(t,e,n){var p=s(t),u=n(o,p,""[t]),c=u[0],l=u[1];i(function(){var e={};return e[p]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,c),a(RegExp.prototype,p,2==e?function(t,e){return l.call(t,this,e)}:function(t){return l.call(t,this)}))}},{127:127,29:29,36:36,43:43,92:92}],38:[function(t,e,n){"use strict";var a=t(8);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{8:8}],39:[function(t,e,n){"use strict";function a(t,e,n,u,c,l,d,f){for(var h,m,g=c,v=0,b=d?s(d,f,3):!1;u>v;){if(v in n){if(h=b?b(n[v],v,e):n[v],m=!1,i(h)&&(m=h[p],m=void 0!==m?!!m:r(h)),m&&l>0)g=a(t,e,h,o(h.length),g,l-1)-1;else{if(g>=9007199254740991)throw TypeError();t[g]=h}g++}v++}return g}var r=t(50),i=t(52),o=t(116),s=t(26),p=t(127)("isConcatSpreadable");e.exports=a},{116:116,127:127,26:26,50:50,52:52}],40:[function(t,e,n){var a=t(26),r=t(54),i=t(49),o=t(8),s=t(116),p=t(128),u={},c={},n=e.exports=function(t,e,n,l,d){var f,h,m,g,v=d?function(){return t}:p(t),b=a(n,l,e?2:1),y=0;if("function"!=typeof v)throw TypeError(t+" is not iterable!");if(i(v)){for(f=s(t.length);f>y;y++)if(g=e?b(o(h=t[y])[0],h[1]):b(t[y]),g===u||g===c)return g}else for(m=v.call(t);!(h=m.next()).done;)if(g=r(m,b,h.value,e),g===u||g===c)return g};n.BREAK=u,n.RETURN=c},{116:116,128:128,26:26,49:49,54:54,8:8}],41:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],42:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],43:[function(t,e,n){var a=t(72),r=t(90);e.exports=t(30)?function(t,e,n){return a.f(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{30:30,72:72,90:90}],44:[function(t,e,n){var a=t(41).document;e.exports=a&&a.documentElement},{41:41}],45:[function(t,e,n){e.exports=!t(30)&&!t(36)(function(){return 7!=Object.defineProperty(t(31)("div"),"a",{get:function(){return 7}}).a})},{30:30,31:31,36:36}],46:[function(t,e,n){var a=t(52),r=t(97).set;e.exports=function(t,e,n){var i,o=e.constructor;return o!==n&&"function"==typeof o&&(i=o.prototype)!==n.prototype&&a(i)&&r&&r(t,i),t}},{52:52,97:97}],47:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],48:[function(t,e,n){var a=t(19);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{19:19}],49:[function(t,e,n){var a=t(59),r=t(127)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{127:127,59:59}],50:[function(t,e,n){var a=t(19);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{19:19}],51:[function(t,e,n){var a=t(52),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{52:52}],52:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],53:[function(t,e,n){var a=t(52),r=t(19),i=t(127)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{127:127,19:19,52:52}],54:[function(t,e,n){var a=t(8);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{8:8}],55:[function(t,e,n){"use strict";var a=t(71),r=t(90),i=t(99),o={};t(43)(o,t(127)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a(o,{next:r(1,n)}),i(t,e+" Iterator")}},{127:127,43:43,71:71,90:90,99:99}],56:[function(t,e,n){"use strict";var a=t(60),r=t(34),i=t(92),o=t(43),s=t(59),p=t(55),u=t(99),c=t(79),l=t(127)("iterator"),d=!([].keys&&"next"in[].keys()),f="@@iterator",h="keys",m="values",g=function(){return this};e.exports=function(t,e,n,v,b,y,_){p(n,e,v);var x,w,k,S=function(t){if(!d&&t in A)return A[t];switch(t){case h:return function(){return new n(this,t)};case m:return function(){return new n(this,t)}}return function(){return new n(this,t)}},E=e+" Iterator",C=b==m,P=!1,A=t.prototype,O=A[l]||A[f]||b&&A[b],T=O||S(b),R=b?C?S("entries"):T:void 0,M="Array"==e?A.entries||O:O;if(M&&(k=c(M.call(new t)),k!==Object.prototype&&k.next&&(u(k,E,!0),a||"function"==typeof k[l]||o(k,l,g))),C&&O&&O.name!==m&&(P=!0,T=function(){return O.call(this)}),a&&!_||!d&&!P&&A[l]||o(A,l,T),s[e]=T,s[E]=g,b)if(x={values:C?T:S(m),keys:y?T:S(h),entries:R},_)for(w in x)w in A||i(A,w,x[w]);else r(r.P+r.F*(d||P),e,x);return x}},{127:127,34:34,43:43,55:55,59:59,60:60,79:79,92:92,99:99}],57:[function(t,e,n){var a=t(127)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){return{done:n=!0}},i[a]=function(){return o},t(i)}catch(s){}return n}},{127:127}],58:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],59:[function(t,e,n){e.exports={}},{}],60:[function(t,e,n){e.exports=!1},{}],61:[function(t,e,n){var a=Math.expm1;e.exports=!a||a(10)>22025.465794806718||a(10)<22025.465794806718||-2e-17!=a(-2e-17)?function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}:a},{}],62:[function(t,e,n){var a=t(65),r=Math.pow,i=r(2,-52),o=r(2,-23),s=r(2,127)*(2-o),p=r(2,-126),u=function(t){return t+1/i-1/i};e.exports=Math.fround||function(t){var e,n,r=Math.abs(t),c=a(t);return p>r?c*u(r/p/o)*p*o:(e=(1+o/i)*r,n=e-(e-r),n>s||n!=n?c*(1/0):c*n)}},{65:65}],63:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],64:[function(t,e,n){e.exports=Math.scale||function(t,e,n,a,r){return 0===arguments.length||t!=t||e!=e||n!=n||a!=a||r!=r?NaN:t===1/0||t===-(1/0)?t:(t-e)*(r-a)/(n-e)+a}},{}],65:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],66:[function(t,e,n){var a=t(122)("meta"),r=t(52),i=t(42),o=t(72).f,s=0,p=Object.isExtensible||function(){return!0},u=!t(36)(function(){return p(Object.preventExtensions({}))}),c=function(t){o(t,a,{value:{i:"O"+ ++s,w:{}}})},l=function(t,e){if(!r(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,a)){if(!p(t))return"F";if(!e)return"E";c(t)}return t[a].i},d=function(t,e){if(!i(t,a)){if(!p(t))return!0;if(!e)return!1;c(t)}return t[a].w},f=function(t){return u&&h.NEED&&p(t)&&!i(t,a)&&c(t),t},h=e.exports={KEY:a,NEED:!1,fastKey:l,getWeak:d,onFreeze:f}},{122:122,36:36,42:42,52:52,72:72}],67:[function(t,e,n){var a=t(159),r=t(34),i=t(101)("metadata"),o=i.store||(i.store=new(t(265))),s=function(t,e,n){var r=o.get(t);if(!r){if(!n)return;o.set(t,r=new a)}var i=r.get(e);if(!i){if(!n)return;r.set(e,i=new a)}return i},p=function(t,e,n){var a=s(e,n,!1);return void 0===a?!1:a.has(t)},u=function(t,e,n){var a=s(e,n,!1);return void 0===a?void 0:a.get(t)},c=function(t,e,n,a){s(n,a,!0).set(t,e)},l=function(t,e){var n=s(t,e,!1),a=[];return n&&n.forEach(function(t,e){a.push(e)}),a},d=function(t){return void 0===t||"symbol"==typeof t?t:t+""},f=function(t){r(r.S,"Reflect",t)};e.exports={store:o,map:s,has:p,get:u,set:c,keys:l,key:d,exp:f}},{101:101,159:159,265:265,34:34}],68:[function(t,e,n){var a=t(41),r=t(111).set,i=a.MutationObserver||a.WebKitMutationObserver,o=a.process,s=a.Promise,p="process"==t(19)(o);e.exports=function(){var t,e,n,u=function(){var a,r;for(p&&(a=o.domain)&&a.exit();t;){r=t.fn,t=t.next;try{r()}catch(i){throw t?n():e=void 0,i}}e=void 0,a&&a.enter()};if(p)n=function(){o.nextTick(u)};else if(!i||a.navigator&&a.navigator.standalone)if(s&&s.resolve){var c=s.resolve(void 0);n=function(){c.then(u)}}else n=function(){r.call(a,u)};else{var l=!0,d=document.createTextNode("");new i(u).observe(d,{characterData:!0}),n=function(){d.data=l=!l}}return function(a){var r={fn:a,next:void 0};e&&(e.next=r),t||(t=r,n()),e=r}}},{111:111,19:19,41:41}],69:[function(t,e,n){"use strict";function a(t){var e,n;this.promise=new t(function(t,a){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=a}),this.resolve=r(e),this.reject=r(n)}var r=t(4);e.exports.f=function(t){return new a(t)}},{4:4}],70:[function(t,e,n){"use strict";var a=t(81),r=t(78),i=t(82),o=t(117),s=t(48),p=Object.assign;e.exports=!p||t(36)(function(){var t={},e={},n=Symbol(),a="abcdefghijklmnopqrst";return t[n]=7,a.split("").forEach(function(t){e[t]=t}),7!=p({},t)[n]||Object.keys(p({},e)).join("")!=a})?function(t,e){for(var n=o(t),p=arguments.length,u=1,c=r.f,l=i.f;p>u;)for(var d,f=s(arguments[u++]),h=c?a(f).concat(c(f)):a(f),m=h.length,g=0;m>g;)l.call(f,d=h[g++])&&(n[d]=f[d]);return n}:p},{117:117,36:36,48:48,78:78,81:81,82:82}],71:[function(t,e,n){var a=t(8),r=t(73),i=t(32),o=t(100)("IE_PROTO"),s=function(){},p="prototype",u=function(){var e,n=t(31)("iframe"),a=i.length,r="<",o=">";for(n.style.display="none",t(44).appendChild(n),n.src="javascript:",e=n.contentWindow.document,e.open(),e.write(r+"script"+o+"document.F=Object"+r+"/script"+o),e.close(),u=e.F;a--;)delete u[p][i[a]];return u()};e.exports=Object.create||function(t,e){var n;return null!==t?(s[p]=a(t),n=new s,s[p]=null,n[o]=t):n=u(),void 0===e?n:r(n,e)}},{100:100,31:31,32:32,44:44,73:73,8:8}],72:[function(t,e,n){var a=t(8),r=t(45),i=t(118),o=Object.defineProperty;n.f=t(30)?Object.defineProperty:function(t,e,n){if(a(t),e=i(e,!0),a(n),r)try{return o(t,e,n)}catch(s){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},{118:118,30:30,45:45,8:8}],73:[function(t,e,n){var a=t(72),r=t(8),i=t(81);e.exports=t(30)?Object.defineProperties:function(t,e){r(t);for(var n,o=i(e),s=o.length,p=0;s>p;)a.f(t,n=o[p++],e[n]);return t}},{30:30,72:72,8:8,81:81}],74:[function(t,e,n){"use strict";e.exports=t(60)||!t(36)(function(){var e=Math.random();__defineSetter__.call(null,e,function(){}),delete t(41)[e]})},{36:36,41:41,60:60}],75:[function(t,e,n){var a=t(82),r=t(90),i=t(115),o=t(118),s=t(42),p=t(45),u=Object.getOwnPropertyDescriptor;n.f=t(30)?u:function(t,e){if(t=i(t),e=o(e,!0),p)try{return u(t,e)}catch(n){}return s(t,e)?r(!a.f.call(t,e),t[e]):void 0}},{115:115,118:118,30:30,42:42,45:45,82:82,90:90}],76:[function(t,e,n){var a=t(115),r=t(77).f,i={}.toString,o="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.f=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{115:115,77:77}],77:[function(t,e,n){var a=t(80),r=t(32).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return a(t,r)}},{32:32,80:80}],78:[function(t,e,n){n.f=Object.getOwnPropertySymbols},{}],79:[function(t,e,n){var a=t(42),r=t(117),i=t(100)("IE_PROTO"),o=Object.prototype;e.exports=Object.getPrototypeOf||function(t){return t=r(t),a(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?o:null}},{100:100,117:117,42:42}],80:[function(t,e,n){var a=t(42),r=t(115),i=t(12)(!1),o=t(100)("IE_PROTO");e.exports=function(t,e){var n,s=r(t),p=0,u=[];for(n in s)n!=o&&a(s,n)&&u.push(n);for(;e.length>p;)a(s,n=e[p++])&&(~i(u,n)||u.push(n));return u}},{100:100,115:115,12:12,42:42}],81:[function(t,e,n){var a=t(80),r=t(32);e.exports=Object.keys||function(t){return a(t,r)}},{32:32,80:80}],82:[function(t,e,n){n.f={}.propertyIsEnumerable},{}],83:[function(t,e,n){var a=t(34),r=t(24),i=t(36);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{24:24,34:34,36:36}],84:[function(t,e,n){var a=t(81),r=t(115),i=t(82).f;e.exports=function(t){return function(e){for(var n,o=r(e),s=a(o),p=s.length,u=0,c=[];p>u;)i.call(o,n=s[u++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{115:115,81:81,82:82}],85:[function(t,e,n){var a=t(77),r=t(78),i=t(8),o=t(41).Reflect;e.exports=o&&o.ownKeys||function(t){var e=a.f(i(t)),n=r.f;return n?e.concat(n(t)):e}},{41:41,77:77,78:78,8:8}],86:[function(t,e,n){var a=t(41).parseFloat,r=t(109).trim;e.exports=1/a(t(110)+"-0")!==-(1/0)?function(t){var e=r(t+"",3),n=a(e);return 0===n&&"-"==e.charAt(0)?-0:n}:a},{109:109,110:110,41:41}],87:[function(t,e,n){var a=t(41).parseInt,r=t(109).trim,i=t(110),o=/^[-+]?0[xX]/;e.exports=8!==a(i+"08")||22!==a(i+"0x16")?function(t,e){var n=r(t+"",3);return a(n,e>>>0||(o.test(n)?16:10))}:a},{109:109,110:110,41:41}],88:[function(t,e,n){e.exports=function(t){try{return{e:!1,v:t()}}catch(e){return{e:!0,v:e}}}},{}],89:[function(t,e,n){var a=t(8),r=t(52),i=t(69);e.exports=function(t,e){if(a(t),r(e)&&e.constructor===t)return e;var n=i.f(t),o=n.resolve;return o(e),n.promise}},{52:52,69:69,8:8}],90:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],91:[function(t,e,n){var a=t(92);e.exports=function(t,e,n){for(var r in e)a(t,r,e[r],n);return t}},{92:92}],92:[function(t,e,n){var a=t(41),r=t(43),i=t(42),o=t(122)("src"),s="toString",p=Function[s],u=(""+p).split(s);t(24).inspectSource=function(t){return p.call(t)},(e.exports=function(t,e,n,s){var p="function"==typeof n;p&&(i(n,"name")||r(n,"name",e)),t[e]!==n&&(p&&(i(n,o)||r(n,o,t[e]?""+t[e]:u.join(e+""))),t===a?t[e]=n:s?t[e]?t[e]=n:r(t,e,n):(delete t[e],r(t,e,n)))})(Function.prototype,s,function(){ -return"function"==typeof this&&this[o]||p.call(this)})},{122:122,24:24,41:41,42:42,43:43}],93:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],94:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],95:[function(t,e,n){"use strict";var a=t(34),r=t(4),i=t(26),o=t(40);e.exports=function(t){a(a.S,t,{from:function(t){var e,n,a,s,p=arguments[1];return r(this),e=void 0!==p,e&&r(p),void 0==t?new this:(n=[],e?(a=0,s=i(p,arguments[2],2),o(t,!1,function(t){n.push(s(t,a++))})):o(t,!1,n.push,n),new this(n))}})}},{26:26,34:34,4:4,40:40}],96:[function(t,e,n){"use strict";var a=t(34);e.exports=function(t){a(a.S,t,{of:function(){for(var t=arguments.length,e=Array(t);t--;)e[t]=arguments[t];return new this(e)}})}},{34:34}],97:[function(t,e,n){var a=t(52),r=t(8),i=function(t,e){if(r(t),!a(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,a){try{a=t(26)(Function.call,t(75).f(Object.prototype,"__proto__").set,2),a(e,[]),n=!(e instanceof Array)}catch(r){n=!0}return function(t,e){return i(t,e),n?t.__proto__=e:a(t,e),t}}({},!1):void 0),check:i}},{26:26,52:52,75:75,8:8}],98:[function(t,e,n){"use strict";var a=t(41),r=t(72),i=t(30),o=t(127)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.f(e,o,{configurable:!0,get:function(){return this}})}},{127:127,30:30,41:41,72:72}],99:[function(t,e,n){var a=t(72).f,r=t(42),i=t(127)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{127:127,42:42,72:72}],100:[function(t,e,n){var a=t(101)("keys"),r=t(122);e.exports=function(t){return a[t]||(a[t]=r(t))}},{101:101,122:122}],101:[function(t,e,n){var a=t(24),r=t(41),i="__core-js_shared__",o=r[i]||(r[i]={});(e.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:a.version,mode:t(60)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},{24:24,41:41,60:60}],102:[function(t,e,n){var a=t(8),r=t(4),i=t(127)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{127:127,4:4,8:8}],103:[function(t,e,n){"use strict";var a=t(36);e.exports=function(t,e){return!!t&&a(function(){e?t.call(null,function(){},1):t.call(null)})}},{36:36}],104:[function(t,e,n){var a=t(114),r=t(29);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",p=a(n),u=s.length;return 0>p||p>=u?t?"":void 0:(i=s.charCodeAt(p),55296>i||i>56319||p+1===u||(o=s.charCodeAt(p+1))<56320||o>57343?t?s.charAt(p):i:t?s.slice(p,p+2):(i-55296<<10)+(o-56320)+65536)}}},{114:114,29:29}],105:[function(t,e,n){var a=t(53),r=t(29);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{29:29,53:53}],106:[function(t,e,n){var a=t(34),r=t(36),i=t(29),o=/"/g,s=function(t,e,n,a){var r=i(t)+"",s="<"+e;return""!==n&&(s+=" "+n+'="'+(a+"").replace(o,""")+'"'),s+">"+r+""};e.exports=function(t,e){var n={};n[t]=e(s),a(a.P+a.F*r(function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}),"String",n)}},{29:29,34:34,36:36}],107:[function(t,e,n){var a=t(116),r=t(108),i=t(29);e.exports=function(t,e,n,o){var s=i(t)+"",p=s.length,u=void 0===n?" ":n+"",c=a(e);if(p>=c||""==u)return s;var l=c-p,d=r.call(u,Math.ceil(l/u.length));return d.length>l&&(d=d.slice(0,l)),o?d+s:s+d}},{108:108,116:116,29:29}],108:[function(t,e,n){"use strict";var a=t(114),r=t(29);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{114:114,29:29}],109:[function(t,e,n){var a=t(34),r=t(29),i=t(36),o=t(110),s="["+o+"]",p="​…",u=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e,n){var r={},s=i(function(){return!!o[t]()||p[t]()!=p}),u=r[t]=s?e(d):o[t];n&&(r[n]=u),a(a.P+a.F*s,"String",r)},d=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(u,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{110:110,29:29,34:34,36:36}],110:[function(t,e,n){e.exports=" \n\x0B\f\r   ᠎ â€â€‚         âŸã€€\u2028\u2029\ufeff"},{}],111:[function(t,e,n){var a,r,i,o=t(26),s=t(47),p=t(44),u=t(31),c=t(41),l=c.process,d=c.setImmediate,f=c.clearImmediate,h=c.MessageChannel,m=c.Dispatch,g=0,v={},b="onreadystatechange",y=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},_=function(t){y.call(t.data)};d&&f||(d=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++g]=function(){s("function"==typeof t?t:Function(t),e)},a(g),g},f=function(t){delete v[t]},"process"==t(19)(l)?a=function(t){l.nextTick(o(y,t,1))}:m&&m.now?a=function(t){m.now(o(y,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=_,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",_,!1)):a=b in u("script")?function(t){p.appendChild(u("script"))[b]=function(){p.removeChild(this),y.call(t)}}:function(t){setTimeout(o(y,t,1),0)}),e.exports={set:d,clear:f}},{19:19,26:26,31:31,41:41,44:44,47:47}],112:[function(t,e,n){var a=t(114),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{114:114}],113:[function(t,e,n){var a=t(114),r=t(116);e.exports=function(t){if(void 0===t)return 0;var e=a(t),n=r(e);if(e!==n)throw RangeError("Wrong length!");return n}},{114:114,116:116}],114:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],115:[function(t,e,n){var a=t(48),r=t(29);e.exports=function(t){return a(r(t))}},{29:29,48:48}],116:[function(t,e,n){var a=t(114),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{114:114}],117:[function(t,e,n){var a=t(29);e.exports=function(t){return Object(a(t))}},{29:29}],118:[function(t,e,n){var a=t(52);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{52:52}],119:[function(t,e,n){"use strict";if(t(30)){var a=t(60),r=t(41),i=t(36),o=t(34),s=t(121),p=t(120),u=t(26),c=t(7),l=t(90),d=t(43),f=t(91),h=t(114),m=t(116),g=t(113),v=t(112),b=t(118),y=t(42),_=t(18),x=t(52),w=t(117),k=t(49),S=t(71),E=t(79),C=t(77).f,P=t(128),A=t(122),O=t(127),T=t(13),R=t(12),M=t(102),L=t(140),j=t(59),D=t(57),N=t(98),F=t(10),I=t(9),B=t(72),q=t(75),U=B.f,V=q.f,G=r.RangeError,z=r.TypeError,W=r.Uint8Array,H="ArrayBuffer",K="Shared"+H,Q="BYTES_PER_ELEMENT",Y="prototype",$=Array[Y],J=p.ArrayBuffer,X=p.DataView,Z=T(0),tt=T(2),et=T(3),nt=T(4),at=T(5),rt=T(6),it=R(!0),ot=R(!1),st=L.values,pt=L.keys,ut=L.entries,ct=$.lastIndexOf,lt=$.reduce,dt=$.reduceRight,ft=$.join,ht=$.sort,mt=$.slice,gt=$.toString,vt=$.toLocaleString,bt=O("iterator"),yt=O("toStringTag"),_t=A("typed_constructor"),xt=A("def_constructor"),wt=s.CONSTR,kt=s.TYPED,St=s.VIEW,Et="Wrong length!",Ct=T(1,function(t,e){return Rt(M(t,t[xt]),e)}),Pt=i(function(){return 1===new W(new Uint16Array([1]).buffer)[0]}),At=!!W&&!!W[Y].set&&i(function(){new W(1).set({})}),Ot=function(t,e){var n=h(t);if(0>n||n%e)throw G("Wrong offset!");return n},Tt=function(t){if(x(t)&&kt in t)return t;throw z(t+" is not a typed array!")},Rt=function(t,e){if(!(x(t)&&_t in t))throw z("It is not a typed array constructor!");return new t(e)},Mt=function(t,e){return Lt(M(t,t[xt]),e)},Lt=function(t,e){for(var n=0,a=e.length,r=Rt(t,a);a>n;)r[n]=e[n++];return r},jt=function(t,e,n){U(t,e,{get:function(){return this._d[n]}})},Dt=function(t){var e,n,a,r,i,o,s=w(t),p=arguments.length,c=p>1?arguments[1]:void 0,l=void 0!==c,d=P(s);if(void 0!=d&&!k(d)){for(o=d.call(s),a=[],e=0;!(i=o.next()).done;e++)a.push(i.value);s=a}for(l&&p>2&&(c=u(c,arguments[2],2)),e=0,n=m(s.length),r=Rt(this,n);n>e;e++)r[e]=l?c(s[e],e):s[e];return r},Nt=function(){for(var t=0,e=arguments.length,n=Rt(this,e);e>t;)n[t]=arguments[t++];return n},Ft=!!W&&i(function(){vt.call(new W(1))}),It=function(){return vt.apply(Ft?mt.call(Tt(this)):Tt(this),arguments)},Bt={copyWithin:function(t,e){return I.call(Tt(this),t,e,arguments.length>2?arguments[2]:void 0)},every:function(t){return nt(Tt(this),t,arguments.length>1?arguments[1]:void 0)},fill:function(t){return F.apply(Tt(this),arguments)},filter:function(t){return Mt(this,tt(Tt(this),t,arguments.length>1?arguments[1]:void 0))},find:function(t){return at(Tt(this),t,arguments.length>1?arguments[1]:void 0)},findIndex:function(t){return rt(Tt(this),t,arguments.length>1?arguments[1]:void 0)},forEach:function(t){Z(Tt(this),t,arguments.length>1?arguments[1]:void 0)},indexOf:function(t){return ot(Tt(this),t,arguments.length>1?arguments[1]:void 0)},includes:function(t){return it(Tt(this),t,arguments.length>1?arguments[1]:void 0)},join:function(t){return ft.apply(Tt(this),arguments)},lastIndexOf:function(t){return ct.apply(Tt(this),arguments)},map:function(t){return Ct(Tt(this),t,arguments.length>1?arguments[1]:void 0)},reduce:function(t){return lt.apply(Tt(this),arguments)},reduceRight:function(t){return dt.apply(Tt(this),arguments)},reverse:function(){for(var t,e=this,n=Tt(e).length,a=Math.floor(n/2),r=0;a>r;)t=e[r],e[r++]=e[--n],e[n]=t;return e},some:function(t){return et(Tt(this),t,arguments.length>1?arguments[1]:void 0)},sort:function(t){return ht.call(Tt(this),t)},subarray:function(t,e){var n=Tt(this),a=n.length,r=v(t,a);return new(M(n,n[xt]))(n.buffer,n.byteOffset+r*n.BYTES_PER_ELEMENT,m((void 0===e?a:v(e,a))-r))}},qt=function(t,e){return Mt(this,mt.call(Tt(this),t,e))},Ut=function(t){Tt(this);var e=Ot(arguments[1],1),n=this.length,a=w(t),r=m(a.length),i=0;if(r+e>n)throw G(Et);for(;r>i;)this[e+i]=a[i++]},Vt={entries:function(){return ut.call(Tt(this))},keys:function(){return pt.call(Tt(this))},values:function(){return st.call(Tt(this))}},Gt=function(t,e){return x(t)&&t[kt]&&"symbol"!=typeof e&&e in t&&+e+""==e+""},zt=function(t,e){return Gt(t,e=b(e,!0))?l(2,t[e]):V(t,e)},Wt=function(t,e,n){return!(Gt(t,e=b(e,!0))&&x(n)&&y(n,"value"))||y(n,"get")||y(n,"set")||n.configurable||y(n,"writable")&&!n.writable||y(n,"enumerable")&&!n.enumerable?U(t,e,n):(t[e]=n.value,t)};wt||(q.f=zt,B.f=Wt),o(o.S+o.F*!wt,"Object",{getOwnPropertyDescriptor:zt,defineProperty:Wt}),i(function(){gt.call({})})&&(gt=vt=function(){return ft.call(this)});var Ht=f({},Bt);f(Ht,Vt),d(Ht,bt,Vt.values),f(Ht,{slice:qt,set:Ut,constructor:function(){},toString:gt,toLocaleString:It}),jt(Ht,"buffer","b"),jt(Ht,"byteOffset","o"),jt(Ht,"byteLength","l"),jt(Ht,"length","e"),U(Ht,yt,{get:function(){return this[kt]}}),e.exports=function(t,e,n,p){p=!!p;var u=t+(p?"Clamped":"")+"Array",l="get"+t,f="set"+t,h=r[u],v=h||{},b=h&&E(h),y=!h||!s.ABV,w={},k=h&&h[Y],P=function(t,n){var a=t._d;return a.v[l](n*e+a.o,Pt)},A=function(t,n,a){var r=t._d;p&&(a=(a=Math.round(a))<0?0:a>255?255:255&a),r.v[f](n*e+r.o,a,Pt)},O=function(t,e){U(t,e,{get:function(){return P(this,e)},set:function(t){return A(this,e,t)},enumerable:!0})};y?(h=n(function(t,n,a,r){c(t,h,u,"_d");var i,o,s,p,l=0,f=0;if(x(n)){if(!(n instanceof J||(p=_(n))==H||p==K))return kt in n?Lt(h,n):Dt.call(h,n);i=n,f=Ot(a,e);var v=n.byteLength;if(void 0===r){if(v%e)throw G(Et);if(o=v-f,0>o)throw G(Et)}else if(o=m(r)*e,o+f>v)throw G(Et);s=o/e}else s=g(n),o=s*e,i=new J(o);for(d(t,"_d",{b:i,o:f,l:o,e:s,v:new X(i)});s>l;)O(t,l++)}),k=h[Y]=S(Ht),d(k,"constructor",h)):i(function(){h(1)})&&i(function(){new h(-1)})&&D(function(t){new h,new h(null),new h(1.5),new h(t)},!0)||(h=n(function(t,n,a,r){c(t,h,u);var i;return x(n)?n instanceof J||(i=_(n))==H||i==K?void 0!==r?new v(n,Ot(a,e),r):void 0!==a?new v(n,Ot(a,e)):new v(n):kt in n?Lt(h,n):Dt.call(h,n):new v(g(n))}),Z(b!==Function.prototype?C(v).concat(C(b)):C(v),function(t){t in h||d(h,t,v[t])}),h[Y]=k,a||(k.constructor=h));var T=k[bt],R=!!T&&("values"==T.name||void 0==T.name),M=Vt.values;d(h,_t,!0),d(k,kt,u),d(k,St,!0),d(k,xt,h),(p?new h(1)[yt]==u:yt in k)||U(k,yt,{get:function(){return u}}),w[u]=h,o(o.G+o.W+o.F*(h!=v),w),o(o.S,u,{BYTES_PER_ELEMENT:e}),o(o.S+o.F*i(function(){v.of.call(h,1)}),u,{from:Dt,of:Nt}),Q in k||d(k,Q,e),o(o.P,u,Bt),N(u),o(o.P+o.F*At,u,{set:Ut}),o(o.P+o.F*!R,u,Vt),a||k.toString==gt||(k.toString=gt),o(o.P+o.F*i(function(){new h(1).slice()}),u,{slice:qt}),o(o.P+o.F*(i(function(){return[1,2].toLocaleString()!=new h([1,2]).toLocaleString()})||!i(function(){k.toLocaleString.call([1,2])})),u,{toLocaleString:It}),j[u]=R?T:M,a||R||d(k,bt,M)}}else e.exports=function(){}},{10:10,102:102,112:112,113:113,114:114,116:116,117:117,118:118,12:12,120:120,121:121,122:122,127:127,128:128,13:13,140:140,18:18,26:26,30:30,34:34,36:36,41:41,42:42,43:43,49:49,52:52,57:57,59:59,60:60,7:7,71:71,72:72,75:75,77:77,79:79,9:9,90:90,91:91,98:98}],120:[function(t,e,n){"use strict";function a(t,e,n){var a,r,i,o=Array(n),s=8*n-e-1,p=(1<>1,c=23===e?U(2,-24)-U(2,-77):0,l=0,d=0>t||0===t&&0>1/t?1:0;for(t=q(t),t!=t||t===I?(r=t!=t?1:0,a=p):(a=V(G(t)/z),t*(i=U(2,-a))<1&&(a--,i*=2),t+=a+u>=1?c/i:c*U(2,1-u),t*i>=2&&(a++,i/=2),a+u>=p?(r=0,a=p):a+u>=1?(r=(t*i-1)*U(2,e),a+=u):(r=t*U(2,u-1)*U(2,e),a=0));e>=8;o[l++]=255&r,r/=256,e-=8);for(a=a<0;o[l++]=255&a,a/=256,s-=8);return o[--l]|=128*d,o}function r(t,e,n){var a,r=8*n-e-1,i=(1<>1,s=r-7,p=n-1,u=t[p--],c=127&u;for(u>>=7;s>0;c=256*c+t[p],p--,s-=8);for(a=c&(1<<-s)-1,c>>=-s,s+=e;s>0;a=256*a+t[p],p--,s-=8);if(0===c)c=1-o;else{if(c===i)return a?NaN:u?-I:I;a+=U(2,e),c-=o}return(u?-1:1)*a*U(2,c-e)}function i(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}function o(t){return[255&t]}function s(t){return[255&t,t>>8&255]}function p(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}function u(t){return a(t,52,8)}function c(t){return a(t,23,4)}function l(t,e,n){C(t[R],e,{get:function(){return this[n]}})}function d(t,e,n,a){var r=+n,i=S(r);if(i+e>t[Y])throw F(L);var o=t[Q]._b,s=i+t[$],p=o.slice(s,s+e);return a?p:p.reverse()}function f(t,e,n,a,r,i){var o=+n,s=S(o);if(s+e>t[Y])throw F(L);for(var p=t[Q]._b,u=s+t[$],c=a(+r),l=0;e>l;l++)p[u+l]=c[i?l:e-l-1]}var h=t(41),m=t(30),g=t(60),v=t(121),b=t(43),y=t(91),_=t(36),x=t(7),w=t(114),k=t(116),S=t(113),E=t(77).f,C=t(72).f,P=t(10),A=t(99),O="ArrayBuffer",T="DataView",R="prototype",M="Wrong length!",L="Wrong index!",j=h[O],D=h[T],N=h.Math,F=h.RangeError,I=h.Infinity,B=j,q=N.abs,U=N.pow,V=N.floor,G=N.log,z=N.LN2,W="buffer",H="byteLength",K="byteOffset",Q=m?"_b":W,Y=m?"_l":H,$=m?"_o":K;if(v.ABV){if(!_(function(){j(1)})||!_(function(){new j(-1)})||_(function(){return new j,new j(1.5),new j(NaN),j.name!=O})){j=function(t){return x(this,j),new B(S(t))};for(var J,X=j[R]=B[R],Z=E(B),tt=0;Z.length>tt;)(J=Z[tt++])in j||b(j,J,B[J]);g||(X.constructor=j)}var et=new D(new j(2)),nt=D[R].setInt8;et.setInt8(0,2147483648),et.setInt8(1,2147483649),(et.getInt8(0)||!et.getInt8(1))&&y(D[R],{setInt8:function(t,e){nt.call(this,t,e<<24>>24)},setUint8:function(t,e){nt.call(this,t,e<<24>>24)}},!0)}else j=function(t){x(this,j,O);var e=S(t);this._b=P.call(Array(e),0),this[Y]=e},D=function(t,e,n){x(this,D,T),x(t,j,T);var a=t[Y],r=w(e);if(0>r||r>a)throw F("Wrong offset!");if(n=void 0===n?a-r:k(n),r+n>a)throw F(M);this[Q]=t,this[$]=r,this[Y]=n},m&&(l(j,H,"_l"),l(D,W,"_b"),l(D,H,"_l"),l(D,K,"_o")),y(D[R],{getInt8:function(t){return d(this,1,t)[0]<<24>>24},getUint8:function(t){return d(this,1,t)[0]},getInt16:function(t){var e=d(this,2,t,arguments[1]);return(e[1]<<8|e[0])<<16>>16},getUint16:function(t){var e=d(this,2,t,arguments[1]);return e[1]<<8|e[0]},getInt32:function(t){return i(d(this,4,t,arguments[1]))},getUint32:function(t){return i(d(this,4,t,arguments[1]))>>>0},getFloat32:function(t){return r(d(this,4,t,arguments[1]),23,4)},getFloat64:function(t){return r(d(this,8,t,arguments[1]),52,8)},setInt8:function(t,e){f(this,1,t,o,e)},setUint8:function(t,e){f(this,1,t,o,e)},setInt16:function(t,e){f(this,2,t,s,e,arguments[2])},setUint16:function(t,e){f(this,2,t,s,e,arguments[2])},setInt32:function(t,e){f(this,4,t,p,e,arguments[2])},setUint32:function(t,e){f(this,4,t,p,e,arguments[2])},setFloat32:function(t,e){f(this,4,t,c,e,arguments[2])},setFloat64:function(t,e){f(this,8,t,u,e,arguments[2])}});A(j,O),A(D,T),b(D[R],v.VIEW,!0),n[O]=j,n[T]=D},{10:10,113:113,114:114,116:116,121:121,30:30,36:36,41:41,43:43,60:60,7:7,72:72,77:77,91:91,99:99}],121:[function(t,e,n){for(var a,r=t(41),i=t(43),o=t(122),s=o("typed_array"),p=o("view"),u=!(!r.ArrayBuffer||!r.DataView),c=u,l=0,d=9,f="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");d>l;)(a=r[f[l++]])?(i(a.prototype,s,!0),i(a.prototype,p,!0)):c=!1;e.exports={ABV:u,CONSTR:c,TYPED:s,VIEW:p}},{122:122,41:41,43:43}],122:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],123:[function(t,e,n){var a=t(41),r=a.navigator;e.exports=r&&r.userAgent||""},{41:41}],124:[function(t,e,n){var a=t(52);e.exports=function(t,e){if(!a(t)||t._t!==e)throw TypeError("Incompatible receiver, "+e+" required!");return t}},{52:52}],125:[function(t,e,n){var a=t(41),r=t(24),i=t(60),o=t(126),s=t(72).f;e.exports=function(t){var e=r.Symbol||(r.Symbol=i?{}:a.Symbol||{});"_"==t.charAt(0)||t in e||s(e,t,{value:o.f(t)})}},{126:126,24:24,41:41,60:60,72:72}],126:[function(t,e,n){n.f=t(127)},{127:127}],127:[function(t,e,n){var a=t(101)("wks"),r=t(122),i=t(41).Symbol,o="function"==typeof i,s=e.exports=function(t){return a[t]||(a[t]=o&&i[t]||(o?i:r)("Symbol."+t))};s.store=a},{101:101,122:122,41:41}],128:[function(t,e,n){var a=t(18),r=t(127)("iterator"),i=t(59);e.exports=t(24).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{127:127,18:18,24:24,59:59}],129:[function(t,e,n){var a=t(34),r=t(93)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{34:34,93:93}],130:[function(t,e,n){var a=t(34);a(a.P,"Array",{copyWithin:t(9)}),t(6)("copyWithin")},{34:34,6:6,9:9}],131:[function(t,e,n){"use strict";var a=t(34),r=t(13)(4);a(a.P+a.F*!t(103)([].every,!0),"Array",{every:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],132:[function(t,e,n){var a=t(34);a(a.P,"Array",{fill:t(10)}),t(6)("fill")},{10:10,34:34,6:6}],133:[function(t,e,n){"use strict";var a=t(34),r=t(13)(2);a(a.P+a.F*!t(103)([].filter,!0),"Array",{filter:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],134:[function(t,e,n){"use strict";var a=t(34),r=t(13)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(6)(i)},{13:13,34:34,6:6}],135:[function(t,e,n){"use strict";var a=t(34),r=t(13)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(6)(i)},{13:13,34:34,6:6}],136:[function(t,e,n){"use strict";var a=t(34),r=t(13)(0),i=t(103)([].forEach,!0);a(a.P+a.F*!i,"Array",{forEach:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],137:[function(t,e,n){"use strict";var a=t(26),r=t(34),i=t(117),o=t(54),s=t(49),p=t(116),u=t(25),c=t(128);r(r.S+r.F*!t(57)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,r,l,d=i(t),f="function"==typeof this?this:Array,h=arguments.length,m=h>1?arguments[1]:void 0,g=void 0!==m,v=0,b=c(d);if(g&&(m=a(m,h>2?arguments[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=p(d.length),n=new f(e);e>v;v++)u(n,v,g?m(d[v],v):d[v]);else for(l=b.call(d),n=new f;!(r=l.next()).done;v++)u(n,v,g?o(l,m,[r.value,v],!0):r.value);return n.length=v,n}})},{116:116,117:117,128:128,25:25,26:26,34:34,49:49,54:54,57:57}],138:[function(t,e,n){"use strict";var a=t(34),r=t(12)(!1),i=[].indexOf,o=!!i&&1/[1].indexOf(1,-0)<0;a(a.P+a.F*(o||!t(103)(i)),"Array",{indexOf:function(t){return o?i.apply(this,arguments)||0:r(this,t,arguments[1])}})},{103:103,12:12,34:34}],139:[function(t,e,n){var a=t(34);a(a.S,"Array",{isArray:t(50)})},{34:34,50:50}],140:[function(t,e,n){"use strict";var a=t(6),r=t(58),i=t(59),o=t(115);e.exports=t(56)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,r(1)):"keys"==e?r(0,n):"values"==e?r(0,t[n]):r(0,[n,t[n]])},"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},{115:115,56:56,58:58,59:59,6:6}],141:[function(t,e,n){"use strict";var a=t(34),r=t(115),i=[].join;a(a.P+a.F*(t(48)!=Object||!t(103)(i)),"Array",{join:function(t){return i.call(r(this),void 0===t?",":t)}})},{103:103,115:115,34:34,48:48}],142:[function(t,e,n){"use strict";var a=t(34),r=t(115),i=t(114),o=t(116),s=[].lastIndexOf,p=!!s&&1/[1].lastIndexOf(1,-0)<0;a(a.P+a.F*(p||!t(103)(s)),"Array",{lastIndexOf:function(t){if(p)return s.apply(this,arguments)||0;var e=r(this),n=o(e.length),a=n-1;for(arguments.length>1&&(a=Math.min(a,i(arguments[1]))),0>a&&(a=n+a);a>=0;a--)if(a in e&&e[a]===t)return a||0;return-1}})},{103:103,114:114,115:115,116:116,34:34}],143:[function(t,e,n){"use strict";var a=t(34),r=t(13)(1);a(a.P+a.F*!t(103)([].map,!0),"Array",{map:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],144:[function(t,e,n){"use strict";var a=t(34),r=t(25);a(a.S+a.F*t(36)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments.length,n=new("function"==typeof this?this:Array)(e);e>t;)r(n,t,arguments[t++]);return n.length=e,n}})},{25:25,34:34,36:36}],145:[function(t,e,n){"use strict";var a=t(34),r=t(14);a(a.P+a.F*!t(103)([].reduceRight,!0),"Array",{reduceRight:function(t){return r(this,t,arguments.length,arguments[1],!0)}})},{103:103,14:14,34:34}],146:[function(t,e,n){"use strict";var a=t(34),r=t(14);a(a.P+a.F*!t(103)([].reduce,!0),"Array",{reduce:function(t){return r(this,t,arguments.length,arguments[1],!1)}})},{103:103,14:14,34:34}],147:[function(t,e,n){"use strict";var a=t(34),r=t(44),i=t(19),o=t(112),s=t(116),p=[].slice;a(a.P+a.F*t(36)(function(){r&&p.call(r)}),"Array",{slice:function(t,e){var n=s(this.length),a=i(this);if(e=void 0===e?n:e,"Array"==a)return p.call(this,t,e);for(var r=o(t,n),u=o(e,n),c=s(u-r),l=Array(c),d=0;c>d;d++)l[d]="String"==a?this.charAt(r+d):this[r+d];return l}})},{112:112,116:116,19:19,34:34,36:36,44:44}],148:[function(t,e,n){"use strict";var a=t(34),r=t(13)(3);a(a.P+a.F*!t(103)([].some,!0),"Array",{some:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],149:[function(t,e,n){"use strict";var a=t(34),r=t(4),i=t(117),o=t(36),s=[].sort,p=[1,2,3];a(a.P+a.F*(o(function(){p.sort(void 0)})||!o(function(){p.sort(null)})||!t(103)(s)),"Array",{sort:function(t){return void 0===t?s.call(i(this)):s.call(i(this),r(t))}})},{103:103,117:117,34:34,36:36,4:4}],150:[function(t,e,n){t(98)("Array")},{98:98}],151:[function(t,e,n){var a=t(34);a(a.S,"Date",{now:function(){return(new Date).getTime()}})},{34:34}],152:[function(t,e,n){var a=t(34),r=t(27);a(a.P+a.F*(Date.prototype.toISOString!==r),"Date",{toISOString:r})},{27:27,34:34}],153:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(118);a(a.P+a.F*t(36)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function(t){var e=r(this),n=i(e);return"number"!=typeof n||isFinite(n)?e.toISOString():null}})},{117:117,118:118,34:34,36:36}],154:[function(t,e,n){var a=t(127)("toPrimitive"),r=Date.prototype;a in r||t(43)(r,a,t(28))},{127:127,28:28,43:43}],155:[function(t,e,n){var a=Date.prototype,r="Invalid Date",i="toString",o=a[i],s=a.getTime;new Date(NaN)+""!=r&&t(92)(a,i,function(){var t=s.call(this);return t===t?o.call(this):r})},{92:92}],156:[function(t,e,n){var a=t(34);a(a.P,"Function",{bind:t(17)})},{17:17,34:34}],157:[function(t,e,n){"use strict";var a=t(52),r=t(79),i=t(127)("hasInstance"),o=Function.prototype;i in o||t(72).f(o,i,{value:function(t){if("function"!=typeof this||!a(t))return!1;if(!a(this.prototype))return t instanceof this;for(;t=r(t);)if(this.prototype===t)return!0;return!1}})},{127:127,52:52,72:72,79:79}],158:[function(t,e,n){var a=t(72).f,r=Function.prototype,i=/^\s*function ([^ (]*)/,o="name";o in r||t(30)&&a(r,o,{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(t){return""}}})},{30:30,72:72}],159:[function(t,e,n){"use strict";var a=t(20),r=t(124),i="Map";e.exports=t(23)(i,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=a.getEntry(r(this,i),t);return e&&e.v},set:function(t,e){return a.def(r(this,i),0===t?0:t,e)}},a,!0)},{124:124,20:20,23:23}],160:[function(t,e,n){var a=t(34),r=t(63),i=Math.sqrt,o=Math.acosh;a(a.S+a.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))&&o(1/0)==1/0),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:r(t-1+i(t-1)*i(t+1))}})},{34:34,63:63}],161:[function(t,e,n){function a(t){return isFinite(t=+t)&&0!=t?0>t?-a(-t):Math.log(t+Math.sqrt(t*t+1)):t}var r=t(34),i=Math.asinh;r(r.S+r.F*!(i&&1/i(0)>0),"Math",{asinh:a})},{34:34}],162:[function(t,e,n){var a=t(34),r=Math.atanh;a(a.S+a.F*!(r&&1/r(-0)<0),"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{34:34}],163:[function(t,e,n){var a=t(34),r=t(65);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{34:34,65:65}],164:[function(t,e,n){var a=t(34);a(a.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{34:34}],165:[function(t,e,n){var a=t(34),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{34:34}],166:[function(t,e,n){var a=t(34),r=t(61);a(a.S+a.F*(r!=Math.expm1),"Math",{expm1:r})},{34:34,61:61}],167:[function(t,e,n){var a=t(34);a(a.S,"Math",{fround:t(62)})},{34:34,62:62}],168:[function(t,e,n){var a=t(34),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments.length,p=0;s>o;)n=r(arguments[o++]),n>p?(a=p/n,i=i*a*a+1,p=n):n>0?(a=n/p,i+=a*a):i+=n;return p===1/0?1/0:p*Math.sqrt(i)}})},{34:34}],169:[function(t,e,n){var a=t(34),r=Math.imul;a(a.S+a.F*t(36)(function(){return-5!=r(4294967295,5)||2!=r.length}),"Math",{imul:function(t,e){var n=65535,a=+t,r=+e,i=n&a,o=n&r;return 0|i*o+((n&a>>>16)*o+i*(n&r>>>16)<<16>>>0)}})},{34:34,36:36}],170:[function(t,e,n){var a=t(34);a(a.S,"Math",{log10:function(t){return Math.log(t)*Math.LOG10E}})},{34:34}],171:[function(t,e,n){var a=t(34);a(a.S,"Math",{log1p:t(63)})},{34:34,63:63}],172:[function(t,e,n){var a=t(34);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{34:34}],173:[function(t,e,n){var a=t(34);a(a.S,"Math",{sign:t(65)})},{34:34,65:65}],174:[function(t,e,n){var a=t(34),r=t(61),i=Math.exp;a(a.S+a.F*t(36)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(r(t)-r(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{34:34,36:36,61:61}],175:[function(t,e,n){var a=t(34),r=t(61),i=Math.exp;a(a.S,"Math",{tanh:function(t){var e=r(t=+t),n=r(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{34:34,61:61}],176:[function(t,e,n){var a=t(34);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{34:34}],177:[function(t,e,n){"use strict";var a=t(41),r=t(42),i=t(19),o=t(46),s=t(118),p=t(36),u=t(77).f,c=t(75).f,l=t(72).f,d=t(109).trim,f="Number",h=a[f],m=h,g=h.prototype,v=i(t(71)(g))==f,b="trim"in String.prototype,y=function(t){var e=s(t,!1);if("string"==typeof e&&e.length>2){e=b?e.trim():d(e,3);var n,a,r,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:a=2,r=49;break;case 79:case 111:a=8,r=55;break;default:return+e}for(var o,p=e.slice(2),u=0,c=p.length;c>u;u++)if(o=p.charCodeAt(u),48>o||o>r)return NaN;return parseInt(p,a)}}return+e};if(!h(" 0o1")||!h("0b1")||h("+0x1")){h=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof h&&(v?p(function(){g.valueOf.call(n)}):i(n)!=f)?o(new m(y(e)),n,h):y(e)};for(var _,x=t(30)?u(m):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),w=0;x.length>w;w++)r(m,_=x[w])&&!r(h,_)&&l(h,_,c(m,_));h.prototype=g,g.constructor=h,t(92)(a,f,h)}},{109:109,118:118,19:19,30:30,36:36,41:41,42:42,46:46,71:71,72:72,75:75,77:77,92:92}],178:[function(t,e,n){var a=t(34);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{34:34}],179:[function(t,e,n){var a=t(34),r=t(41).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{34:34,41:41}],180:[function(t,e,n){var a=t(34);a(a.S,"Number",{isInteger:t(51)})},{34:34,51:51}],181:[function(t,e,n){var a=t(34);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{34:34}],182:[function(t,e,n){var a=t(34),r=t(51),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{34:34,51:51}],183:[function(t,e,n){var a=t(34);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{34:34}],184:[function(t,e,n){var a=t(34);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{34:34}],185:[function(t,e,n){var a=t(34),r=t(86);a(a.S+a.F*(Number.parseFloat!=r),"Number",{parseFloat:r})},{34:34,86:86}],186:[function(t,e,n){var a=t(34),r=t(87);a(a.S+a.F*(Number.parseInt!=r),"Number",{parseInt:r})},{34:34,87:87}],187:[function(t,e,n){"use strict";var a=t(34),r=t(114),i=t(5),o=t(108),s=1..toFixed,p=Math.floor,u=[0,0,0,0,0,0],c="Number.toFixed: incorrect invocation!",l="0",d=function(t,e){for(var n=-1,a=e;++n<6;)a+=t*u[n],u[n]=a%1e7,a=p(a/1e7)},f=function(t){for(var e=6,n=0;--e>=0;)n+=u[e],u[e]=p(n/t),n=n%t*1e7},h=function(){for(var t=6,e="";--t>=0;)if(""!==e||0===t||0!==u[t]){var n=u[t]+"";e=""===e?n:e+o.call(l,7-n.length)+n}return e},m=function(t,e,n){return 0===e?n:e%2===1?m(t,e-1,n*t):m(t*t,e/2,n)},g=function(t){for(var e=0,n=t;n>=4096;)e+=12,n/=4096;for(;n>=2;)e+=1,n/=2;return e};a(a.P+a.F*(!!s&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==0xde0b6b3a7640080.toFixed(0))||!t(36)(function(){s.call({})})),"Number",{toFixed:function(t){var e,n,a,s,p=i(this,c),u=r(t),v="",b=l;if(0>u||u>20)throw RangeError(c);if(p!=p)return"NaN";if(-1e21>=p||p>=1e21)return p+"";if(0>p&&(v="-",p=-p),p>1e-21)if(e=g(p*m(2,69,1))-69,n=0>e?p*m(2,-e,1):p/m(2,e,1),n*=4503599627370496,e=52-e,e>0){for(d(0,n),a=u;a>=7;)d(1e7,0),a-=7;for(d(m(10,a,1),0),a=e-1;a>=23;)f(1<<23),a-=23;f(1<0?(s=b.length,b=v+(u>=s?"0."+o.call(l,u-s)+b:b.slice(0,s-u)+"."+b.slice(s-u))):b=v+b,b}})},{108:108,114:114,34:34,36:36,5:5}],188:[function(t,e,n){"use strict";var a=t(34),r=t(36),i=t(5),o=1..toPrecision;a(a.P+a.F*(r(function(){return"1"!==o.call(1,void 0)})||!r(function(){o.call({})})),"Number",{toPrecision:function(t){var e=i(this,"Number#toPrecision: incorrect invocation!");return void 0===t?o.call(e):o.call(e,t)}})},{34:34,36:36,5:5}],189:[function(t,e,n){var a=t(34);a(a.S+a.F,"Object",{assign:t(70)})},{34:34,70:70}],190:[function(t,e,n){var a=t(34);a(a.S,"Object",{create:t(71)})},{34:34,71:71}],191:[function(t,e,n){var a=t(34);a(a.S+a.F*!t(30),"Object",{defineProperties:t(73)})},{30:30,34:34,73:73}],192:[function(t,e,n){var a=t(34);a(a.S+a.F*!t(30),"Object",{defineProperty:t(72).f})},{30:30,34:34,72:72}],193:[function(t,e,n){var a=t(52),r=t(66).onFreeze;t(83)("freeze",function(t){return function(e){return t&&a(e)?t(r(e)):e}})},{52:52,66:66,83:83}],194:[function(t,e,n){var a=t(115),r=t(75).f;t(83)("getOwnPropertyDescriptor",function(){return function(t,e){return r(a(t),e)}})},{115:115,75:75,83:83}],195:[function(t,e,n){t(83)("getOwnPropertyNames",function(){return t(76).f})},{76:76,83:83}],196:[function(t,e,n){var a=t(117),r=t(79);t(83)("getPrototypeOf",function(){return function(t){return r(a(t))}})},{117:117,79:79,83:83}],197:[function(t,e,n){var a=t(52);t(83)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}}); -},{52:52,83:83}],198:[function(t,e,n){var a=t(52);t(83)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{52:52,83:83}],199:[function(t,e,n){var a=t(52);t(83)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{52:52,83:83}],200:[function(t,e,n){var a=t(34);a(a.S,"Object",{is:t(94)})},{34:34,94:94}],201:[function(t,e,n){var a=t(117),r=t(81);t(83)("keys",function(){return function(t){return r(a(t))}})},{117:117,81:81,83:83}],202:[function(t,e,n){var a=t(52),r=t(66).onFreeze;t(83)("preventExtensions",function(t){return function(e){return t&&a(e)?t(r(e)):e}})},{52:52,66:66,83:83}],203:[function(t,e,n){var a=t(52),r=t(66).onFreeze;t(83)("seal",function(t){return function(e){return t&&a(e)?t(r(e)):e}})},{52:52,66:66,83:83}],204:[function(t,e,n){var a=t(34);a(a.S,"Object",{setPrototypeOf:t(97).set})},{34:34,97:97}],205:[function(t,e,n){"use strict";var a=t(18),r={};r[t(127)("toStringTag")]="z",r+""!="[object z]"&&t(92)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{127:127,18:18,92:92}],206:[function(t,e,n){var a=t(34),r=t(86);a(a.G+a.F*(parseFloat!=r),{parseFloat:r})},{34:34,86:86}],207:[function(t,e,n){var a=t(34),r=t(87);a(a.G+a.F*(parseInt!=r),{parseInt:r})},{34:34,87:87}],208:[function(t,e,n){"use strict";var a,r,i,o,s=t(60),p=t(41),u=t(26),c=t(18),l=t(34),d=t(52),f=t(4),h=t(7),m=t(40),g=t(102),v=t(111).set,b=t(68)(),y=t(69),_=t(88),x=t(123),w=t(89),k="Promise",S=p.TypeError,E=p.process,C=E&&E.versions,P=C&&C.v8||"",A=p[k],O="process"==c(E),T=function(){},R=r=y.f,M=!!function(){try{var e=A.resolve(1),n=(e.constructor={})[t(127)("species")]=function(t){t(T,T)};return(O||"function"==typeof PromiseRejectionEvent)&&e.then(T)instanceof n&&0!==P.indexOf("6.6")&&-1===x.indexOf("Chrome/66")}catch(a){}}(),L=function(t){var e;return d(t)&&"function"==typeof(e=t.then)?e:!1},j=function(t,e){if(!t._n){t._n=!0;var n=t._c;b(function(){for(var a=t._v,r=1==t._s,i=0,o=function(e){var n,i,o,s=r?e.ok:e.fail,p=e.resolve,u=e.reject,c=e.domain;try{s?(r||(2==t._h&&F(t),t._h=1),s===!0?n=a:(c&&c.enter(),n=s(a),c&&(c.exit(),o=!0)),n===e.promise?u(S("Promise-chain cycle")):(i=L(n))?i.call(n,p,u):p(n)):u(a)}catch(l){c&&!o&&c.exit(),u(l)}};n.length>i;)o(n[i++]);t._c=[],t._n=!1,e&&!t._h&&D(t)})}},D=function(t){v.call(p,function(){var e,n,a,r=t._v,i=N(t);if(i&&(e=_(function(){O?E.emit("unhandledRejection",r,t):(n=p.onunhandledrejection)?n({promise:t,reason:r}):(a=p.console)&&a.error&&a.error("Unhandled promise rejection",r)}),t._h=O||N(t)?2:1),t._a=void 0,i&&e.e)throw e.v})},N=function(t){return 1!==t._h&&0===(t._a||t._c).length},F=function(t){v.call(p,function(){var e;O?E.emit("rejectionHandled",t):(e=p.onrejectionhandled)&&e({promise:t,reason:t._v})})},I=function(t){var e=this;e._d||(e._d=!0,e=e._w||e,e._v=t,e._s=2,e._a||(e._a=e._c.slice()),j(e,!0))},B=function(t){var e,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===t)throw S("Promise can't be resolved itself");(e=L(t))?b(function(){var a={_w:n,_d:!1};try{e.call(t,u(B,a,1),u(I,a,1))}catch(r){I.call(a,r)}}):(n._v=t,n._s=1,j(n,!1))}catch(a){I.call({_w:n,_d:!1},a)}}};M||(A=function(t){h(this,A,k,"_h"),f(t),a.call(this);try{t(u(B,this,1),u(I,this,1))}catch(e){I.call(this,e)}},a=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},a.prototype=t(91)(A.prototype,{then:function(t,e){var n=R(g(this,A));return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,n.domain=O?E.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&j(this,!1),n.promise},"catch":function(t){return this.then(void 0,t)}}),i=function(){var t=new a;this.promise=t,this.resolve=u(B,t,1),this.reject=u(I,t,1)},y.f=R=function(t){return t===A||t===o?new i(t):r(t)}),l(l.G+l.W+l.F*!M,{Promise:A}),t(99)(A,k),t(98)(k),o=t(24)[k],l(l.S+l.F*!M,k,{reject:function(t){var e=R(this),n=e.reject;return n(t),e.promise}}),l(l.S+l.F*(s||!M),k,{resolve:function(t){return w(s&&this===o?A:this,t)}}),l(l.S+l.F*!(M&&t(57)(function(t){A.all(t)["catch"](T)})),k,{all:function(t){var e=this,n=R(e),a=n.resolve,r=n.reject,i=_(function(){var n=[],i=0,o=1;m(t,!1,function(t){var s=i++,p=!1;n.push(void 0),o++,e.resolve(t).then(function(t){p||(p=!0,n[s]=t,--o||a(n))},r)}),--o||a(n)});return i.e&&r(i.v),n.promise},race:function(t){var e=this,n=R(e),a=n.reject,r=_(function(){m(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r.e&&a(r.v),n.promise}})},{102:102,111:111,123:123,127:127,18:18,24:24,26:26,34:34,4:4,40:40,41:41,52:52,57:57,60:60,68:68,69:69,7:7,88:88,89:89,91:91,98:98,99:99}],209:[function(t,e,n){var a=t(34),r=t(4),i=t(8),o=(t(41).Reflect||{}).apply,s=Function.apply;a(a.S+a.F*!t(36)(function(){o(function(){})}),"Reflect",{apply:function(t,e,n){var a=r(t),p=i(n);return o?o(a,e,p):s.call(a,e,p)}})},{34:34,36:36,4:4,41:41,8:8}],210:[function(t,e,n){var a=t(34),r=t(71),i=t(4),o=t(8),s=t(52),p=t(36),u=t(17),c=(t(41).Reflect||{}).construct,l=p(function(){function t(){}return!(c(function(){},[],t)instanceof t)}),d=!p(function(){c(function(){})});a(a.S+a.F*(l||d),"Reflect",{construct:function(t,e){i(t),o(e);var n=arguments.length<3?t:i(arguments[2]);if(d&&!l)return c(t,e,n);if(t==n){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var a=[null];return a.push.apply(a,e),new(u.apply(t,a))}var p=n.prototype,f=r(s(p)?p:Object.prototype),h=Function.apply.call(t,f,e);return s(h)?h:f}})},{17:17,34:34,36:36,4:4,41:41,52:52,71:71,8:8}],211:[function(t,e,n){var a=t(72),r=t(34),i=t(8),o=t(118);r(r.S+r.F*t(36)(function(){Reflect.defineProperty(a.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t),e=o(e,!0),i(n);try{return a.f(t,e,n),!0}catch(r){return!1}}})},{118:118,34:34,36:36,72:72,8:8}],212:[function(t,e,n){var a=t(34),r=t(75).f,i=t(8);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{34:34,75:75,8:8}],213:[function(t,e,n){"use strict";var a=t(34),r=t(8),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(55)(i,"Object",function(){var t,e=this,n=e._k;do if(e._i>=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),a(a.S,"Reflect",{enumerate:function(t){return new i(t)}})},{34:34,55:55,8:8}],214:[function(t,e,n){var a=t(75),r=t(34),i=t(8);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.f(i(t),e)}})},{34:34,75:75,8:8}],215:[function(t,e,n){var a=t(34),r=t(79),i=t(8);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{34:34,79:79,8:8}],216:[function(t,e,n){function a(t,e){var n,s,c=arguments.length<3?t:arguments[2];return u(t)===c?t[e]:(n=r.f(t,e))?o(n,"value")?n.value:void 0!==n.get?n.get.call(c):void 0:p(s=i(t))?a(s,e,c):void 0}var r=t(75),i=t(79),o=t(42),s=t(34),p=t(52),u=t(8);s(s.S,"Reflect",{get:a})},{34:34,42:42,52:52,75:75,79:79,8:8}],217:[function(t,e,n){var a=t(34);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{34:34}],218:[function(t,e,n){var a=t(34),r=t(8),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{34:34,8:8}],219:[function(t,e,n){var a=t(34);a(a.S,"Reflect",{ownKeys:t(85)})},{34:34,85:85}],220:[function(t,e,n){var a=t(34),r=t(8),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{34:34,8:8}],221:[function(t,e,n){var a=t(34),r=t(97);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{34:34,97:97}],222:[function(t,e,n){function a(t,e,n){var p,d,f=arguments.length<4?t:arguments[3],h=i.f(c(t),e);if(!h){if(l(d=o(t)))return a(d,e,n,f);h=u(0)}if(s(h,"value")){if(h.writable===!1||!l(f))return!1;if(p=i.f(f,e)){if(p.get||p.set||p.writable===!1)return!1;p.value=n,r.f(f,e,p)}else r.f(f,e,u(0,n));return!0}return void 0===h.set?!1:(h.set.call(f,n),!0)}var r=t(72),i=t(75),o=t(79),s=t(42),p=t(34),u=t(90),c=t(8),l=t(52);p(p.S,"Reflect",{set:a})},{34:34,42:42,52:52,72:72,75:75,79:79,8:8,90:90}],223:[function(t,e,n){var a=t(41),r=t(46),i=t(72).f,o=t(77).f,s=t(53),p=t(38),u=a.RegExp,c=u,l=u.prototype,d=/a/g,f=/a/g,h=new u(d)!==d;if(t(30)&&(!h||t(36)(function(){return f[t(127)("match")]=!1,u(d)!=d||u(f)==f||"/a/i"!=u(d,"i")}))){u=function(t,e){var n=this instanceof u,a=s(t),i=void 0===e;return!n&&a&&t.constructor===u&&i?t:r(h?new c(a&&!i?t.source:t,e):c((a=t instanceof u)?t.source:t,a&&i?p.call(t):e),n?this:l,u)};for(var m=(function(t){t in u||i(u,t,{configurable:!0,get:function(){return c[t]},set:function(e){c[t]=e}})}),g=o(c),v=0;g.length>v;)m(g[v++]);l.constructor=u,u.prototype=l,t(92)(a,"RegExp",u)}t(98)("RegExp")},{127:127,30:30,36:36,38:38,41:41,46:46,53:53,72:72,77:77,92:92,98:98}],224:[function(t,e,n){t(30)&&"g"!=/./g.flags&&t(72).f(RegExp.prototype,"flags",{configurable:!0,get:t(38)})},{30:30,38:38,72:72}],225:[function(t,e,n){t(37)("match",1,function(t,e,n){return[function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")},n]})},{37:37}],226:[function(t,e,n){t(37)("replace",2,function(t,e,n){return[function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)},n]})},{37:37}],227:[function(t,e,n){t(37)("search",1,function(t,e,n){return[function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")},n]})},{37:37}],228:[function(t,e,n){t(37)("split",2,function(e,n,a){"use strict";var r=t(53),i=a,o=[].push,s="split",p="length",u="lastIndex";if("c"=="abbc"[s](/(b)*/)[1]||4!="test"[s](/(?:)/,-1)[p]||2!="ab"[s](/(?:ab)*/)[p]||4!="."[s](/(.?)(.?)/)[p]||"."[s](/()()/)[p]>1||""[s](/.?/)[p]){var c=void 0===/()??/.exec("")[1];a=function(t,e){var n=this+"";if(void 0===t&&0===e)return[];if(!r(t))return i.call(n,t,e);var a,s,l,d,f,h=[],m=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),g=0,v=void 0===e?4294967295:e>>>0,b=RegExp(t.source,m+"g");for(c||(a=RegExp("^"+b.source+"$(?!\\s)",m));(s=b.exec(n))&&(l=s.index+s[0][p],!(l>g&&(h.push(n.slice(g,s.index)),!c&&s[p]>1&&s[0].replace(a,function(){for(f=1;f1&&s.index=v)));)b[u]===s.index&&b[u]++;return g===n[p]?(d||!b.test(""))&&h.push(""):h.push(n.slice(g)),h[p]>v?h.slice(0,v):h}}else"0"[s](void 0,0)[p]&&(a=function(t,e){return void 0===t&&0===e?[]:i.call(this,t,e)});return[function(t,r){var i=e(this),o=void 0==t?void 0:t[n];return void 0!==o?o.call(t,i,r):a.call(i+"",t,r)},a]})},{37:37,53:53}],229:[function(t,e,n){"use strict";t(224);var a=t(8),r=t(38),i=t(30),o="toString",s=/./[o],p=function(e){t(92)(RegExp.prototype,o,e,!0)};t(36)(function(){return"/a/b"!=s.call({source:"a",flags:"b"})})?p(function(){var t=a(this);return"/".concat(t.source,"/","flags"in t?t.flags:!i&&t instanceof RegExp?r.call(t):void 0)}):s.name!=o&&p(function(){return s.call(this)})},{224:224,30:30,36:36,38:38,8:8,92:92}],230:[function(t,e,n){"use strict";var a=t(20),r=t(124),i="Set";e.exports=t(23)(i,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(r(this,i),t=0===t?0:t,t)}},a)},{124:124,20:20,23:23}],231:[function(t,e,n){"use strict";t(106)("anchor",function(t){return function(e){return t(this,"a","name",e)}})},{106:106}],232:[function(t,e,n){"use strict";t(106)("big",function(t){return function(){return t(this,"big","","")}})},{106:106}],233:[function(t,e,n){"use strict";t(106)("blink",function(t){return function(){return t(this,"blink","","")}})},{106:106}],234:[function(t,e,n){"use strict";t(106)("bold",function(t){return function(){return t(this,"b","","")}})},{106:106}],235:[function(t,e,n){"use strict";var a=t(34),r=t(104)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{104:104,34:34}],236:[function(t,e,n){"use strict";var a=t(34),r=t(116),i=t(105),o="endsWith",s=""[o];a(a.P+a.F*t(35)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments.length>1?arguments[1]:void 0,a=r(e.length),p=void 0===n?a:Math.min(r(n),a),u=t+"";return s?s.call(e,u,p):e.slice(p-u.length,p)===u}})},{105:105,116:116,34:34,35:35}],237:[function(t,e,n){"use strict";t(106)("fixed",function(t){return function(){return t(this,"tt","","")}})},{106:106}],238:[function(t,e,n){"use strict";t(106)("fontcolor",function(t){return function(e){return t(this,"font","color",e)}})},{106:106}],239:[function(t,e,n){"use strict";t(106)("fontsize",function(t){return function(e){return t(this,"font","size",e)}})},{106:106}],240:[function(t,e,n){var a=t(34),r=t(112),i=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],a=arguments.length,o=0;a>o;){if(e=+arguments[o++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{112:112,34:34}],241:[function(t,e,n){"use strict";var a=t(34),r=t(105),i="includes";a(a.P+a.F*t(35)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{105:105,34:34,35:35}],242:[function(t,e,n){"use strict";t(106)("italics",function(t){return function(){return t(this,"i","","")}})},{106:106}],243:[function(t,e,n){"use strict";var a=t(104)(!0);t(56)(String,"String",function(t){this._t=t+"",this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=a(e,n),this._i+=t.length,{value:t,done:!1})})},{104:104,56:56}],244:[function(t,e,n){"use strict";t(106)("link",function(t){return function(e){return t(this,"a","href",e)}})},{106:106}],245:[function(t,e,n){var a=t(34),r=t(115),i=t(116);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments.length,o=[],s=0;n>s;)o.push(e[s++]+""),a>s&&o.push(arguments[s]+"");return o.join("")}})},{115:115,116:116,34:34}],246:[function(t,e,n){var a=t(34);a(a.P,"String",{repeat:t(108)})},{108:108,34:34}],247:[function(t,e,n){"use strict";t(106)("small",function(t){return function(){return t(this,"small","","")}})},{106:106}],248:[function(t,e,n){"use strict";var a=t(34),r=t(116),i=t(105),o="startsWith",s=""[o];a(a.P+a.F*t(35)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=r(Math.min(arguments.length>1?arguments[1]:void 0,e.length)),a=t+"";return s?s.call(e,a,n):e.slice(n,n+a.length)===a}})},{105:105,116:116,34:34,35:35}],249:[function(t,e,n){"use strict";t(106)("strike",function(t){return function(){return t(this,"strike","","")}})},{106:106}],250:[function(t,e,n){"use strict";t(106)("sub",function(t){return function(){return t(this,"sub","","")}})},{106:106}],251:[function(t,e,n){"use strict";t(106)("sup",function(t){return function(){return t(this,"sup","","")}})},{106:106}],252:[function(t,e,n){"use strict";t(109)("trim",function(t){return function(){return t(this,3)}})},{109:109}],253:[function(t,e,n){"use strict";var a=t(41),r=t(42),i=t(30),o=t(34),s=t(92),p=t(66).KEY,u=t(36),c=t(101),l=t(99),d=t(122),f=t(127),h=t(126),m=t(125),g=t(33),v=t(50),b=t(8),y=t(52),_=t(115),x=t(118),w=t(90),k=t(71),S=t(76),E=t(75),C=t(72),P=t(81),A=E.f,O=C.f,T=S.f,R=a.Symbol,M=a.JSON,L=M&&M.stringify,j="prototype",D=f("_hidden"),N=f("toPrimitive"),F={}.propertyIsEnumerable,I=c("symbol-registry"),B=c("symbols"),q=c("op-symbols"),U=Object[j],V="function"==typeof R,G=a.QObject,z=!G||!G[j]||!G[j].findChild,W=i&&u(function(){return 7!=k(O({},"a",{get:function(){return O(this,"a",{value:7}).a}})).a})?function(t,e,n){var a=A(U,e);a&&delete U[e],O(t,e,n),a&&t!==U&&O(U,e,a)}:O,H=function(t){var e=B[t]=k(R[j]);return e._k=t,e},K=V&&"symbol"==typeof R.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof R},Q=function(t,e,n){return t===U&&Q(q,e,n),b(t),e=x(e,!0),b(n),r(B,e)?(n.enumerable?(r(t,D)&&t[D][e]&&(t[D][e]=!1),n=k(n,{enumerable:w(0,!1)})):(r(t,D)||O(t,D,w(1,{})),t[D][e]=!0),W(t,e,n)):O(t,e,n)},Y=function(t,e){b(t);for(var n,a=g(e=_(e)),r=0,i=a.length;i>r;)Q(t,n=a[r++],e[n]);return t},$=function(t,e){return void 0===e?k(t):Y(k(t),e)},J=function(t){var e=F.call(this,t=x(t,!0));return this===U&&r(B,t)&&!r(q,t)?!1:e||!r(this,t)||!r(B,t)||r(this,D)&&this[D][t]?e:!0},X=function(t,e){if(t=_(t),e=x(e,!0),t!==U||!r(B,e)||r(q,e)){var n=A(t,e);return!n||!r(B,e)||r(t,D)&&t[D][e]||(n.enumerable=!0),n}},Z=function(t){for(var e,n=T(_(t)),a=[],i=0;n.length>i;)r(B,e=n[i++])||e==D||e==p||a.push(e);return a},tt=function(t){for(var e,n=t===U,a=T(n?q:_(t)),i=[],o=0;a.length>o;)r(B,e=a[o++])&&(n?r(U,e):!0)&&i.push(B[e]);return i};V||(R=function(){if(this instanceof R)throw TypeError("Symbol is not a constructor!");var t=d(arguments.length>0?arguments[0]:void 0),e=function(n){this===U&&e.call(q,n),r(this,D)&&r(this[D],t)&&(this[D][t]=!1),W(this,t,w(1,n))};return i&&z&&W(U,t,{configurable:!0,set:e}),H(t)},s(R[j],"toString",function(){return this._k}),E.f=X,C.f=Q,t(77).f=S.f=Z,t(82).f=J,t(78).f=tt,i&&!t(60)&&s(U,"propertyIsEnumerable",J,!0),h.f=function(t){return H(f(t))}),o(o.G+o.W+o.F*!V,{Symbol:R});for(var et="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),nt=0;et.length>nt;)f(et[nt++]);for(var at=P(f.store),rt=0;at.length>rt;)m(at[rt++]);o(o.S+o.F*!V,"Symbol",{"for":function(t){return r(I,t+="")?I[t]:I[t]=R(t)},keyFor:function(t){if(!K(t))throw TypeError(t+" is not a symbol!");for(var e in I)if(I[e]===t)return e},useSetter:function(){z=!0},useSimple:function(){z=!1}}),o(o.S+o.F*!V,"Object",{create:$,defineProperty:Q,defineProperties:Y,getOwnPropertyDescriptor:X,getOwnPropertyNames:Z,getOwnPropertySymbols:tt}),M&&o(o.S+o.F*(!V||u(function(){var t=R();return"[null]"!=L([t])||"{}"!=L({a:t})||"{}"!=L(Object(t))})),"JSON",{stringify:function(t){for(var e,n,a=[t],r=1;arguments.length>r;)a.push(arguments[r++]);return n=e=a[1],!y(e)&&void 0===t||K(t)?void 0:(v(e)||(e=function(t,e){return"function"==typeof n&&(e=n.call(this,t,e)),K(e)?void 0:e}),a[1]=e,L.apply(M,a))}}),R[j][N]||t(43)(R[j],N,R[j].valueOf),l(R,"Symbol"),l(Math,"Math",!0),l(a.JSON,"JSON",!0)},{101:101,115:115,118:118,122:122,125:125,126:126,127:127,30:30,33:33,34:34,36:36,41:41,42:42,43:43,50:50,52:52,60:60,66:66,71:71,72:72,75:75,76:76,77:77,78:78,8:8,81:81,82:82,90:90,92:92,99:99}],254:[function(t,e,n){"use strict";var a=t(34),r=t(121),i=t(120),o=t(8),s=t(112),p=t(116),u=t(52),c=t(41).ArrayBuffer,l=t(102),d=i.ArrayBuffer,f=i.DataView,h=r.ABV&&c.isView,m=d.prototype.slice,g=r.VIEW,v="ArrayBuffer";a(a.G+a.W+a.F*(c!==d),{ArrayBuffer:d}),a(a.S+a.F*!r.CONSTR,v,{isView:function(t){return h&&h(t)||u(t)&&g in t}}),a(a.P+a.U+a.F*t(36)(function(){return!new d(2).slice(1,void 0).byteLength}),v,{slice:function(t,e){if(void 0!==m&&void 0===e)return m.call(o(this),t);for(var n=o(this).byteLength,a=s(t,n),r=s(void 0===e?n:e,n),i=new(l(this,d))(p(r-a)),u=new f(this),c=new f(i),h=0;r>a;)c.setUint8(h++,u.getUint8(a++));return i}}),t(98)(v)},{102:102,112:112,116:116,120:120,121:121,34:34,36:36,41:41,52:52,8:8,98:98}],255:[function(t,e,n){var a=t(34);a(a.G+a.W+a.F*!t(121).ABV,{DataView:t(120).DataView})},{120:120,121:121,34:34}],256:[function(t,e,n){t(119)("Float32",4,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],257:[function(t,e,n){t(119)("Float64",8,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],258:[function(t,e,n){t(119)("Int16",2,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],259:[function(t,e,n){t(119)("Int32",4,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],260:[function(t,e,n){t(119)("Int8",1,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],261:[function(t,e,n){t(119)("Uint16",2,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],262:[function(t,e,n){t(119)("Uint32",4,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],263:[function(t,e,n){t(119)("Uint8",1,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],264:[function(t,e,n){t(119)("Uint8",1,function(t){return function(e,n,a){return t(this,e,n,a)}},!0)},{119:119}],265:[function(t,e,n){"use strict";var a,r=t(13)(0),i=t(92),o=t(66),s=t(70),p=t(22),u=t(52),c=t(36),l=t(124),d="WeakMap",f=o.getWeak,h=Object.isExtensible,m=p.ufstore,g={},v=function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},b={get:function(t){if(u(t)){var e=f(t);return e===!0?m(l(this,d)).get(t):e?e[this._i]:void 0}},set:function(t,e){return p.def(l(this,d),t,e)}},y=e.exports=t(23)(d,v,b,p,!0,!0);c(function(){return 7!=(new y).set((Object.freeze||Object)(g),7).get(g)})&&(a=p.getConstructor(v,d),s(a.prototype,b),o.NEED=!0,r(["delete","has","get","set"],function(t){var e=y.prototype,n=e[t];i(e,t,function(e,r){if(u(e)&&!h(e)){this._f||(this._f=new a);var i=this._f[t](e,r);return"set"==t?this:i}return n.call(this,e,r)})}))},{124:124,13:13,22:22,23:23,36:36,52:52,66:66,70:70,92:92}],266:[function(t,e,n){"use strict";var a=t(22),r=t(124),i="WeakSet";t(23)(i,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(r(this,i),t,!0)}},a,!1,!0)},{124:124,22:22,23:23}],267:[function(t,e,n){"use strict";var a=t(34),r=t(39),i=t(117),o=t(116),s=t(4),p=t(16);a(a.P,"Array",{flatMap:function(t){var e,n,a=i(this);return s(t),e=o(a.length),n=p(a,0),r(n,a,a,e,0,1,t,arguments[1]),n}}),t(6)("flatMap")},{116:116,117:117,16:16,34:34,39:39,4:4,6:6}],268:[function(t,e,n){"use strict";var a=t(34),r=t(39),i=t(117),o=t(116),s=t(114),p=t(16);a(a.P,"Array",{flatten:function(){var t=arguments[0],e=i(this),n=o(e.length),a=p(e,0);return r(a,e,e,n,0,void 0===t?1:s(t)),a}}),t(6)("flatten")},{114:114,116:116,117:117,16:16,34:34,39:39,6:6}],269:[function(t,e,n){"use strict";var a=t(34),r=t(12)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(6)("includes")},{12:12,34:34,6:6}],270:[function(t,e,n){var a=t(34),r=t(68)(),i=t(41).process,o="process"==t(19)(i);a(a.G,{asap:function(t){var e=o&&i.domain;r(e?e.bind(t):t)}})},{19:19,34:34,41:41,68:68}],271:[function(t,e,n){var a=t(34),r=t(19);a(a.S,"Error",{isError:function(t){return"Error"===r(t)}})},{19:19,34:34}],272:[function(t,e,n){var a=t(34);a(a.G,{global:t(41)})},{34:34,41:41}],273:[function(t,e,n){t(95)("Map")},{95:95}],274:[function(t,e,n){t(96)("Map")},{96:96}],275:[function(t,e,n){var a=t(34);a(a.P+a.R,"Map",{toJSON:t(21)("Map")})},{21:21,34:34}],276:[function(t,e,n){var a=t(34);a(a.S,"Math",{clamp:function(t,e,n){return Math.min(n,Math.max(e,t))}})},{34:34}],277:[function(t,e,n){var a=t(34);a(a.S,"Math",{DEG_PER_RAD:Math.PI/180})},{34:34}],278:[function(t,e,n){var a=t(34),r=180/Math.PI;a(a.S,"Math",{degrees:function(t){return t*r}})},{34:34}],279:[function(t,e,n){var a=t(34),r=t(64),i=t(62);a(a.S,"Math",{fscale:function(t,e,n,a,o){return i(r(t,e,n,a,o))}})},{34:34,62:62,64:64}],280:[function(t,e,n){var a=t(34);a(a.S,"Math",{iaddh:function(t,e,n,a){var r=t>>>0,i=e>>>0,o=n>>>0;return i+(a>>>0)+((r&o|(r|o)&~(r+o>>>0))>>>31)|0}})},{34:34}],281:[function(t,e,n){var a=t(34);a(a.S,"Math",{imulh:function(t,e){var n=65535,a=+t,r=+e,i=a&n,o=r&n,s=a>>16,p=r>>16,u=(s*o>>>0)+(i*o>>>16);return s*p+(u>>16)+((i*p>>>0)+(u&n)>>16)}})},{34:34}],282:[function(t,e,n){var a=t(34);a(a.S,"Math",{isubh:function(t,e,n,a){var r=t>>>0,i=e>>>0,o=n>>>0;return i-(a>>>0)-((~r&o|~(r^o)&r-o>>>0)>>>31)|0}})},{34:34}],283:[function(t,e,n){var a=t(34);a(a.S,"Math",{RAD_PER_DEG:180/Math.PI})},{34:34}],284:[function(t,e,n){var a=t(34),r=Math.PI/180;a(a.S,"Math",{radians:function(t){return t*r}})},{34:34}],285:[function(t,e,n){var a=t(34);a(a.S,"Math",{scale:t(64)})},{34:34,64:64}],286:[function(t,e,n){var a=t(34);a(a.S,"Math",{signbit:function(t){return(t=+t)!=t?t:0==t?1/t==1/0:t>0}})},{34:34}],287:[function(t,e,n){var a=t(34);a(a.S,"Math",{umulh:function(t,e){var n=65535,a=+t,r=+e,i=a&n,o=r&n,s=a>>>16,p=r>>>16,u=(s*o>>>0)+(i*o>>>16);return s*p+(u>>>16)+((i*p>>>0)+(u&n)>>>16)}})},{34:34}],288:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(4),o=t(72);t(30)&&a(a.P+t(74),"Object",{__defineGetter__:function(t,e){o.f(r(this),t,{get:i(e),enumerable:!0,configurable:!0})}})},{117:117,30:30,34:34,4:4,72:72,74:74}],289:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(4),o=t(72);t(30)&&a(a.P+t(74),"Object",{__defineSetter__:function(t,e){o.f(r(this),t,{set:i(e),enumerable:!0,configurable:!0})}})},{117:117,30:30,34:34,4:4,72:72,74:74}],290:[function(t,e,n){var a=t(34),r=t(84)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{34:34,84:84}],291:[function(t,e,n){var a=t(34),r=t(85),i=t(115),o=t(75),s=t(25);a(a.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,a=i(t),p=o.f,u=r(a),c={},l=0;u.length>l;)n=p(a,e=u[l++]),void 0!==n&&s(c,e,n);return c}})},{115:115,25:25,34:34,75:75,85:85}],292:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(118),o=t(79),s=t(75).f;t(30)&&a(a.P+t(74),"Object",{__lookupGetter__:function(t){var e,n=r(this),a=i(t,!0);do if(e=s(n,a))return e.get;while(n=o(n))}})},{117:117,118:118,30:30,34:34,74:74,75:75,79:79}],293:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(118),o=t(79),s=t(75).f;t(30)&&a(a.P+t(74),"Object",{__lookupSetter__:function(t){var e,n=r(this),a=i(t,!0);do if(e=s(n,a))return e.set;while(n=o(n))}})},{117:117,118:118,30:30,34:34,74:74,75:75,79:79}],294:[function(t,e,n){var a=t(34),r=t(84)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{34:34,84:84}],295:[function(t,e,n){"use strict";var a=t(34),r=t(41),i=t(24),o=t(68)(),s=t(127)("observable"),p=t(4),u=t(8),c=t(7),l=t(91),d=t(43),f=t(40),h=f.RETURN,m=function(t){return null==t?void 0:p(t)},g=function(t){var e=t._c;e&&(t._c=void 0,e())},v=function(t){return void 0===t._o},b=function(t){v(t)||(t._o=void 0,g(t))},y=function(t,e){u(t),this._c=void 0,this._o=t,t=new _(this);try{var n=e(t),a=n;null!=n&&("function"==typeof n.unsubscribe?n=function(){a.unsubscribe()}:p(n),this._c=n)}catch(r){return void t.error(r)}v(this)&&g(this)};y.prototype=l({},{unsubscribe:function(){b(this)}});var _=function(t){this._s=t};_.prototype=l({},{next:function(t){var e=this._s;if(!v(e)){var n=e._o;try{var a=m(n.next);if(a)return a.call(n,t)}catch(r){try{b(e)}finally{throw r}}}},error:function(t){var e=this._s;if(v(e))throw t;var n=e._o;e._o=void 0;try{var a=m(n.error);if(!a)throw t;t=a.call(n,t)}catch(r){try{g(e)}finally{throw r}}return g(e),t},complete:function(t){var e=this._s;if(!v(e)){var n=e._o;e._o=void 0;try{var a=m(n.complete);t=a?a.call(n,t):void 0}catch(r){try{g(e)}finally{throw r}}return g(e),t}}});var x=function(t){c(this,x,"Observable","_f")._f=p(t)};l(x.prototype,{subscribe:function(t){return new y(t,this._f)},forEach:function(t){var e=this;return new(i.Promise||r.Promise)(function(n,a){p(t);var r=e.subscribe({next:function(e){try{return t(e)}catch(n){a(n),r.unsubscribe()}},error:a,complete:n})})}}),l(x,{from:function(t){var e="function"==typeof this?this:x,n=m(u(t)[s]);if(n){var a=u(n.call(t));return a.constructor===e?a:new e(function(t){return a.subscribe(t)})}return new e(function(e){var n=!1;return o(function(){if(!n){try{if(f(t,!1,function(t){return e.next(t),n?h:void 0})===h)return}catch(a){if(n)throw a;return void e.error(a)}e.complete()}}),function(){n=!0}})},of:function(){for(var t=0,e=arguments.length,n=Array(e);e>t;)n[t]=arguments[t++];return new("function"==typeof this?this:x)(function(t){var e=!1;return o(function(){if(!e){for(var a=0;a1?arguments[1]:void 0,!1)}})},{107:107,123:123,34:34}],313:[function(t,e,n){"use strict";var a=t(34),r=t(107),i=t(123);a(a.P+a.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(i),"String",{padStart:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{107:107,123:123,34:34}],314:[function(t,e,n){"use strict";t(109)("trimLeft",function(t){return function(){return t(this,1)}},"trimStart")},{109:109}],315:[function(t,e,n){"use strict";t(109)("trimRight",function(t){return function(){return t(this,2)}},"trimEnd")},{109:109}],316:[function(t,e,n){t(125)("asyncIterator")},{125:125}],317:[function(t,e,n){t(125)("observable")},{125:125}],318:[function(t,e,n){var a=t(34);a(a.S,"System",{global:t(41) -})},{34:34,41:41}],319:[function(t,e,n){t(95)("WeakMap")},{95:95}],320:[function(t,e,n){t(96)("WeakMap")},{96:96}],321:[function(t,e,n){t(95)("WeakSet")},{95:95}],322:[function(t,e,n){t(96)("WeakSet")},{96:96}],323:[function(t,e,n){for(var a=t(140),r=t(81),i=t(92),o=t(41),s=t(43),p=t(59),u=t(127),c=u("iterator"),l=u("toStringTag"),d=p.Array,f={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},h=r(f),m=0;m2,r=a?o.call(arguments,2):!1;return t(a?function(){("function"==typeof e?e:Function(e)).apply(this,r)}:e,n)}};r(r.G+r.B+r.F*s,{setTimeout:p(a.setTimeout),setInterval:p(a.setInterval)})},{123:123,34:34,41:41}],326:[function(t,e,n){t(253),t(190),t(192),t(191),t(194),t(196),t(201),t(195),t(193),t(203),t(202),t(198),t(199),t(197),t(189),t(200),t(204),t(205),t(156),t(158),t(157),t(207),t(206),t(177),t(187),t(188),t(178),t(179),t(180),t(181),t(182),t(183),t(184),t(185),t(186),t(160),t(161),t(162),t(163),t(164),t(165),t(166),t(167),t(168),t(169),t(170),t(171),t(172),t(173),t(174),t(175),t(176),t(240),t(245),t(252),t(243),t(235),t(236),t(241),t(246),t(248),t(231),t(232),t(233),t(234),t(237),t(238),t(239),t(242),t(244),t(247),t(249),t(250),t(251),t(151),t(153),t(152),t(155),t(154),t(139),t(137),t(144),t(141),t(147),t(149),t(136),t(143),t(133),t(148),t(131),t(146),t(145),t(138),t(142),t(130),t(132),t(135),t(134),t(150),t(140),t(223),t(229),t(224),t(225),t(226),t(227),t(228),t(208),t(159),t(230),t(265),t(266),t(254),t(255),t(260),t(263),t(264),t(258),t(261),t(259),t(262),t(256),t(257),t(209),t(210),t(211),t(212),t(213),t(216),t(214),t(215),t(217),t(218),t(219),t(220),t(222),t(221),t(269),t(267),t(268),t(310),t(313),t(312),t(314),t(315),t(311),t(316),t(317),t(291),t(294),t(290),t(288),t(289),t(292),t(293),t(275),t(309),t(274),t(308),t(320),t(322),t(273),t(307),t(319),t(321),t(272),t(318),t(271),t(276),t(277),t(278),t(279),t(280),t(282),t(281),t(283),t(284),t(285),t(287),t(286),t(296),t(297),t(298),t(299),t(301),t(300),t(303),t(302),t(304),t(305),t(306),t(270),t(295),t(325),t(324),t(323),e.exports=t(24)},{130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,188:188,189:189,190:190,191:191,192:192,193:193,194:194,195:195,196:196,197:197,198:198,199:199,200:200,201:201,202:202,203:203,204:204,205:205,206:206,207:207,208:208,209:209,210:210,211:211,212:212,213:213,214:214,215:215,216:216,217:217,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231,232:232,233:233,234:234,235:235,236:236,237:237,238:238,239:239,24:24,240:240,241:241,242:242,243:243,244:244,245:245,246:246,247:247,248:248,249:249,250:250,251:251,252:252,253:253,254:254,255:255,256:256,257:257,258:258,259:259,260:260,261:261,262:262,263:263,264:264,265:265,266:266,267:267,268:268,269:269,270:270,271:271,272:272,273:273,274:274,275:275,276:276,277:277,278:278,279:279,280:280,281:281,282:282,283:283,284:284,285:285,286:286,287:287,288:288,289:289,290:290,291:291,292:292,293:293,294:294,295:295,296:296,297:297,298:298,299:299,300:300,301:301,302:302,303:303,304:304,305:305,306:306,307:307,308:308,309:309,310:310,311:311,312:312,313:313,314:314,315:315,316:316,317:317,318:318,319:319,320:320,321:321,322:322,323:323,324:324,325:325}],327:[function(t,e,n){!function(t){"use strict";function e(){return c.createDocumentFragment()}function n(t){return c.createElement(t)}function a(t){if(1===t.length)return r(t[0]);for(var n=e(),a=B.call(t),i=0;i-1}}([].indexOf||function(t){for(q=this.length;q--&&this[q]!==t;);return q}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=p?e(i):document.fonts.load(u(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(d,25)},function(){e(i)})};d()}else n(function(){function n(){var e;(e=-1!=g&&-1!=v||-1!=g&&-1!=b||-1!=v&&-1!=b)&&((e=g!=v&&g!=b&&v!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(g==y&&v==y&&b==y||g==_&&v==_&&b==_||g==x&&v==x&&b==x)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function d(){if((new Date).getTime()-c>=p)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(g=f.a.offsetWidth,v=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(d,50)}}var f=new a(s),h=new a(s),m=new a(s),g=-1,v=-1,b=-1,y=-1,_=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",r(f,u(i,"sans-serif")),r(h,u(i,"serif")),r(m,u(i,"monospace")),w.appendChild(f.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=f.a.offsetWidth,_=h.a.offsetWidth,x=m.a.offsetWidth,d(),o(f,function(t){g=t,n()}),r(f,u(i,'"'+i.family+'",sans-serif')),o(h,function(t){v=t,n()}),r(h,u(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,u(i,'"'+i.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=s.prototype.a,void 0!==e&&(e.exports=window.FontFaceObserver)}()},{}],330:[function(t,e,n){!function(t,n){function a(t,e){var n=t.createElement("p"),a=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function r(){var t=_.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=_.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),_.elements=n+" "+t,c(e)}function o(t){var e=y[t[v]];return e||(e={},b++,t[v]=b,y[b]=e),e}function s(t,e,a){if(e||(e=n),d)return e.createElement(t);a||(a=o(e));var r;return r=a.cache[t]?a.cache[t].cloneNode():g.test(t)?(a.cache[t]=a.createElem(t)).cloneNode():a.createElem(t),!r.canHaveChildren||m.test(t)||r.tagUrn?r:a.frag.appendChild(r)}function p(t,e){if(t||(t=n),d)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),p=s.length;p>i;i++)a.createElement(s[i]);return a}function u(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return _.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(_,e.frag)}function c(t){t||(t=n);var e=o(t);return!_.shivCSS||l||e.hasCSS||(e.hasCSS=!!a(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),d||u(t,e),t}var l,d,f="3.7.3-pre",h=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,g=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="hidden"in t,d=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){l=!0,d=!0}}();var _={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:f,shivCSS:h.shivCSS!==!1,supportsUnknownElements:d,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:c,createElement:s,createDocumentFragment:p,addElements:i};t.html5=_,c(n),"object"==typeof e&&e.exports&&(e.exports=_)}("undefined"!=typeof window?window:this,document)},{}],331:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,a){for(var i,o,s=n.slice(),p=r(e,t),u=0,c=s.length;c>u&&(i=s[u],"object"==typeof i?"function"==typeof i.handleEvent&&i.handleEvent(p):i.call(t,p),!p.stoppedImmediatePropagation);u++);return o=!p.stoppedPropagation,a&&o&&t.parentNode?t.parentNode.dispatchEvent(p):!p.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function a(t,e,a){var r=y(e||t,a);v(t,"textContent",n(function(){return r.get.call(this)},function(t){r.set.call(this,t)}))}function r(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function p(t){!f&&S.test(document.readyState)&&(f=!f,document.detachEvent(h,p),t=document.createEvent("Event"),t.initEvent(m,!0,!0),document.dispatchEvent(t))}function u(t){return function(){return P[t]||document.body&&document.body[t]||0}}function c(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function l(e,n){return n||(n=t.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var d=!0,f=!1,h="onreadystatechange",m="DOMContentLoaded",g="__IE8__"+Math.random(),v=Object.defineProperty||function(t,e,n){t[e]=n.value},b=Object.defineProperties||function(e,n){for(var a in n)if(_.call(n,a))try{v(e,a,n[a])}catch(r){t.console&&console.log(a+" failed on object:",e,r.message)}},y=Object.getOwnPropertyDescriptor,_=Object.prototype.hasOwnProperty,x=t.Element.prototype,w=t.Text.prototype,k=/^[a-z]+$/,S=/loaded|complete/,E={},C=document.createElement("div"),P=document.documentElement,A=P.removeAttribute,O=P.setAttribute,T=function(t){return{enumerable:!0,writable:!0,configurable:!0,value:t}};a(t.HTMLCommentElement.prototype,x,"nodeValue"),a(t.HTMLScriptElement.prototype,null,"text"),a(w,null,"nodeValue"),a(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(y(t.CSSStyleSheet.prototype,"cssText")));var R=/\b\s*alpha\s*\(\s*opacity\s*=\s*(\d+)\s*\)/;v(t.CSSStyleDeclaration.prototype,"opacity",{get:function(){var t=this.filter.match(R);return t?""+t[1]/100:""},set:function(t){this.zoom=1;var e=!1;t=1>t?" alpha(opacity="+Math.round(100*t)+")":"",this.filter=this.filter.replace(R,function(){return e=!0,t}),!e&&t&&(this.filter+=t)}}),b(x,{textContent:{get:o,set:c},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:T(function(t,n,a){if("function"==typeof n||"object"==typeof n){var r,o,p=this,u="on"+t,c=p[g]||v(p,g,{value:{}})[g],d=c[u]||(c[u]={}),f=d.h||(d.h=[]);if(!_.call(d,"w")){if(d.w=function(t){return t[g]||e(p,l(p,t),f,!1)},!_.call(E,u))if(k.test(t)){try{r=document.createEventObject(),r[g]=!0,9!=p.nodeType&&(null==p.parentNode&&C.appendChild(p),(o=p.getAttribute(u))&&A.call(p,u)),p.fireEvent(u,r),E[u]=!0}catch(h){for(E[u]=!1;C.hasChildNodes();)C.removeChild(C.firstChild)}null!=o&&O.call(p,u,o)}else E[u]=!1;(d.n=E[u])&&p.attachEvent(u,d.w)}i(f,n)<0&&f[a?"unshift":"push"](n),"input"===t&&p.attachEvent("onkeyup",s)}}),dispatchEvent:T(function(t){var n,a=this,r="on"+t.type,i=a[g],o=i&&i[r],s=!!o;return t.target||(t.target=a),s?o.n?a.fireEvent(r,t):e(a,t,o.h,!0):(n=a.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}),removeEventListener:T(function(t,e,n){if("function"==typeof e||"object"==typeof e){var a=this,r="on"+t,o=a[g],s=o&&o[r],p=s&&s.h,u=p?i(p,e):-1;u>-1&&p.splice(u,1)}})}),b(w,{addEventListener:T(x.addEventListener),dispatchEvent:T(x.dispatchEvent),removeEventListener:T(x.removeEventListener)}),b(t.XMLHttpRequest.prototype,{addEventListener:T(function(t,e,n){var a=this,r="on"+t,o=a[g]||v(a,g,{value:{}})[g],s=o[r]||(o[r]={}),p=s.h||(s.h=[]);i(p,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),p[n?"unshift":"push"](e))}),dispatchEvent:T(function(t){var n=this,a="on"+t.type,r=n[g],i=r&&r[a],o=!!i;return o&&(i.n?n.fireEvent(a,t):e(n,t,i.h,!0))}),removeEventListener:T(x.removeEventListener)});var M=y(Event.prototype,"button").get;b(t.Event.prototype,{bubbles:T(!0),cancelable:T(!0),preventDefault:T(function(){this.cancelable&&(this.returnValue=!1)}),stopPropagation:T(function(){this.stoppedPropagation=!0,this.cancelBubble=!0}),stopImmediatePropagation:T(function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}),initEvent:T(function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}),pageX:{get:function(){return this._pageX||(this._pageX=this.clientX+t.scrollX-(P.clientLeft||0))}},pageY:{get:function(){return this._pageY||(this._pageY=this.clientY+t.scrollY-(P.clientTop||0))}},which:{get:function(){return this.keyCode?this.keyCode:isNaN(this.button)?void 0:this.button+1}},charCode:{get:function(){return this.keyCode&&"keypress"==this.type?this.keyCode:0}},buttons:{get:function(){return M.call(this)}},button:{get:function(){var t=this.buttons;return 1&t?0:2&t?2:4&t?1:void 0}},defaultPrevented:{get:function(){var t,e=this.returnValue;return!(e===t||e)}},relatedTarget:{get:function(){var t=this.type;return"mouseover"===t?this.fromElement:"mouseout"===t?this.toElement:null}}}),b(t.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&c.call(this,t)}},addEventListener:T(function(e,n,a){var r=this;x.addEventListener.call(r,e,n,a),d&&e===m&&!S.test(r.readyState)&&(d=!1,r.attachEvent(h,p),t==top&&!function i(t){try{r.documentElement.doScroll("left"),p()}catch(e){setTimeout(i,50)}}())}),dispatchEvent:T(x.dispatchEvent),removeEventListener:T(x.removeEventListener),createEvent:T(function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e})}),b(t.Window.prototype,{getComputedStyle:T(function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,a=/^(top|right|bottom|left)$/,r=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,p=this._,u=p.style,c=p.currentStyle,l=p.runtimeStyle;return"opacity"==t?u.opacity||"1":(t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:u[t],n.test(e)&&!a.test(t)&&(o=u.left,s=l&&l.left,s&&(l.left=c.left),u.left="fontSize"===t?"1em":e,e=u.pixelLeft+"px",u.left=o,s&&(l.left=s)),null==e?e:e+""||"auto")},e.prototype.getPropertyValue=function(){return null},function(n,a){return a?new e(n):new t(n)}}()),addEventListener:T(function(n,a,r){var o,s=t,p="on"+n;s[p]||(s[p]=function(t){return e(s,l(s,t),o,!1)&&void 0}),o=s[p][g]||(s[p][g]=[]),i(o,a)<0&&o[r?"unshift":"push"](a)}),dispatchEvent:T(function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}),removeEventListener:T(function(e,n,a){var r="on"+e,o=(t[r]||Object)[g],s=o?i(o,n):-1;s>-1&&o.splice(s,1)}),pageXOffset:{get:u("scrollLeft")},pageYOffset:{get:u("scrollTop")},scrollX:{get:u("scrollLeft")},scrollY:{get:u("scrollTop")},innerWidth:{get:u("clientWidth")},innerHeight:{get:u("clientHeight")}}),t.HTMLElement=t.Element,function(t,e,n){for(n=0;na;a++)e.appendChild(n[a].cloneNode(!0));return e},n.cloneRange=function(){var t=new e;return t._start=this._start,t._end=this._end,t},n.deleteContents=function(){for(var e=this._start.parentNode,n=t(this._start,this._end),a=0,r=n.length;r>a;a++)e.removeChild(n[a])},n.extractContents=function(){for(var e=this._start.ownerDocument.createDocumentFragment(),n=t(this._start,this._end),a=0,r=n.length;r>a;a++)e.appendChild(n[a]);return e},n.setEndAfter=function(t){this._end=t},n.setEndBefore=function(t){this._end=t.previousSibling},n.setStartAfter=function(t){this._start=t.nextSibling},n.setStartBefore=function(t){this._start=t}}}()}}(this.window||t)}).call(this,void 0!==t?t:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],332:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e=s)return(0,p["default"])({points:n});for(var l=1;s-1>=l;l++)i.push((0,u.times)(a,(0,u.minus)(n[l],n[l-1])));for(var d=[(0,u.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)d.push((0,u.minus)(n[l],(0,u.average)([i[l],i[l-1]])));d.push((0,u.minus)(n[s-1],c(i[s-2],i[s-3])));var f=d[0],h=d[1],m=n[0],g=n[1],v=(e=(0,o["default"])()).moveto.apply(e,r(m)).curveto(f[0],f[1],h[0],h[1],g[0],g[1]);return{path:(0,u.range)(2,s).reduce(function(t,e){var a=d[e],r=n[e];return t.smoothcurveto(a[0],a[1],r[0],r[1])},v),centroid:(0,u.average)(n)}},e.exports=n["default"]},{335:335,336:336,337:337}],333:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(334),o=a(i),s=t(335),p=1e-5,u=function(t,e){var n=t.map(e),a=n.sort(function(t,e){var n=r(t,2),a=n[0],i=(n[1],r(e,2)),o=i[0];i[1];return a-o}),i=a.length,o=a[0][0],u=a[i-1][0],c=(0,s.minBy)(a,function(t){return t[1]}),l=(0,s.maxBy)(a,function(t){return t[1]});return o==u&&(u+=p),c==l&&(l+=p),{points:a,xmin:o,xmax:u,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,p=t.height,c=t.closed,l=t.min,d=t.max;n||(n=function(t){var e=r(t,2),n=e[0];e[1];return n}),a||(a=function(t){var e=r(t,2),n=(e[0],e[1]);return n});var f=function(t){return[n(t),a(t)]},h=e.map(function(t){return u(t,f)}),m=(0,s.minBy)(h,function(t){return t.xmin}),g=(0,s.maxBy)(h,function(t){return t.xmax}),v=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==d?(0,s.maxBy)(h,function(t){return t.ymax}):d;c&&(v=Math.min(v,0),b=Math.max(b,0));var y=c?0:v,_=(0,o["default"])([m,g],[0,i]),x=(0,o["default"])([v,b],[p,0]),w=function(t){var e=r(t,2),n=e[0],a=e[1];return[_(n),x(a)]};return{arranged:h,scale:w,xscale:_,yscale:x,base:y}},e.exports=n["default"]},{334:334,335:335}],334:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t,e){var n=a(t,2),r=n[0],o=n[1],s=a(e,2),p=s[0],u=s[1],c=function(t){return p+(u-p)*(t-r)/(o-r)};return c.inverse=function(){return i([p,u],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],335:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(t){return t.reduce(function(t,e){return t+e},0)},i=function(t){return t.reduce(function(t,e){return Math.min(t,e)})},o=function(t){return t.reduce(function(t,e){return Math.max(t,e)})},s=function(t,e){return t.reduce(function(t,n){return t+e(n)},0)},p=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},u=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},c=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],p=o[1];return[r+s,i+p]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],p=o[1];return[r-s,i-p]},d=function(t,e){var n=a(e,2),r=n[0],i=n[1];return[t*r,t*i]},f=function(t){var e=a(t,2),n=e[0],r=e[1];return Math.sqrt(n*n+r*r)},h=function(t){return t.reduce(c,[0,0])},m=function(t){return d(1/t.length,t.reduce(c))},g=function(t,e){return d(t,[Math.sin(e),-Math.cos(e)])},v=function(t,e){var n=t||{};for(var a in n){var r=n[a];e[a]=r(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var a=[],r=t;e>r;r++)a.push(r);return n&&a.push(e),a},y=function(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var p=o.value,u=t[p];n.push(e(p,u))}}catch(c){r=!0,i=c}finally{ -try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n},_=function(t){return y(t,function(t,e){return[t,e]})},x=function(t){return t};n.sum=r,n.min=i,n.max=o,n.sumBy=s,n.minBy=p,n.maxBy=u,n.plus=c,n.minus=l,n.times=d,n.id=x,n.length=f,n.sumVectors=h,n.average=m,n.onCircle=g,n.enhance=v,n.range=b,n.mapObject=y,n.pairs=_,n["default"]={sum:r,min:i,max:o,sumBy:s,minBy:p,maxBy:u,plus:c,minus:l,times:d,id:x,length:f,sumVectors:h,average:m,onCircle:g,enhance:v,range:b,mapObject:y,pairs:_}},{}],336:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},r=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],p=o[1];return r===s&&i===p},o=function(t,e){for(var n=t.length;"0"===t.charAt(n-1);)n-=1;return"."===t.charAt(n-1)&&(n-=1),t.substr(0,n)},s=function(t,e){var n=t.toFixed(e);return o(n)},p=function(t){var e=t.command,n=t.params,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},u=function(t,e){var n=t.command,r=t.params,i=a(e,2),o=i[0],s=i[1];switch(n){case"M":return[r[0],r[1]];case"L":return[r[0],r[1]];case"H":return[r[0],s];case"V":return[o,r[0]];case"Z":return null;case"C":return[r[4],r[5]];case"S":return[r[2],r[3]];case"Q":return[r[2],r[3]];case"T":return[r[0],r[1]];case"A":return[r[5],r[6]]}},c=function(t,e){return function(n){var a="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,a)}},l=function(t){return i(n(e,t))};return{moveto:c(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:c(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:c(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:c(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:c(["x1","y1","x2","y2","x","y"],function(t,e,n,a,r,i){return l({command:"C",params:[t,e,n,a,r,i]})}),smoothcurveto:c(["x2","y2","x","y"],function(t,e,n,a){return l({command:"S",params:[t,e,n,a]})}),qcurveto:c(["x1","y1","x","y"],function(t,e,n,a){return l({command:"Q",params:[t,e,n,a]})}),smoothqcurveto:c(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:c(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,a,r,i,o){return l({command:"A",params:[t,e,n,a,r,i,o]})}),print:function(){return e.map(p).join(" ")},points:function(){var t=[],n=[0,0],a=!0,r=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var p=o.value,c=u(p,n);n=c,c&&t.push(c)}}catch(l){r=!0,i=l}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],a=t.points()[0],o=t.instructions().slice(1);return r(n,a)||o.unshift({command:"L",params:a}),i(this.instructions().concat(o))}}};n["default"]=function(){return r()},e.exports=n["default"]},{}],337:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];for(var r,i;i=n.shift();)for(r in i)Mo.call(i,r)&&(t[r]=i[r]);return t}function r(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===Lo.call(t)}function o(t){return jo.test(Lo.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function p(t){return!isNaN(parseFloat(t))&&isFinite(t)}function u(t){return t&&"[object Object]"===Lo.call(t)}function c(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];throw t=c(t,n),Error(t)}function d(){Mg.DEBUG&&Oo.apply(null,arguments)}function f(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),Do[t]||(Do[t]=!0,To(t,n))}function m(){Mg.DEBUG&&f.apply(null,arguments)}function g(){Mg.DEBUG&&h.apply(null,arguments)}function v(t,e,n){var a=b(t,e,n);return a?a[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function _(t){var e,n,a,r,i,o;for(e=t.split("."),(n=zo[e.length])||(n=x(e.length)),i=[],a=function(t,n){return t?"*":e[n]},r=n.length;r--;)o=n[r].map(a).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function x(t){var e,n,a,r,i,o,s,p,u="";if(!zo[t]){for(a=[];u.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)p.push(r(n[o]));a[i]=p}zo[t]=a}return zo[t]}function w(t,e,n,a){var r=t[e];if(!r||!r.equalsOrStartsWith(a)&&r.equalsOrStartsWith(n))return t[e]=r?r.replace(n,a):a,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&p(e)?+e:e}function S(t){return null==t?t:(Ko.hasOwnProperty(t)||(Ko[t]=new Qo(t)),Ko[t])}function E(t,e){function n(e,n){var a,r,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(a=t.viewmodel.wrapped[n.str],r=a?a.get():t.viewmodel.get(n),o=r?Object.keys(r):null),o&&o.forEach(function(t){"_ractive"===t&&i(r)||e.push(n.join(t))}),e}var a,r,o;for(a=e.str.split("."),o=[$o];r=a.shift();)"*"===r?o=o.reduce(n,[]):o[0]===$o?o[0]=S(r):o=o.map(C(r));return o}function C(t){return function(e){return e.join(t)}}function P(t){return t?t.replace(Wo,".$1"):""}function A(t,e,n){if("string"!=typeof e||!p(n))throw Error("Bad arguments");var a=void 0,r=void 0;if(/\*/.test(e))return r={},E(t,S(P(e))).forEach(function(e){var a=t.viewmodel.get(e);if(!p(a))throw Error(Xo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!p(a))throw Error(Xo);return t.set(e,+a+n)}function O(t,e){return Jo(this,t,void 0===e?1:+e)}function T(t){this.event=t,this.method="on"+t,this.deprecate=as[t]}function R(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function M(t,e){for(var n=0,a=t.length;a>n;n++)if(t[n]==e)return!0;return!1}function L(t,e){var n;if(!i(t)||!i(e))return!1;if(t.length!==e.length)return!1;for(n=t.length;n--;)if(t[n]!==e[n])return!1;return!0}function j(t){return"string"==typeof t?[t]:void 0===t?[]:t}function D(t){return t[t.length-1]}function N(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function F(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0)}function B(t,e){return function(){for(var n;n=t.shift();)n(e)}}function q(t,e,n,a){var r;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof rs)e.then(n,a);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{r=e.then}catch(i){return void a(i)}if("function"==typeof r){var o,s,p;s=function(e){o||(o=!0,q(t,e,n,a))},p=function(t){o||(o=!0,a(t))};try{r.call(e,s,p)}catch(i){if(!o)return a(i),void(o=!0)}}else n(e)}}function U(t,e,n){var a;return e=P(e),"~/"===e.substr(0,2)?(a=S(e.substring(2)),z(t,a.firstKey,n)):"."===e[0]?(a=V(cs(n),e),a&&z(t,a.firstKey,n)):a=G(t,S(e),n),a}function V(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return S(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),S(n.join("."))}return S(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function G(t,e,n,a){var r,i,o,s,p;if(e.isRoot)return e;for(i=e.firstKey;n;)if(r=n.context,n=n.parent,r&&(s=!0,o=t.viewmodel.get(r),o&&("object"==typeof o||"function"==typeof o)&&i in o))return r.join(e.str);return W(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=S(i),p=G(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:p}),e):a||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=S(e),(n=G(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function H(t){t.teardown()}function K(t){t.unbind()}function Q(t){t.unrender()}function Y(t){t.cancel()}function $(t){t.detach()}function J(t){t.detachNodes()}function X(t){!t.ready||t.outros.length||t.outroChildren||(t.outrosComplete||(t.parent?t.parent.decrementOutros(t):t.detachNodes(),t.outrosComplete=!0),t.intros.length||t.totalChildren||("function"==typeof t.callback&&t.callback(),t.parent&&t.parent.decrementTotal()))}function Z(){for(var t,e,n;fs.ractives.length;)e=fs.ractives.pop(),n=e.viewmodel.applyChanges(),n&&vs.fire(e,n);for(tt(),t=0;t=0;i--)r=t._subs[e[i]],r&&(s=vt(t,r,n,a)&&s);if(Gs.dequeue(t),t.parent&&s){if(o&&t.component){var p=t.component.name+"."+e[e.length-1];e=S(p).wildcardMatches(),n&&(n.component=t)}gt(t.parent,e,n,a)}}function vt(t,e,n,a){var r=null,i=!1;n&&!n._noArg&&(a=[n].concat(a)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,a)===!1&&(i=!0);return n&&!n._noArg&&i&&(r=n.original)&&(r.preventDefault&&r.preventDefault(),r.stopPropagation&&r.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function yt(t){var e;return t=S(P(t)),e=this.viewmodel.get(t,Ks),void 0===e&&this.parent&&!this.isolated&&ls(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function _t(e,n){if(!this.fragment.rendered)throw Error("The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.");if(e=t(e),n=t(n)||null,!e)throw Error("You must specify a valid target to insert into");e.insertBefore(this.detach(),n),this.el=e,(e.__ractive_instances__||(e.__ractive_instances__=[])).push(this),this.detached=null,xt(this)}function xt(t){Ys.fire(t),t.findAllComponents("*").forEach(function(t){xt(t.instance)})}function wt(t,e,n){var a,r;return t=S(P(t)),a=this.viewmodel.get(t),i(a)&&i(e)?(r=bs.start(this,!0),this.viewmodel.merge(t,a,e,n),bs.end(),r):this.set(t,e,n&&n.complete)}function kt(t,e){var n,a;return n=E(t,e),a={},n.forEach(function(e){a[e.str]=t.get(e.str)}),a}function St(t,e,n,a){var r,i,o;e=S(P(e)),a=a||cp,e.isPattern?(r=new pp(t,e,n,a),t.viewmodel.patternObservers.push(r),i=!0):r=new Zs(t,e,n,a),r.init(a.init),t.viewmodel.register(e,r,i?"patternObservers":"observers"),r.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(r),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,r,"patternObservers")):t.viewmodel.unregister(e,r,"observers"),o=!0)}};return t._observers.push(s),s}function Et(t,e,n){var a,r,i,o;if(u(t)){n=e,r=t,a=[];for(t in r)r.hasOwnProperty(t)&&(e=r[t],a.push(this.observe(t,e,n)));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",up(this,t,e,n);if(i=t.split(" "),1===i.length)return up(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(up(this,t,e,n));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}function Ct(t,e,n){var a=this.observe(t,function(){e.apply(this,arguments),a.cancel()},{init:!1,defer:n&&n.defer});return a}function Pt(t,e){var n,a=this;if(t)n=t.split(" ").map(fp).filter(hp),n.forEach(function(t){var n,r;(n=a._subs[t])&&(e?(r=n.indexOf(e),-1!==r&&n.splice(r,1)):a._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,a,r,i=this;if("object"==typeof t){n=[];for(a in t)t.hasOwnProperty(a)&&n.push(this.on(a,t[a]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return r=t.split(" ").map(fp).filter(hp),r.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function Ot(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var a,r,i,o,s,p,u=[];if(a=Rt(t,e,n),!a)return null;for(r=t.length,s=a.length-2-a[1],i=Math.min(r,a[0]),o=i+a[1],p=0;i>p;p+=1)u.push(p);for(;o>p;p+=1)u.push(-1);for(;r>p;p+=1)u.push(p+s);return 0!==s?u.touchedFrom=a[0]:u.touchedFrom=t.length,u}function Rt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function Mt(e,n){var a,r,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),a=bs.start(this,!0),bs.scheduleTask(function(){return Rp.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&Lt(s),e.innerHTML=""}return this.cssId&&Op.apply(),e&&((r=e.__ractive_instances__)?r.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,a.then(function(){return Mp.fire(o)})}function Lt(t){t.splice(0,t.length).forEach(H)}function jt(t,e){for(var n=t.slice(),a=e.length;a--;)~n.indexOf(e[a])||n.push(e[a]);return n}function Dt(t,e){var n,a,r;return a='[data-ractive-css~="{'+e+'}"]',r=function(t){var e,n,r,i,o,s,p,u=[];for(e=[];n=Ip.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Ft),p=e.length;p--;)s=i.slice(),r=e[p],s[p]=r.base+a+r.modifiers||"",o=i.slice(),o[p]=a+" "+o[p],u.push(s.join(" "),o.join(" "));return u.join(", ")},n=qp.test(t)?t.replace(qp,a):t.replace(Fp,"").replace(Np,function(t,e){var n,a;return Bp.test(e)?t:(n=e.split(",").map(Nt),a=n.map(r).join(", ")+" ",t.replace(e,a))})}function Nt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Ft(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?l("data option must be an object or a function, `"+t+"` is not valid"):m("If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged")))}function Bt(t,e){It(e);var n="function"==typeof t,a="function"==typeof e;return e||n||(e={}),n||a?function(){var r=a?qt(e,this):e,i=n?qt(t,this):t;return Ut(r,i)}:Ut(e,t)}function qt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&l("Data function must return an object"),n.constructor!==Object&&g("Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged"),n}function Ut(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function Vt(t){var e=So(Qp);return e.parse=function(e,n){return Gt(e,n||t)},e}function Gt(t,e){if(!Hp)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hp(t,e||this.options)}function zt(t,e){var n;if(!Xi){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Wt(t)&&(t=t.substring(1)),!(n=document.getElementById(t))){if(e&&e.noThrow)return;throw Error("Could not find template element with id #"+t)}if("SCRIPT"!==n.tagName.toUpperCase()){if(e&&e.noThrow)return;throw Error("Template element with id #"+t+", must be a

      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 CrotKk diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index b050d461a3..34e53a81df 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1247,7 +1247,7 @@ Creating a chem with a low purity will make you permanently fall in love with so if(1 to 9) if(prob(20)) to_chat(M, "Your tongue feels... fluffy") - if(10 to 20) + if(10 to 15) if(prob(10)) to_chat(M, "You find yourself unable to supress the desire to meow!") M.emote("nya") @@ -1261,14 +1261,14 @@ Creating a chem with a low purity will make you permanently fall in love with so seen = seen - victim if(seen) to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") - if(21) + if(16) T = M.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO T.Remove(M) nT.Insert(M) - T.forceMove(locate(10,6,1))//To the zelda room. + T.moveToNullspace()//To the zelda room. to_chat(M, "Youw tongue feews... weally fwuffy!!") - if(22 to INFINITY) + if(17 to INFINITY) if(prob(10)) to_chat(M, "You find yourself unable to supress the desire to meow!") M.emote("nya") From 01c3f66f7cf14a8d530822ce05159d27c1fe76cc Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 02:42:55 +0100 Subject: [PATCH 208/608] Great, merge conflicts. --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 34e53a81df..b99e9c830d 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -152,7 +152,7 @@ var/items = M.get_contents() if(!LAZYLEN(items)) - return ..()//This'll work, right? + return ..() var/obj/item/I = pick(items) M.dropItemToGround(I, TRUE) do_sparks(5,FALSE,I) @@ -180,7 +180,7 @@ C.emote("spin") M.emote("spin") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) - C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! O� suis-je?!", "Yee haw!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "Ciekawe co na obiad?", "You fool! You took too much eigenstasium! You've doomed us all!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Fermichem was a mistake", "This is one hell of a strong beepsky smash.", "Now neither of us will be virgins!")]\"") + C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! O� suis-je?!", "Yee haw! This is one hell of a hootenanny!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "I've come from the future to warn you to not take eigenstasium! Oh no! I'm too late!", "You fool! You took too much eigenstasium! You've doomed us all!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Fermichem was a mistake", "This is one hell of a beepsky smash.", "Now neither of us will be virgins!")]\"") if(2) var/mob/living/carbon/C = fermi_Tclone do_sparks(5,FALSE,C) From af52ff29fe22bcc854e5d4e8d703afbc0b701e5f Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 03:23:14 +0100 Subject: [PATCH 209/608] Fixing merge conflicts. --- icons/obj/clothing/hats.dmi | Bin 85491 -> 88442 bytes tgstation.dme | 24 ++++++++++++------------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 6e1e2c84d31a617b1d5e428aae43762f8d4cfc80..a8ec22c950b8de733b665b722b298f55d4e2eb17 100644 GIT binary patch literal 88442 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⋘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 diff --git a/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm index 2ab4e0d9eb..546093f960 100644 --- a/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm +++ b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm @@ -4,7 +4,7 @@ /obj/item/clothing/head/hattip //I wonder if anyone else has played cryptworlds name = "Sythetic hat" con = 'icons/obj/clothing/hats.dmi' - icon_state = "top_hat" + icon_state = "cowboy" desc = "A sythesized hat, you can't seem to take it off. And tips their hat." armor = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1) From e9a18f156f7a85cc0966113c9e7661c5dba17d4b Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sun, 12 May 2019 22:03:21 -0400 Subject: [PATCH 106/608] Update engineering.dm --- code/modules/cargo/bounties/engineering.dm | 57 ++++++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm index eb1764d482..efe2990703 100644 --- a/code/modules/cargo/bounties/engineering.dm +++ b/code/modules/cargo/bounties/engineering.dm @@ -14,10 +14,10 @@ return FALSE return T.air_contents.gases[gas_type][MOLES] >= moles_required -/datum/bounty/item/engineering/gas/nitryl_tank - name = "Full Tank of Nitryl" - description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started." - gas_type = /datum/gas/nitryl +//datum/bounty/item/engineering/gas/nitryl_tank +// name = "Full Tank of Nitryl" +// description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started." +// gas_type = /datum/gas/nitryl /datum/bounty/item/engineering/gas/tritium_tank name = "Full Tank of Tritium" @@ -37,6 +37,55 @@ required_count = 10 //easy to make wanted_types = list(/obj/machinery/portable_atmospherics/canister) +/datum/bounty/item/engineering/microwave + name = "Microwaves" + description = "Are cooks are unable to keep up with order do to a lack of microwaves, please send us some." + reward = 2000 + required_count = 3 + wanted_types = list(/obj/machinery/microwave) + +/datum/bounty/item/engineering/hydroponicstrays + name = "Hydroponics Tray" + description = "The garden has become a hot spot of late, they need a few more hydroponics tray to grow more flowers." + reward = 2500 + required_count = 5 + wanted_types = list(/obj/machinery/hydroponics) + +/datum/bounty/item/engineering/rcd + name = "Spare RCD" + description = "Construction and repairs to are shuttles are going slowly, turns out we are sort of RCDs, can you send us a few?" + reward = 2500 + required_count = 3 + wanted_types = list(/obj/item/construction/rcd) + +/datum/bounty/item/engineering/rpd + name = "Spare RPD" + description = "Are atmos techs are sick and tired of running back and forth to get more pipes when making new parts or repairing shuttles. Can you send us a few?" + reward = 3000 + required_count = 3 + wanted_types = list(/obj/item/pipe_dispenser) + +/datum/bounty/item/engineering/heaters + name = "Space Heaters" + description = "The kitchen freezer was left open and now the whole place is frozen solid! We need a few space heaters to warm it back up before anyone gets hungry." + reward = 3000 + required_count = 5 + wanted_types = list(/obj/machinery/space_heater) + +/datum/bounty/item/engineering/arcadetrail + name = "Orion Trail Arcade Games" + description = "The staff have nothing to do when off-work. Can you send us some Orion Trail games to play?" + reward = 3000 + required_count = 5 + wanted_types = list(/obj/machinery/computer/arcade/orion_trail) + +/datum/bounty/item/engineering/arcadebattle + name = "Battle Arcade Games" + description = "The staff have nothing to do when off-work. Can you send us some Battle Arcade games to play?" + reward = 3000 + required_count = 5 + wanted_types = list(obj/machinery/computer/arcade/battle) + /datum/bounty/item/engineering/energy_ball name = "Contained Tesla Ball" description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper." From 050906bfe896c8a2ed5675d69877b4ae6ae39d8e Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sun, 12 May 2019 22:22:09 -0400 Subject: [PATCH 107/608] I know how to code I sware --- code/modules/cargo/bounties/engineering.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm index efe2990703..70aaae5b81 100644 --- a/code/modules/cargo/bounties/engineering.dm +++ b/code/modules/cargo/bounties/engineering.dm @@ -84,7 +84,7 @@ description = "The staff have nothing to do when off-work. Can you send us some Battle Arcade games to play?" reward = 3000 required_count = 5 - wanted_types = list(obj/machinery/computer/arcade/battle) + wanted_types = list(/obj/machinery/computer/arcade/battle) /datum/bounty/item/engineering/energy_ball name = "Contained Tesla Ball" From be274176338aa911e83c5e3a00661fb831d63dcb Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 13 May 2019 18:07:51 +0100 Subject: [PATCH 108/608] Stuff and things --- code/modules/ninja/suit/suit.dm | 2 +- .../code/datums/status_effects/chems.dm | 12 +-- .../code/modules/arousal/organs/breasts.dm | 1 + .../code/modules/arousal/organs/genitals.dm | 22 +++-- .../clothing/fermichemclothe/fermiclothes.dm | 10 +- .../chemistry/reagents/fermi_reagents.dm | 99 ++++++++++++------- tgstation.dme | 1 + 7 files changed, 92 insertions(+), 55 deletions(-) diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index 6110f2b0c0..12492c8043 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -101,7 +101,7 @@ Contents: to_chat(H, "fÄTaL ÈÈRRoR: 382200-*#00CÖDE RED\nUNAU†HORIZED USÈ DETÈC†††eD\nCoMMÈNCING SUB-R0U†IN3 13...\nTÈRMInATING U-U-USÈR...") H.gib() return FALSE - if(!istype(H.head, /obj/item/clothing/head/helmet/space/space_ninja)) + if(!istype(H.head, /obj/item/clothing/head/helmet/space/space_ninja) || !istype(H.head, /obj/item/clothing/head/hattip))//Fermichem edit, so ninjas can still use their suit with a fancy hat. to_chat(H, "ERROR: 100113 UNABLE TO LOCATE HEAD GEAR\nABORTING...") return FALSE if(!istype(H.shoes, /obj/item/clothing/shoes/space_ninja)) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index aa46c164b4..9b71ebd457 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -56,14 +56,12 @@ if(W == o.w_uniform || W == o.wear_suit) o.dropItemToGround(W, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) + to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") + o.visible_message("[o]'s chest suddenly bursts forth, ripping their clothes off!'") //message_admins("BElarge started!") - - if(o.w_uniform || o.wear_suit) - to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!") - o.visible_message("[o]'s chest suddenly bursts forth, ripping their clothes off!'") - else - to_chat(o, "Your bountiful bosom is so rich with mass, you seriously doubt you'll be able to fit any clothes over it.") - return ..() + else + to_chat(o, "Your bountiful bosom is so rich with mass, you seriously doubt you'll be able to fit any clothes over it.") + return ..() /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge var/mob/living/carbon/human/o = owner diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index eb80137735..b2b565b603 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -25,6 +25,7 @@ . = ..() reagents.add_reagent(fluid_id, fluid_max_volume) prev_size = size + cached_size = breast_values[size] /obj/item/organ/genital/breasts/on_life() if(QDELETED(src)) diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 2766d46bc1..aad06f8cdb 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -263,14 +263,15 @@ return update_genitals() -/mob/living/carbon/human/proc/update_genitals() +/mob/living/carbon/human/proc/update_genitals(mob/living/carbon/human/H) if(src && !QDELETED(src)) dna.species.handle_genitals(src) + H.update_body() -/mob/living/carbon/human/proc/Force_update_genitals() - //dna.species.handle_genitals(src) +/mob/living/carbon/human/proc/Force_update_genitals(mob/living/carbon/human/H) + dna.species.handle_genitals(src) dna.species.handle_breasts(src) - + H.update_body() /datum/species/proc/handle_genitals(mob/living/carbon/human/H) message_admins("attempting to update sprite") @@ -358,23 +359,27 @@ if(!B) return message_admins("attempting to update sprite in a hacky way") - ///obj/item/organ/genital/breasts/update_icon(/obj/item/organ/genital) Where did this come from? + //obj/item/organ/genital/breasts/update_icon(/obj/item/organ/genital) //Where did this come from? //Variables: var/size = B.size var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER) var/datum/sprite_accessory/S = GLOB.breasts_shapes_list[B.shape] var/list/standing = list() - if(!S || S.icon_state == "none") - return + + //if(!S || S.icon_state == "none") + //return + for(var/layer in relevant_layers) var/layertext = genitals_layertext(layer) S = GLOB.breasts_shapes_list[B.shape] + message_admins("Attempting sprite calc: Bslot:[B.slot], B.shape:[B.shape], size:[size], Arouse:[B.aroused_state], layertxt:[layertext]") + var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer) //If breasts are hueg (larger than 5 only have one sprite atm) - if (size > 5) + if (B.breast_values[size] > 5) genital_overlay.icon_state = "[B.slot]_[B.shape]_[size]_0_[layertext]"//I haven't done around sizes above 5, I dunno how..! else genital_overlay.icon_state = "[B.slot]_[S.icon_state]_[size]_[B.aroused_state]_[layertext]" @@ -415,3 +420,4 @@ for(var/L in relevant_layers) H.apply_overlay(L) H.update_icons() + ///obj/item/organ/genital/breasts/update_icon(/obj/item/organ/genital) //Where did this come from? diff --git a/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm index 546093f960..38e3a14740 100644 --- a/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm +++ b/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm @@ -3,10 +3,11 @@ /obj/item/clothing/head/hattip //I wonder if anyone else has played cryptworlds name = "Sythetic hat" - con = 'icons/obj/clothing/hats.dmi' + icon = 'icons/obj/clothing/hats.dmi' icon_state = "cowboy" desc = "A sythesized hat, you can't seem to take it off. And tips their hat." - armor = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + item_flags = NODROP //Tips their hat! /obj/item/clothing/head/hattip/attack_hand(mob/user) if(iscarbon(user)) @@ -19,5 +20,8 @@ return ..() /obj/item/clothing/head/hattip/speechModification(message) - message += ".\" And tips their hat. \"Yeehaw" + if(prob(0.01)) + message += "\" and tips their hat. \"Spy's sappin' my Sentry!" + return message + message += "\" and tips their hat. \"[pick("Yeehaw!", "Boy howdy.", "Darn tootin'.", "Well don't that beat all.", "Whoooowee, would ya look at that!", "Whoooowee! Makin' bacon!", "Cream Gravy!", "Yippekeeyah-heeyapeeah-kayoh!", "Move 'em out!", "Giddy up!")]" return message diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 906f1c25ae..6a42fc973b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -17,19 +17,23 @@ //holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism //return ..() -/datum/reagent/fermi/overdose_start(mob/living/carbon/M) - current_cycle++ +///datum/reagent/fermi/overdose_start(mob/living/carbon/M) + //current_cycle++ //eigenstate Chem //Teleports you to chemistry and back //OD teleports you randomly around the Station //Addiction send you on a wild ride and replaces you with an alternative reality version of yourself. +//////////////////////////////////////////////////////////////////////////////////////////////////// +// EIGENSTASIUM +/////////////////////////////////////////////////////////////////////////////////////////////////// + /datum/reagent/fermi/eigenstate name = "Eigenstasium" id = "eigenstate" description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" - taste_description = "wiggly" + taste_description = "wiggly cosmic dust." color = "#5020H4" // rgb: 50, 20, 255 overdose_threshold = 15 addiction_threshold = 20 @@ -496,6 +500,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") ..() +//////////////////////////////////////////////////////////////////////////////////////////////////// +// BREAST ENLARGE +/////////////////////////////////////////////////////////////////////////////////////////////////// + //breast englargement //Honestly the most requested chems //I'm not a very kinky person, sorry if it's not great @@ -538,7 +546,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING nB.cached_size = 0 nB.prev_size = 0 to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") - M.reagents.remove_reagent(src.id, 5) + holder.remove_reagent(src.id, 5) B = nB //If they have them, increase size. If size is comically big, limit movement and rip clothes. //message_admins("Breast size: [B.size], [B.cached_size], [holder]") @@ -579,6 +587,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING W = nW ..() +//////////////////////////////////////////////////////////////////////////////////////////////////// +// PENIS ENLARGE +/////////////////////////////////////////////////////////////////////////////////////////////////// + //TODO: failing the reaction creates a penis instead. /datum/reagent/fermi/PElarger // Due to popular demand...! name = "Incubus draft" @@ -612,7 +624,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.")//OwO nP.cached_length = 0.1 nP.prev_size = 0.1 - M.reagents.remove_reagent(src.id, 5) + holder.remove_reagent(src.id, 5) P = nP P.cached_length = P.cached_length + 0.1 @@ -650,6 +662,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING T = nT ..() +//////////////////////////////////////////////////////////////////////////////////////////////////// +// ASTROGEN +/////////////////////////////////////////////////////////////////////////////////////////////////// /datum/reagent/fermi/astral // Gives you the ability to astral project for a moment! name = "Astrogen" id = "astral" @@ -736,9 +751,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(0 to 30) to_chat(M, "Your body disperses from existence, as you become one with the universe.") to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life and afterlife remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. - M.visible_message("[M.name] suddenly disappears, their body evaporating from existence, freeing [M.nane] from their mortal coil.") - deadchat_broadcast("[M.name] has become one with the universe, meaning that their IC conciousness is continuous throughout death. If they find a way back to life, they are allowed to remember what was said in deadchat and their previous life. Be careful what you say. If they don't act IC while dead, bwoink the FUCK otta them.") - message_admins("[M.name] has become one with the universe, and have continuous memories thoughout death should they find a way to come back to life (such as an inteligence potion, midround antag). They MUST stay within characer while dead.") + M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") + deadchat_broadcast("[M] has become one with the universe, meaning that their IC conciousness is continuous throughout death. If they find a way back to life, they are allowed to remember what was said in deadchat and their previous life. Be careful what you say. If they don't act IC while dead, bwoink the FUCK otta them.") + message_admins("[M] has become one with the universe, and have continuous memories thoughout death should they find a way to come back to life (such as an inteligence potion, midround antag). They MUST stay within characer while dead.") qdel(M) //Approx 60minutes till death from initial addiction ..() @@ -788,6 +803,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ..() /datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M) + . = ..() M.add_trait(TRAIT_PACIFISM, "MKUltra") var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) if (!M.has_status_effect(/datum/status_effect/chem/enthrall)) @@ -812,19 +828,19 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Addiction is applied when creator is out of viewer // +//////////////////////////////////////////////////////////////////////////////////////////////////// +// HATIMUIM /////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/reagent/fermi/hatmium +/datum/reagent/fermi/hatmium //for hatterhat name = "Hat growth serium" id = "hatmium" description = "A strange substance that draws in a hat from the hat dimention, " color = "#A080H4" // rgb: , 0, 255 - taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" - //metabolization_rate = 0.5 - overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. - var/obj/item/clothing/head/hat - //addiction_threshold = 30 - //addiction_stage1_end = 9999//Should never end. + taste_description = "like jerky, whiskey and an off aftertaste of a crypt" + overdose_threshold = 100 + var/obj/item/clothing/head/hattip/hat + /datum/reagent/fermi/hatmium/on_mob_add(mob/living/carbon/human/M) //var/mob/living/carbon/human/o = M @@ -832,21 +848,24 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING for(var/obj/item/W in items) if(W == M.head) M.dropItemToGround(W, TRUE) - hat = new var/obj/item/clothing/head/hattip - equip_to_slot_if_possible(hat, SLOT_HEAD, 1, 1) + hat = new /obj/item/clothing/head/hattip() + M.equip_to_slot(hat, SLOT_HEAD, 1, 1) + /datum/reagent/fermi/hatmium/on_mob_life(mob/living/carbon/human/M) //hat.armor = list("melee" = (1+(current_cycle/20)), "bullet" = (1+(current_cycle/20)), "laser" = (1+(current_cycle/20)), "energy" = (1+(current_cycle/20)), "bomb" = (1+(current_cycle/20)), "bio" = (1+(current_cycle/20)), "rad" = (1+(current_cycle/20)), "fire" = (1+(current_cycle/20)), "acid" = (1+(current_cycle/20))) if(!overdosed) - for var/i in hat.armor - hat.armor[i] = (1+(current_cycle/10)) - -/datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M)//To prevent people in cyro going nuts - for var/i in hat.armor - hat.armor[i] = (1/(current_cycle*10)) - -/////////////////////////////////////////////////////////////////////////////////////////////// + for (var/i in hat.armor) + hat.armor[i] = (1+(current_cycle*20)) //Doesn't work aaarghhhhh!!!! + else + for (var/i in hat.armor) + hat.armor[i] = (1/(current_cycle*10)) + ..() +//////////////////////////////////////////////////////////////////////////////////////////////////// +// FURRANIUM +/////////////////////////////////////////////////////////////////////////////////////////////////// +//Works as intended!! /datum/reagent/fermi/furranium name = "Furranium" id = "furranium" @@ -893,16 +912,20 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /////////////////////////////////////////////////////////////////////////////////////////////// /datum/reagent/fermi/secretcatchem //Should I hide this from code divers? A secret cit chem? - name = "Catgirli[pick("a","u","e","y","")]m [pick("apex", "prime", "meow")]" //an attempt at hiding it + //name = "Catgirl" //an attempt at hiding it id = "secretcatchem" description = "An illegal and hidden chem that turns people into catgirls. It's said you see the light if you take too much of it." color = "#A0B0E4" // rgb: , 0, 255 taste_description = "hairballs and cream" overdose_threshold = 10 -/datum/reagent/fermi/Catgirlium/on_mob_add(mob/living/carbon/human/H) +/datum/reagent/fermi/secretcatchem/New() + name = "Catgirli[pick("a","u","e","y")]m [pick("apex", "prime", "meow")]" + +/datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H) + . = ..() var/current_species = H.dna.species.type - var/datum/species/mutation = race + var/datum/species/mutation = /datum/species/human/felinid if(mutation && mutation != current_species) to_chat(H, "You crumple in agony as your flesh wildly morphs into new forms!") H.visible_message("[H] falls to the ground and screams as [H.p_their()] skin bubbles and froths!") @@ -911,21 +934,23 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING else to_chat(H, "The pain vanishes suddenly. You feel no different.") -/datum/reagent/fermi/Catgirlium/on_mob_life(mob/living/carbon/M) +/datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/M) if(prob(10)) playsound(get_turf(M), 'modular_citadel/sound/voice/nya.ogg', 50, 1, -1) - H.emote("me","lets out a nya!") + M.emote("me","lets out a nya!") if(prob(10)) playsound(get_turf(M), 'sound/effects/meow1.ogg', 50, 1, -1) - H.emote("me","lets out a mewl!") + M.emote("me","lets out a mewl!") if(prob(10)) playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) - H.emote("me","lets out a meowrowr!") + M.emote("me","lets out a meowrowr!") + ..() -/datum/reagent/fermi/Catgirlium/overdose_start(mob/living/carbon/human/H) //I couldn't resist - should I hide this somewhere else? +/datum/reagent/fermi/secretcatchem/overdose_start(mob/living/carbon/human/H) //I couldn't resist - should I hide this somewhere else? + . = ..() to_chat(H, "You suddenly see the light and realise that everyone will be better off, and much happier, if they were only a cat girl.") - objective = "Aid in the production of more chemicals and turn everyone on the station into catgirls. Avoid any and all attempts at renoucing your newfound catgirl form for this is your true form now." - if (owner.mind.assigned_role in GLOB.antagonists) + var/objective = "Aid in the production of more chemicals and turn everyone on the station into catgirls. Avoid any and all attempts at renoucing your newfound catgirl form for this is your true form now." + if (H.mind.assigned_role in GLOB.antagonists) objective += "Complete your objectives in tandem with this new objective. If you are tasked with murdering someone turning someone into a catgirl is now an alternative to you." brainwash(H, objective) @@ -937,6 +962,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING C.mind.transfer_to(cat) cat.name = C.name qdel(C) + //Add to chat lines + //Maybe teleport player away instead? */ @@ -948,7 +975,7 @@ alpha = 20 reduce viewrange? */ -/* +/* Needs to be fixed: //Nanite removal //Writen by Trilby!! /datum/reagent/fermi/naninte_b_gone diff --git a/tgstation.dme b/tgstation.dme index b50b9e273f..f1e41b6c2f 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2901,6 +2901,7 @@ #include "modular_citadel\code\modules\client\verbs\who.dm" #include "modular_citadel\code\modules\clothing\clothing.dm" #include "modular_citadel\code\modules\clothing\neck.dm" +#include "modular_citadel\code\modules\clothing\fermichemclothe\fermiclothes.dm" #include "modular_citadel\code\modules\clothing\glasses\phantomthief.dm" #include "modular_citadel\code\modules\clothing\head\head.dm" #include "modular_citadel\code\modules\clothing\spacesuits\cydonian_armor.dm" From 3229e4bf3a3c53e308070fa1bc42ce0eb6a6b35a Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 14 May 2019 02:48:12 +0100 Subject: [PATCH 109/608] Reverted holder, (sorry Kev) --- code/modules/reagents/chemistry/holder.dm | 493 ++++++---- code/modules/reagents/chemistry/holderKev.dm | 900 ++++++++++++++++++ .../code/modules/arousal/organs/breasts.dm | 2 +- .../code/modules/arousal/organs/genitals.dm | 5 +- 4 files changed, 1230 insertions(+), 170 deletions(-) create mode 100644 code/modules/reagents/chemistry/holderKev.dm diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index c51c318e3e..9eec115250 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -53,6 +53,10 @@ var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() var/reagents_holder_flags + var/targetVol = 0 + var/reactedVol = 0 + var/fermiIsReacting = FALSE + var/fermiReactID = null /datum/reagents/New(maximum=100) maximum_volume = maximum @@ -337,205 +341,362 @@ R.on_update (A) update_total() -/datum/reagents/process() - var/occured = handle_reactions(TRUE) - if(!occured) - return PROCESS_KILL +/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar + if(fermiIsReacting == TRUE) + //reagents_holder_flags |= REAGENT_NOREACT unsure if this is needed + return + var/list/cached_reagents = reagent_list //a list of the reagents? + var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? + var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! + if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. + return //Yup, no reactions here. No siree. -/datum/reagents/proc/handle_reactions(fermi_chem_react = FALSE)//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar - return - if(reagents_holder_flags & REAGENT_NOREACT) - return //don't react - //cache things for performance - var/list/cached_reagents = reagent_list - var/list/cached_reactions = GLOB.chemical_reactions_list - var/datum/cached_my_atom = my_atom - var/reaction_occurred //if a reaction happened - var/list/fermichem_reacted //keeps track of fermichem reactions that already reacted to prevent it from being instant - do - var/list/possible_reactions - reaction_occurred = FALSE - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - for(var/reaction in cached_reactions[R.id]) + var/reaction_occurred = 0 // checks if reaction, binary variable + var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. + + //if(fermiIsReacting == TRUE) + /* if (reactedVol >= targetVol && targetVol != 0) + STOP_PROCESSING(SSprocessing, src) + fermiIsReacting = FALSE + message_admins("FermiChem processing stopped in reaction handler") + reaction_occurred = 1 + return + else + message_admins("FermiChem processing passed in reaction handler") + return + */ + + + do //What does do do in byond? It sounds very redundant? is it a while loop? + var/list/possible_reactions = list() //init list + reaction_occurred = 0 // sets it back to 0? + for(var/reagent in cached_reagents) //for reagent in beaker/holder + var/datum/reagent/R = reagent //check to make sure that reagent is there for the reaction list + for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id if(!reaction) continue + var/datum/chemical_reaction/C = reaction var/list/cached_required_reagents = C.required_reagents + var/total_required_reagents = cached_required_reagents.len + var/total_matching_reagents = 0 var/list/cached_required_catalysts = C.required_catalysts + var/total_required_catalysts = cached_required_catalysts.len + var/total_matching_catalysts= 0 + var/matching_container = 0 + var/matching_other = 0 var/required_temp = C.required_temp var/is_cold_recipe = C.is_cold_recipe + var/meets_temp_requirement = 0 var/has_special_react = C.special_react - var/fail = FALSE + var/can_special_react = 0 + + for(var/B in cached_required_reagents) if(!has_reagent(B, cached_required_reagents[B])) - fail = TRUE break - if(fail) - continue + total_matching_reagents++ for(var/B in cached_required_catalysts) if(!has_reagent(B, cached_required_catalysts[B])) - fail = TRUE break - if(fail) - continue + total_matching_catalysts++ if(cached_my_atom) - if(C.required_container && C.required_container != cached_my_atom.type) - continue + if(!C.required_container) + matching_container = 1 + + else + if(cached_my_atom.type == C.required_container)//if the suspected container is a container + matching_container = 1 if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs - continue - if(C.required_other) //Checks for other things required - if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem - var/obj/item/slime_extract/M = cached_my_atom - if(M.Uses <= 0) // added a limit to slime cores -- Muskets requested this - continue + return + if(!C.required_other)//Checks for other things required + matching_other = 1//binary check passes + + else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem + var/obj/item/slime_extract/M = cached_my_atom + + if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this + matching_other = 1 else - if(C.required_container || C.required_other) - continue - if(required_temp && (is_cold_recipe? (chem_temp > required_temp) : (chem_temp < required_temp))) - continue - if(has_special_react && !C.check_special_react(src)) - continue - if(C.FermiChem) //fermichem checks - if(chem_temp < C.OptimalTempMin) //too low temperature - continue - if(LAZYACCESS(fermichem_reacted, C)) //fermichems don't keep reacting instantly - continue - START_PROCESSING(SSchemistry, src) //start processing - if(!fermi_chem_react) //only react fermichems on process icks - continue - LAZYADD(possible_reactions, C) - if(length(possible_reactions)) //does list exist? + if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? Oh, cyro. + matching_container = 1 + if(!C.required_other) + matching_other = 1 + + //FermiChem + /* + if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! + if (C.FermiExplode == TRUE) + //To be added! + else + FermiExplode() + //explode function!! + */ + + if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! + meets_temp_requirement = 1//binary pass + + if(!has_special_react || C.check_special_react(src)) + can_special_react = 1 + + if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react) + possible_reactions += C + + if(possible_reactions.len)//does list exist? var/datum/chemical_reaction/selected_reaction = possible_reactions[1] - for(var/I in possible_reactions) - var/datum/chemical_reaction/competitor = I - if(selected_reaction.is_cold_recipe? competitor.required_temp < selected_reaction.required_temp : competitor.required_temp > selected_reaction.required_temp) - selected_reaction = competitor + //select the reaction with the most extreme temperature requirements + for(var/V in possible_reactions)//why V, surely that would indicate volume? V is the reaction potential. + var/datum/chemical_reaction/competitor = V //competitor? I think this is theres two of them. Troubling..! + if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. + if(competitor.required_temp <= selected_reaction.required_temp)//only returns with lower if reaction "is cold" var. + selected_reaction = competitor + else + if(competitor.required_temp >= selected_reaction.required_temp) //will return with the hotter reacting first. + selected_reaction = competitor var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list var/list/cached_results = selected_reaction.results//resultant chemical list - var/special_react_result = selected_reaction.special_react + var/special_react_result = selected_reaction.check_special_react(src) + var/list/multiplier = INFINITY //Wat + + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. //FermiChem relies on two additional properties; pH and impurity //Temperature plays into a larger role too. //BRANCH HERE - var/multiplier = INFINITY //the multiplier of the stnadard "1 reaction" we managed to do this cycle - if(!selected_reaction.FermiChem) //it's a normal ss13 chem reaction, instant reactions. - for(var/B in cached_required_reagents) - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) //cap by the multiplier of the required you can get out of this - //remove reactants - for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = TRUE) - //add products - for(var/P in cached_results) - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P] * multiplier, P) - add_reagent(P, cached_results[P]*multiplier, null, chem_temp) - else //FermiiiCheeeem! - //FERMICHEM BEGIN - //--CHECKS + //if(selected_reaction) + var/datum/chemical_reaction/C = selected_reaction + + if (C.FermiChem == TRUE && !continue_reacting) message_admins("FermiChem Proc'd") - var/target_volume = 0 - for(var/result_id in cached_results) - target_volume += multiplier * cached_results[result_id] - message_admins("FermiChem target volume: [target_volume]") - //--PROCESS - message_admins("FermiChem processing started") - //--REACTION - //set up fermichem variables - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmount = 0 - var/purity = 1 - //For now, purity is handled elsewhere - //check extremes first - if(chem_temp > selected_reaction.ExplodeTemp) - FermiExplode(selected_reaction) - else if(!ISINRANGE(pH, 0, 14)) - //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - FermiExplode() - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < selected_reaction.OptimalTempMax && chem_temp >= selected_reaction.OptimalTempMin) - deltaT = (((selected_reaction.OptimalTempMin - chem_temp)**selected_reaction.CurveSharpT)/((selected_reaction.OptimalTempMax - selected_reaction.OptimalTempMin)**selected_reaction.CurveSharpT)) - else if (chem_temp >= selected_reaction.OptimalTempMax) - deltaT = 1 - else - deltaT = 0 - message_admins("calculating temperature factor, min: [selected_reaction.OptimalTempMin], max: [selected_reaction.OptimalTempMax], Exponential: [selected_reaction.CurveSharpT], deltaT: [deltaT]") - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < selected_reaction.OptimalpHMin) - if (pH < (selected_reaction.OptimalpHMin - selected_reaction.ReactpHLim)) - deltapH = 0 + + for(var/P in selected_reaction.results) + targetVol = cached_results[P]*multiplier + message_admins("FermiChem target volume: [targetVol]") + + if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions + //if (reactedVol < targetVol) + if (fermiIsReacting == TRUE) + return 0 else - deltapH = (((pH - (selected_reaction.OptimalpHMin - selected_reaction.ReactpHLim))**selected_reaction.CurveSharppH)/(selected_reaction.ReactpHLim**selected_reaction.CurveSharppH)) - //Upper range - else if (pH > selected_reaction.OptimalpHMin) - if (pH > (selected_reaction.OptimalpHMin + selected_reaction.ReactpHLim)) - deltapH = 0 - else - deltapH = ((selected_reaction.ReactpHLim -(pH - (selected_reaction.OptimalpHMax + selected_reaction.ReactpHLim))+selected_reaction.ReactpHLim)/(selected_reaction.ReactpHLim**selected_reaction.CurveSharppH)) - //Within mid range - else if (pH >= selected_reaction.OptimalpHMin && pH <= selected_reaction.OptimalpHMax) - deltapH = 1 - //This should never proc: + //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) + START_PROCESSING(SSprocessing, src) + message_admins("FermiChem processing started") + fermiIsReacting = TRUE + fermiReactID = selected_reaction + reaction_occurred = 1 + //else + // fermiIsReacting = FALSE + // STOP_PROCESSING(SSfastprocess, src) else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") - WARNING("[my_atom] attempted to determine FermiChem pH for '[selected_reaction.id]' which broke for some reason! ([usr])") - //TODO Add CatalystFact - message_admins("calculating pH factor(purity), pH: [pH], min: [selected_reaction.OptimalpHMin]-[selected_reaction.ReactpHLim], max: [selected_reaction.OptimalpHMax]+[selected_reaction.ReactpHLim], deltapH: [deltapH]") - stepChemAmount = target_volume * deltaT - if (stepChemAmount > selected_reaction.RateUpLim) - stepChemAmount = selected_reaction.RateUpLim - else if (stepChemAmount <= 0.01) - message_admins("stepChem underflow [stepChemAmount]") - stepChemAmount = 0.02 - purity = deltapH - message_admins("cached_results: [cached_results], stepChemAmount [stepChemAmount]") - if(stepChemAmount > multiplier) //too much - message_admins("stepChemAmount was over multiplier for some reason..?") + return 0 + + + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log + + //Standard reaction mechanics: + else + + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + for(var/B in cached_required_reagents) - message_admins("cached_required_reagents(B): [cached_required_reagents[B]], base stepChemAmount [stepChemAmount]") - remove_reagent(B, (stepChemAmount * cached_required_reagents[B]), safety = TRUE)//safety? removes reagents from beaker using remove function. + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? - //reactedVol = max(reactedVol, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmount, P)//log - add_reagent(P, cached_results[P] * stepChemAmount, null, chem_temp)//add reagent function!! I THINK I can do this: - message_admins("purity: [purity], purity of beaker") - message_admins("Temp before change: [chem_temp], pH after change: [pH]") - //Apply pH changes and thermal output of reaction to beaker - chem_temp += (selected_reaction.ThermicConstant * stepChemAmount) - pH += (selected_reaction.HIonRelease * stepChemAmount) - message_admins("Temp after change: [chem_temp], pH after change: [pH]") - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", multiplier, selected_reaction.id)//log - //ensure the same thing doesn't happen in the same tick - LAZYSET(fermichem_reacted, selected_reaction, TRUE) - //FERMICHEM END - //reaction is done, do the effects. - var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers - var/iconhtml = icon2html(cached_my_atom, seen) - if(cached_my_atom) - if(!ismob(cached_my_atom)) // No bubbling mobs - if(selected_reaction.mix_sound) - playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) + for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log + add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: - for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") - if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead + var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers + var/iconhtml = icon2html(cached_my_atom, seen) + if(cached_my_atom) + if(!ismob(cached_my_atom)) // No bubbling mobs + if(selected_reaction.mix_sound) + playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) + for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." - selected_reaction.on_reaction(src, multiplier, special_react_result) - reaction_occurred = TRUE - while(reaction_occurred) - update_total() - return reaction_occurred + to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + + if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. + var/obj/item/slime_extract/ME2 = my_atom + ME2.Uses-- + if(ME2.Uses <= 0) // give the notification that the slime core is dead + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") + ME2.name = "used slime extract" + ME2.desc = "This extract has been used up." + + selected_reaction.on_reaction(src, multiplier, special_react_result) + reaction_occurred = 1 + continue_reacting = TRUE + + while(reaction_occurred)//while do nothing? + update_total()//Don't know waht this does. + return 0//end! + +/datum/reagents/process() + var/datum/chemical_reaction/C = fermiReactID + var/list/cached_required_reagents = C.required_reagents//update reagents list + var/list/cached_results = C.results//resultant chemical list + var/multiplier = INFINITY + + message_admins("updating targetVol from [targetVol]") + for(var/B in cached_required_reagents) // + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) + if (multiplier == 0) + STOP_PROCESSING(SSprocessing, src) + fermiIsReacting = FALSE + message_admins("FermiChem STOPPED due to reactant removal! Reacted vol: [reactedVol] of [targetVol]") + reactedVol = 0 + targetVol = 0 + handle_reactions() + update_total() + return + for(var/P in cached_results) + targetVol = cached_results[P]*multiplier + + message_admins("to [targetVol]") + + if (fermiIsReacting == FALSE) + message_admins("THIS SHOULD NEVER APPEAR!") + + if (chem_temp > C.OptimalTempMin && fermiIsReacting == TRUE)//To prevent pointless reactions + if (reactedVol < targetVol) + reactedVol = FermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results) + message_admins("FermiChem tick activated started, Reacted vol: [reactedVol] of [targetVol]") + else + STOP_PROCESSING(SSprocessing, src) + fermiIsReacting = FALSE + message_admins("FermiChem STOPPED due to volume reached! Reacted vol: [reactedVol] of [targetVol]") + reactedVol = 0 + targetVol = 0 + handle_reactions() + update_total() + return + else + STOP_PROCESSING(SSprocessing, src) + message_admins("FermiChem STOPPED due to temperature! Reacted vol: [reactedVol] of [targetVol]") + fermiIsReacting = FALSE + reactedVol = 0 + targetVol = 0 + handle_reactions() + update_total() + return + + //handle_reactions() + +/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results) + var/datum/chemical_reaction/C = selected_reaction + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmmount = 0 + //var/ammoReacted = 0 + //get purity from combined beaker reactant purities HERE. + var/purity = 1 + //var/tempVol = totalVol + + message_admins("Loop beginning") + //Begin Parse + + //Check extremes first + if (chem_temp > C.ExplodeTemp) + //go to explode proc + message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") + FermiExplode() + + if (pH > 14 || pH < 0) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + message_admins("pH is lover limit, cur pH: [pH]") + FermiExplode() + + //For now, purity is handled elsewhere + + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) + deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) + else if (chem_temp >= C.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") + + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < C.OptimalpHMin) + if (pH < (C.OptimalpHMin - C.ReactpHLim)) + deltapH = 0 + else + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) + //Upper range + else if (pH > C.OptimalpHMin) + if (pH > (C.OptimalpHMin + C.ReactpHLim)) + deltapH = 0 + else + deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) + //Within mid range + else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + deltapH = 1 + //This should never proc: + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") + //TODO Add CatalystFact + message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") + + stepChemAmmount = targetVol * deltaT + if (stepChemAmmount > C.RateUpLim) + stepChemAmmount = C.RateUpLim + else if (stepChemAmmount <= 0.01) + message_admins("stepChem underflow [stepChemAmmount]") + stepChemAmmount = 0.02 + + if ((reactedVol + stepChemAmmount) > targetVol) + stepChemAmmount = targetVol - reactedVol + message_admins("target volume reached. Reaction should stop after this loop. stepChemAmmount: [stepChemAmmount] + reactedVol: [reactedVol] = targetVol [targetVol]") + + if (reactedVol > 0) + purity = ((purity * reactedVol) + (deltapH * stepChemAmmount)) /((reactedVol+ stepChemAmmount)) //This should add the purity to the product + else + purity = deltapH + + // End. + /* + for(var/B in cached_required_reagents) // + tempVol = min(reactedVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + */ + message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]") + + + + for(var/B in cached_required_reagents) + message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]") + remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. + + for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? + //reactedVol = max(reactedVol, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + + message_admins("purity: [purity], purity of beaker") + message_admins("Temp before change: [chem_temp], pH after change: [pH]") + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (C.ThermicConstant * stepChemAmmount) + pH += (C.HIonRelease * stepChemAmmount) + message_admins("Temp after change: [chem_temp], pH after change: [pH]") + + + reactedVol = reactedVol + stepChemAmmount + + + return (reactedVol) +/* MOVED TO REAGENTS.DM +/datum/reagents/proc/FermiExplode() + return +*/ /datum/reagents/proc/isolate_reagent(reagent) var/list/cached_reagents = reagent_list diff --git a/code/modules/reagents/chemistry/holderKev.dm b/code/modules/reagents/chemistry/holderKev.dm new file mode 100644 index 0000000000..c51c318e3e --- /dev/null +++ b/code/modules/reagents/chemistry/holderKev.dm @@ -0,0 +1,900 @@ + +/proc/build_chemical_reagent_list() + //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id + + if(GLOB.chemical_reagents_list) + return + + var/paths = subtypesof(/datum/reagent) + GLOB.chemical_reagents_list = list() + + for(var/path in paths) + var/datum/reagent/D = new path() + GLOB.chemical_reagents_list[D.id] = D + +/proc/build_chemical_reactions_list() + //Chemical Reactions - Initialises all /datum/chemical_reaction into a list + // It is filtered into multiple lists within a list. + // For example: + // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma + + if(GLOB.chemical_reactions_list) + return + + var/paths = subtypesof(/datum/chemical_reaction) + GLOB.chemical_reactions_list = list() + + for(var/path in paths) + + var/datum/chemical_reaction/D = new path() + var/list/reaction_ids = list() + + if(D.required_reagents && D.required_reagents.len) + for(var/reaction in D.required_reagents) + reaction_ids += reaction + + // Create filters based on each reagent id in the required reagents list + for(var/id in reaction_ids) + if(!GLOB.chemical_reactions_list[id]) + GLOB.chemical_reactions_list[id] = list() + GLOB.chemical_reactions_list[id] += D + break // Don't bother adding ourselves to other reagent ids, it is redundant + +/////////////////////////////////////////////////////////////////////////////////// + +/datum/reagents + var/list/datum/reagent/reagent_list = new/list() + var/total_volume = 0 + var/maximum_volume = 100 + var/atom/my_atom = null + var/chem_temp = 150 + var/pH = REAGENT_NORMAL_PH + var/last_tick = 1 + var/addiction_tick = 1 + var/list/datum/reagent/addiction_list = new/list() + var/reagents_holder_flags + +/datum/reagents/New(maximum=100) + maximum_volume = maximum + + //I dislike having these here but map-objects are initialised before world/New() is called. >_> + if(!GLOB.chemical_reagents_list) + build_chemical_reagent_list() + if(!GLOB.chemical_reactions_list) + build_chemical_reactions_list() + +/datum/reagents/Destroy() + . = ..() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + qdel(R) + cached_reagents.Cut() + cached_reagents = null + if(my_atom && my_atom.reagents == src) + my_atom.reagents = null + my_atom = null + +// Used in attack logs for reagents in pills and such +/datum/reagents/proc/log_list() + if(!length(reagent_list)) + return "no reagents" + + var/list/data = list() + for(var/r in reagent_list) //no reagents will be left behind + var/datum/reagent/R = r + data += "[R.id] ([round(R.volume, 0.1)]u)" + //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. + return english_list(data) + +/datum/reagents/proc/remove_any(amount = 1) + var/list/cached_reagents = reagent_list + var/total_transfered = 0 + var/current_list_element = 1 + + current_list_element = rand(1, cached_reagents.len) + + while(total_transfered != amount) + if(total_transfered >= amount) + break + if(total_volume <= 0 || !cached_reagents.len) + break + + if(current_list_element > cached_reagents.len) + current_list_element = 1 + + var/datum/reagent/R = cached_reagents[current_list_element] + remove_reagent(R.id, 1) + + current_list_element++ + total_transfered++ + update_total() + + handle_reactions() + return total_transfered + +/datum/reagents/proc/remove_all(amount = 1) + var/list/cached_reagents = reagent_list + if(total_volume > 0) + var/part = amount / total_volume + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + remove_reagent(R.id, R.volume * part) + + update_total() + handle_reactions() + return amount + +/datum/reagents/proc/get_master_reagent_name() + var/list/cached_reagents = reagent_list + var/name + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + name = R.name + + return name + +/datum/reagents/proc/get_master_reagent_id() + var/list/cached_reagents = reagent_list + var/id + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + id = R.id + + return id + +/datum/reagents/proc/get_master_reagent() + var/list/cached_reagents = reagent_list + var/datum/reagent/master + var/max_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume > max_volume) + max_volume = R.volume + master = R + + return master + +/datum/reagents/proc/trans_to(obj/target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. + var/list/cached_reagents = reagent_list + if(!target || !total_volume) + return + if(amount < 0) + return + + var/datum/reagents/R + if(istype(target, /datum/reagents)) + R = target + else + if(!target.reagents) + return + R = target.reagents + amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) + var/part = amount / src.total_volume + var/trans_data = null + for(var/reagent in cached_reagents) + var/datum/reagent/T = reagent + var/transfer_amount = T.volume * part + if(preserve_data) + trans_data = copy_data(T) + + //fermichem Added ph TODO: add T.purity + R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + //R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + remove_reagent(T.id, transfer_amount) + + update_total() + R.update_total() + if(!no_react) + R.handle_reactions() + src.handle_reactions() + return amount + +/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1) + var/list/cached_reagents = reagent_list + if(!target || !total_volume) + return + + var/datum/reagents/R + if(istype(target, /datum/reagents)) + R = target + else + if(!target.reagents) + return + R = target.reagents + + if(amount < 0) + return + amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) + var/part = amount / total_volume + var/trans_data = null + for(var/reagent in cached_reagents) + var/datum/reagent/T = reagent + var/copy_amount = T.volume * part + if(preserve_data) + trans_data = T.data + R.add_reagent(T.id, copy_amount * multiplier, trans_data) + + src.update_total() + R.update_total() + R.handle_reactions() + src.handle_reactions() + return amount + +/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N + var/list/cached_reagents = reagent_list + if (!target) + return + if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) + return + if(amount < 0) + return + + var/datum/reagents/R = target.reagents + if(src.get_reagent_amount(reagent)= R.overdose_threshold && !R.overdosed) + R.overdosed = 1 + need_mob_update += R.overdose_start(C) + if(R.addiction_threshold) + if(R.volume >= R.addiction_threshold && !is_type_in_list(R, cached_addictions)) + var/datum/reagent/new_reagent = new R.type() + cached_addictions.Add(new_reagent) + if(R.overdosed) + need_mob_update += R.overdose_process(C) + if(is_type_in_list(R,cached_addictions)) + for(var/addiction in cached_addictions) + var/datum/reagent/A = addiction + if(istype(R, A)) + A.addiction_stage = -15 // you're satisfied for a good while. + need_mob_update += R.on_mob_life(C) + + if(can_overdose) + if(addiction_tick == 6) + addiction_tick = 1 + for(var/addiction in cached_addictions) + var/datum/reagent/R = addiction + if(C && R) + R.addiction_stage++ + if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end) + need_mob_update += R.addiction_act_stage1(C) + else if(R.addiction_stage1_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end) + need_mob_update += R.addiction_act_stage2(C) + else if(R.addiction_stage2_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end) + need_mob_update += R.addiction_act_stage3(C) + else if(R.addiction_stage3_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end) + need_mob_update += R.addiction_act_stage4(C) + else if(R.addiction_stage4_end <= R.addiction_stage) + to_chat(C, "You feel like you've gotten over your need for [R.name].") + SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.id]_addiction") + cached_addictions.Remove(R) + addiction_tick++ + if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. + C.updatehealth() + C.update_canmove() + C.update_stamina() + update_total() + + +/datum/reagents/proc/set_reacting(react = TRUE) + if(react) + reagents_holder_flags &= ~(REAGENT_NOREACT) + else + reagents_holder_flags |= REAGENT_NOREACT + +/datum/reagents/proc/conditional_update_move(atom/A, Running = 0) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + R.on_move (A, Running) + update_total() + +/datum/reagents/proc/conditional_update(atom/A) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + R.on_update (A) + update_total() + +/datum/reagents/process() + var/occured = handle_reactions(TRUE) + if(!occured) + return PROCESS_KILL + +/datum/reagents/proc/handle_reactions(fermi_chem_react = FALSE)//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar + return + if(reagents_holder_flags & REAGENT_NOREACT) + return //don't react + //cache things for performance + var/list/cached_reagents = reagent_list + var/list/cached_reactions = GLOB.chemical_reactions_list + var/datum/cached_my_atom = my_atom + var/reaction_occurred //if a reaction happened + var/list/fermichem_reacted //keeps track of fermichem reactions that already reacted to prevent it from being instant + do + var/list/possible_reactions + reaction_occurred = FALSE + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + for(var/reaction in cached_reactions[R.id]) + if(!reaction) + continue + var/datum/chemical_reaction/C = reaction + var/list/cached_required_reagents = C.required_reagents + var/list/cached_required_catalysts = C.required_catalysts + var/required_temp = C.required_temp + var/is_cold_recipe = C.is_cold_recipe + var/has_special_react = C.special_react + var/fail = FALSE + for(var/B in cached_required_reagents) + if(!has_reagent(B, cached_required_reagents[B])) + fail = TRUE + break + if(fail) + continue + for(var/B in cached_required_catalysts) + if(!has_reagent(B, cached_required_catalysts[B])) + fail = TRUE + break + if(fail) + continue + if(cached_my_atom) + if(C.required_container && C.required_container != cached_my_atom.type) + continue + if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs + continue + if(C.required_other) //Checks for other things required + if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem + var/obj/item/slime_extract/M = cached_my_atom + if(M.Uses <= 0) // added a limit to slime cores -- Muskets requested this + continue + else + if(C.required_container || C.required_other) + continue + if(required_temp && (is_cold_recipe? (chem_temp > required_temp) : (chem_temp < required_temp))) + continue + if(has_special_react && !C.check_special_react(src)) + continue + if(C.FermiChem) //fermichem checks + if(chem_temp < C.OptimalTempMin) //too low temperature + continue + if(LAZYACCESS(fermichem_reacted, C)) //fermichems don't keep reacting instantly + continue + START_PROCESSING(SSchemistry, src) //start processing + if(!fermi_chem_react) //only react fermichems on process icks + continue + LAZYADD(possible_reactions, C) + if(length(possible_reactions)) //does list exist? + var/datum/chemical_reaction/selected_reaction = possible_reactions[1] + for(var/I in possible_reactions) + var/datum/chemical_reaction/competitor = I + if(selected_reaction.is_cold_recipe? competitor.required_temp < selected_reaction.required_temp : competitor.required_temp > selected_reaction.required_temp) + selected_reaction = competitor + var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list + var/list/cached_results = selected_reaction.results//resultant chemical list + var/special_react_result = selected_reaction.special_react + //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. + //FermiChem relies on two additional properties; pH and impurity + //Temperature plays into a larger role too. + //BRANCH HERE + var/multiplier = INFINITY //the multiplier of the stnadard "1 reaction" we managed to do this cycle + if(!selected_reaction.FermiChem) //it's a normal ss13 chem reaction, instant reactions. + for(var/B in cached_required_reagents) + multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) //cap by the multiplier of the required you can get out of this + //remove reactants + for(var/B in cached_required_reagents) + remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = TRUE) + //add products + for(var/P in cached_results) + multiplier = max(multiplier, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P] * multiplier, P) + add_reagent(P, cached_results[P]*multiplier, null, chem_temp) + else //FermiiiCheeeem! + //FERMICHEM BEGIN + //--CHECKS + message_admins("FermiChem Proc'd") + var/target_volume = 0 + for(var/result_id in cached_results) + target_volume += multiplier * cached_results[result_id] + message_admins("FermiChem target volume: [target_volume]") + //--PROCESS + message_admins("FermiChem processing started") + //--REACTION + //set up fermichem variables + var/deltaT = 0 + var/deltapH = 0 + var/stepChemAmount = 0 + var/purity = 1 + //For now, purity is handled elsewhere + //check extremes first + if(chem_temp > selected_reaction.ExplodeTemp) + FermiExplode(selected_reaction) + else if(!ISINRANGE(pH, 0, 14)) + //Create chemical sludge eventually(for now just destroy the beaker I guess?) + //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) + FermiExplode() + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < selected_reaction.OptimalTempMax && chem_temp >= selected_reaction.OptimalTempMin) + deltaT = (((selected_reaction.OptimalTempMin - chem_temp)**selected_reaction.CurveSharpT)/((selected_reaction.OptimalTempMax - selected_reaction.OptimalTempMin)**selected_reaction.CurveSharpT)) + else if (chem_temp >= selected_reaction.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + message_admins("calculating temperature factor, min: [selected_reaction.OptimalTempMin], max: [selected_reaction.OptimalTempMax], Exponential: [selected_reaction.CurveSharpT], deltaT: [deltaT]") + //Calculate DeltapH (Deviation of pH from optimal) + //Lower range + if (pH < selected_reaction.OptimalpHMin) + if (pH < (selected_reaction.OptimalpHMin - selected_reaction.ReactpHLim)) + deltapH = 0 + else + deltapH = (((pH - (selected_reaction.OptimalpHMin - selected_reaction.ReactpHLim))**selected_reaction.CurveSharppH)/(selected_reaction.ReactpHLim**selected_reaction.CurveSharppH)) + //Upper range + else if (pH > selected_reaction.OptimalpHMin) + if (pH > (selected_reaction.OptimalpHMin + selected_reaction.ReactpHLim)) + deltapH = 0 + else + deltapH = ((selected_reaction.ReactpHLim -(pH - (selected_reaction.OptimalpHMax + selected_reaction.ReactpHLim))+selected_reaction.ReactpHLim)/(selected_reaction.ReactpHLim**selected_reaction.CurveSharppH)) + //Within mid range + else if (pH >= selected_reaction.OptimalpHMin && pH <= selected_reaction.OptimalpHMax) + deltapH = 1 + //This should never proc: + else + message_admins("Fermichem's pH broke!! Please let Fermis know!!") + WARNING("[my_atom] attempted to determine FermiChem pH for '[selected_reaction.id]' which broke for some reason! ([usr])") + //TODO Add CatalystFact + message_admins("calculating pH factor(purity), pH: [pH], min: [selected_reaction.OptimalpHMin]-[selected_reaction.ReactpHLim], max: [selected_reaction.OptimalpHMax]+[selected_reaction.ReactpHLim], deltapH: [deltapH]") + stepChemAmount = target_volume * deltaT + if (stepChemAmount > selected_reaction.RateUpLim) + stepChemAmount = selected_reaction.RateUpLim + else if (stepChemAmount <= 0.01) + message_admins("stepChem underflow [stepChemAmount]") + stepChemAmount = 0.02 + purity = deltapH + message_admins("cached_results: [cached_results], stepChemAmount [stepChemAmount]") + if(stepChemAmount > multiplier) //too much + message_admins("stepChemAmount was over multiplier for some reason..?") + for(var/B in cached_required_reagents) + message_admins("cached_required_reagents(B): [cached_required_reagents[B]], base stepChemAmount [stepChemAmount]") + remove_reagent(B, (stepChemAmount * cached_required_reagents[B]), safety = TRUE)//safety? removes reagents from beaker using remove function. + + for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? + //reactedVol = max(reactedVol, 1) //this shouldnt happen ... + SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmount, P)//log + add_reagent(P, cached_results[P] * stepChemAmount, null, chem_temp)//add reagent function!! I THINK I can do this: + message_admins("purity: [purity], purity of beaker") + message_admins("Temp before change: [chem_temp], pH after change: [pH]") + //Apply pH changes and thermal output of reaction to beaker + chem_temp += (selected_reaction.ThermicConstant * stepChemAmount) + pH += (selected_reaction.HIonRelease * stepChemAmount) + message_admins("Temp after change: [chem_temp], pH after change: [pH]") + SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", multiplier, selected_reaction.id)//log + //ensure the same thing doesn't happen in the same tick + LAZYSET(fermichem_reacted, selected_reaction, TRUE) + //FERMICHEM END + //reaction is done, do the effects. + var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers + var/iconhtml = icon2html(cached_my_atom, seen) + if(cached_my_atom) + if(!ismob(cached_my_atom)) // No bubbling mobs + if(selected_reaction.mix_sound) + playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) + + for(var/mob/M in seen) + to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + + if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. + var/obj/item/slime_extract/ME2 = my_atom + ME2.Uses-- + if(ME2.Uses <= 0) // give the notification that the slime core is dead + for(var/mob/M in seen) + to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") + ME2.name = "used slime extract" + ME2.desc = "This extract has been used up." + selected_reaction.on_reaction(src, multiplier, special_react_result) + reaction_occurred = TRUE + while(reaction_occurred) + update_total() + return reaction_occurred + +/datum/reagents/proc/isolate_reagent(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if(R.id != reagent) + del_reagent(R.id) + update_total() + +/datum/reagents/proc/del_reagent(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if(R.id == reagent) + if(my_atom && isliving(my_atom)) + var/mob/living/M = my_atom + R.on_mob_delete(M) + qdel(R) + reagent_list -= R + update_total() + if(my_atom) + my_atom.on_reagent_change(DEL_REAGENT) + return 1 + +/datum/reagents/proc/update_total() + var/list/cached_reagents = reagent_list + total_volume = 0 + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.volume < 0.1) + del_reagent(R.id) + else + total_volume += R.volume + + return 0 + +/datum/reagents/proc/clear_reagents() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + del_reagent(R.id) + return 0 + +/datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1) + var/react_type + if(isliving(A)) + react_type = "LIVING" + if(method == INGEST) + var/mob/living/L = A + L.taste(src) + else if(isturf(A)) + react_type = "TURF" + else if(isobj(A)) + react_type = "OBJ" + else + return + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + switch(react_type) + if("LIVING") + var/touch_protection = 0 + if(method == VAPOR) + var/mob/living/L = A + touch_protection = L.get_permeability_protection() + R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection) + if("TURF") + R.reaction_turf(A, R.volume * volume_modifier, show_message) + if("OBJ") + R.reaction_obj(A, R.volume * volume_modifier, show_message) + +/datum/reagents/proc/holder_full() + if(total_volume >= maximum_volume) + return TRUE + return FALSE + +//Returns the average specific heat for all reagents currently in this holder. +/datum/reagents/proc/specific_heat() + . = 0 + var/cached_amount = total_volume //cache amount + var/list/cached_reagents = reagent_list //cache reagents + for(var/I in cached_reagents) + var/datum/reagent/R = I + . += R.specific_heat * (R.volume / cached_amount) + +/datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) + var/S = specific_heat() + chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) + +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, pH = 7, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ + if(!isnum(amount) || !amount) + return FALSE + + if(amount <= 0) + return FALSE + + var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] + if(!D) + WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") + return FALSE + + update_total() + var/cached_total = total_volume + if(cached_total + amount > maximum_volume) + amount = (maximum_volume - cached_total) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. + if(amount <= 0) + return FALSE + var/new_total = cached_total + amount + var/cached_temp = chem_temp + var/list/cached_reagents = reagent_list + + //Equalize temperature - Not using specific_heat() because the new chemical isn't in yet. + var/specific_heat = 0 + var/thermal_energy = 0 + for(var/i in cached_reagents) + var/datum/reagent/R = i + specific_heat += R.specific_heat * (R.volume / new_total) + thermal_energy += R.specific_heat * R.volume * cached_temp + specific_heat += D.specific_heat * (amount / new_total) + thermal_energy += D.specific_heat * amount * reagtemp + chem_temp = thermal_energy / (specific_heat * new_total) + //// + + //add the reagent to the existing if it exists + for(var/A in cached_reagents) + var/datum/reagent/R = A + if (R.id == reagent) + R.volume += amount + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + R.on_merge(data, amount) + if(!no_react) + handle_reactions() + return TRUE + + //otherwise make a new one + var/datum/reagent/R = new D.type(data) + cached_reagents += R + R.holder = src + R.volume = amount + R.loc = get_turf(my_atom) + if(data) + R.data = data + R.on_new(data) + + + if(isliving(my_atom)) + R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + if(!no_react) + handle_reactions() + return TRUE + +/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) + for(var/r_id in list_reagents) + var/amt = list_reagents[r_id] + add_reagent(r_id, amt, data) + +/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to + + if(isnull(amount)) + amount = 0 + CRASH("null amount passed to reagent code") + return FALSE + + if(!isnum(amount)) + return FALSE + + if(amount < 0) + return FALSE + + var/list/cached_reagents = reagent_list + + for(var/A in cached_reagents) + var/datum/reagent/R = A + if (R.id == reagent) + //clamp the removal amount to be between current reagent amount + //and zero, to prevent removing more than the holder has stored + amount = CLAMP(amount, 0, R.volume) + R.volume -= amount + update_total() + if(!safety)//So it does not handle reactions when it need not to + handle_reactions() + if(my_atom) + my_atom.on_reagent_change(REM_REAGENT) + return TRUE + + return FALSE + +/datum/reagents/proc/has_reagent(reagent, amount = -1) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if (R.id == reagent) + if(!amount) + return R + else + if(R.volume >= amount) + return R + else + return 0 + + return 0 + +/datum/reagents/proc/get_reagent_amount(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if (R.id == reagent) + return R.volume + + return 0 + +/datum/reagents/proc/get_reagents() + var/list/names = list() + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + names += R.name + + return jointext(names, ",") + +/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. + if(!isnum(amount)) + return 1 + var/list/cached_reagents = reagent_list + var/has_removed_reagent = 0 + + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + var/matches = 0 + // Switch between how we check the reagent type + if(strict) + if(R.type == reagent_type) + matches = 1 + else + if(istype(R, reagent_type)) + matches = 1 + // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. + if(matches) + // Have our other proc handle removement + has_removed_reagent = remove_reagent(R.id, amount, safety) + + return has_removed_reagent + +//two helper functions to preserve data across reactions (needed for xenoarch) +/datum/reagents/proc/get_data(reagent_id) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.id == reagent_id) + return R.data + +/datum/reagents/proc/set_data(reagent_id, new_data) + var/list/cached_reagents = reagent_list + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + if(R.id == reagent_id) + R.data = new_data + +/datum/reagents/proc/copy_data(datum/reagent/current_reagent) + if(!current_reagent || !current_reagent.data) + return null + if(!istype(current_reagent.data, /list)) + return current_reagent.data + + var/list/trans_data = current_reagent.data.Copy() + + // We do this so that introducing a virus to a blood sample + // doesn't automagically infect all other blood samples from + // the same donor. + // + // Technically we should probably copy all data lists, but + // that could possibly eat up a lot of memory needlessly + // if most data lists are read-only. + if(trans_data["viruses"]) + var/list/v = trans_data["viruses"] + trans_data["viruses"] = v.Copy() + + return trans_data + +/datum/reagents/proc/get_reagent(type) + var/list/cached_reagents = reagent_list + . = locate(type) in cached_reagents + +/datum/reagents/proc/generate_taste_message(minimum_percent=15) + // the lower the minimum percent, the more sensitive the message is. + var/list/out = list() + var/list/tastes = list() //descriptor = strength + if(minimum_percent <= 100) + for(var/datum/reagent/R in reagent_list) + if(!R.taste_mult) + continue + + if(istype(R, /datum/reagent/consumable/nutriment)) + var/list/taste_data = R.data + for(var/taste in taste_data) + var/ratio = taste_data[taste] + var/amount = ratio * R.taste_mult * R.volume + if(taste in tastes) + tastes[taste] += amount + else + tastes[taste] = amount + else + var/taste_desc = R.taste_description + var/taste_amount = R.volume * R.taste_mult + if(taste_desc in tastes) + tastes[taste_desc] += taste_amount + else + tastes[taste_desc] = taste_amount + //deal with percentages + // TODO it would be great if we could sort these from strong to weak + var/total_taste = counterlist_sum(tastes) + if(total_taste > 0) + for(var/taste_desc in tastes) + var/percent = tastes[taste_desc]/total_taste * 100 + if(percent < minimum_percent) + continue + var/intensity_desc = "a hint of" + if(percent > minimum_percent * 2 || percent == 100) + intensity_desc = "" + else if(percent > minimum_percent * 3) + intensity_desc = "the strong flavor of" + if(intensity_desc != "") + out += "[intensity_desc] [taste_desc]" + else + out += "[taste_desc]" + + return english_list(out, "something indescribable") + +/datum/reagents/proc/expose_temperature(var/temperature, var/coeff=0.02) + var/temp_delta = (temperature - chem_temp) * coeff + if(temp_delta > 0) + chem_temp = min(chem_temp + max(temp_delta, 1), temperature) + else + chem_temp = max(chem_temp + min(temp_delta, -1), temperature) + chem_temp = round(chem_temp) + handle_reactions() + +/////////////////////////////////////////////////////////////////////////////////// + + +// Convenience proc to create a reagents holder for an atom +// Max vol is maximum volume of holder +/atom/proc/create_reagents(max_vol) + if(reagents) + qdel(reagents) + reagents = new/datum/reagents(max_vol) + reagents.my_atom = src + +/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents + var/static/list/random_reagents = list() + if(!random_reagents.len) + for(var/thing in subtypesof(/datum/reagent)) + var/datum/reagent/R = thing + if(initial(R.can_synth)) + random_reagents += initial(R.id) + var/picked_reagent = pick(random_reagents) + return picked_reagent diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index b2b565b603..87d57f6452 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -15,7 +15,7 @@ fluid_id = "milk" var/amount = 2 producing = TRUE - shape = "pair" + shape = "Pair" can_masturbate_with = TRUE masturbation_verb = "massage" can_climax = TRUE diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index aad06f8cdb..8923d196c2 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -263,10 +263,9 @@ return update_genitals() -/mob/living/carbon/human/proc/update_genitals(mob/living/carbon/human/H) +/mob/living/carbon/human/proc/update_genitals() if(src && !QDELETED(src)) dna.species.handle_genitals(src) - H.update_body() /mob/living/carbon/human/proc/Force_update_genitals(mob/living/carbon/human/H) dna.species.handle_genitals(src) @@ -369,7 +368,7 @@ //if(!S || S.icon_state == "none") //return - + for(var/layer in relevant_layers) var/layertext = genitals_layertext(layer) S = GLOB.breasts_shapes_list[B.shape] From 76aec5a5ed4ec3408e7f82453ebac37912eb4518 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 14 May 2019 16:51:03 +0100 Subject: [PATCH 110/608] Holder fixes --- code/modules/reagents/chemistry/holder.dm | 87 +++++++++++-------- .../chemistry/reagents/fermi_reagents.dm | 32 +++++++ .../reagents/chemistry/recipes/fermi.dm | 1 + 3 files changed, 86 insertions(+), 34 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 9eec115250..6ef2ade8fe 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -127,6 +127,7 @@ update_total() handle_reactions() + //pH = REAGENT_NORMAL_PH Maybe unnessicary? return amount /datum/reagents/proc/get_master_reagent_name() @@ -431,6 +432,8 @@ else FermiExplode() //explode function!! + + TODO: make plastic beakers melt at 447 kalvin, all others at ~850 and meta-material never break. */ if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! @@ -658,10 +661,10 @@ stepChemAmmount = targetVol - reactedVol message_admins("target volume reached. Reaction should stop after this loop. stepChemAmmount: [stepChemAmmount] + reactedVol: [reactedVol] = targetVol [targetVol]") - if (reactedVol > 0) - purity = ((purity * reactedVol) + (deltapH * stepChemAmmount)) /((reactedVol+ stepChemAmmount)) //This should add the purity to the product - else - purity = deltapH + //if (reactedVol > 0) + // purity = ((purity * reactedVol) + (deltapH * stepChemAmmount)) /((reactedVol+ stepChemAmmount)) //This should add the purity to the product + //else + purity = deltapH//set purity equal to pH offset // End. /* @@ -679,7 +682,7 @@ for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? //reactedVol = max(reactedVol, 1) //this shouldnt happen ... SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: + add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp, purity)//add reagent function!! I THINK I can do this: message_admins("purity: [purity], purity of beaker") message_admins("Temp before change: [chem_temp], pH after change: [pH]") @@ -786,7 +789,7 @@ var/S = specific_heat() chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, pH = 7, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, other_purity = 1, other_pH, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ if(!isnum(amount) || !amount) return FALSE @@ -798,6 +801,9 @@ WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") return FALSE + if(!pH) + other_pH = D.pH + update_total() var/cached_total = total_volume if(cached_total + amount > maximum_volume) @@ -807,6 +813,7 @@ var/new_total = cached_total + amount var/cached_temp = chem_temp var/list/cached_reagents = reagent_list + var/cached_pH = pH //Equalize temperature - Not using specific_heat() because the new chemical isn't in yet. var/specific_heat = 0 @@ -820,38 +827,49 @@ chem_temp = thermal_energy / (specific_heat * new_total) //// + pH = round(-log(10, ((cached_total * (10^(-cached_pH))) + (amount * (10^(-other_pH)))) / new_total), REAGENT_PH_ACCURACY) //add the reagent to the existing if it exists - for(var/A in cached_reagents) - var/datum/reagent/R = A - if (R.id == reagent) - R.volume += amount - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - R.on_merge(data, amount) - if(!no_react) - handle_reactions() - return TRUE + if(cached_reagents[reagent]) //if it's already in us, merge + var/datum/reagent/R = cached_reagents[reagent] - //otherwise make a new one - var/datum/reagent/R = new D.type(data) - cached_reagents += R - R.holder = src - R.volume = amount - R.loc = get_turf(my_atom) - if(data) - R.data = data - R.on_new(data) + WIP_TAG //check my maths for purity calculations + //Add amount and equalize purity + var/our_pure_moles = R.volume * R.purity + var/their_pure_moles = amount * other_purity + R.volume += amount + //R.purity = (our_pure_moles + their_pure_moles) / (R.volume) + R.purity = ((R.purity * R.volume) + (other_purity * amount)) /((R.volume + amount)) //This should add the purity to the product + //// + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + R.on_merge(data, amount) + if(!no_react) + start_reacting() + return TRUE + + else + var/datum/reagent/R = new D.type(data) + cached_reagents[R.id] = R + R.holder = src + R.volume = amount + R.purity = other_purity + if(data) + R.data = data + R.on_new(data) + + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + if(!no_react) + start_reacting() + if(isliving(my_atom)) + R.on_mob_add(my_atom) + return TRUE + + return FALSE - if(isliving(my_atom)) - R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - if(!no_react) - handle_reactions() - return TRUE /datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) for(var/r_id in list_reagents) @@ -879,6 +897,7 @@ //clamp the removal amount to be between current reagent amount //and zero, to prevent removing more than the holder has stored amount = CLAMP(amount, 0, R.volume) + pH = ((pH * volume)-(R.pH * amount))/(volume - amount) R.volume -= amount update_total() if(!safety)//So it does not handle reactions when it need not to diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 6a42fc973b..8c4f16aa09 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -17,6 +17,24 @@ //holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism //return ..() +//This should process fermichems to find out how pure they are and what effect to do. +//TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE +/datum/reagent/fermi/on_mob_add(mob/living/carbon/M) + if (src.purity == 1) + return + if (CR.InverseChemVal > src.purity) + holder.remove_reagent(src.id, volume, FALSE) + holder.add_reagent(CR.InverseChem) + return + else + var/pureVol = volume * purity + var/impureVol = volume * (1 - pureVol) + holder.remove_reagent(src.id, (volume*impureVol), FALSE) + holder.add_reagent(CR.ImpureChem, impureVol, FALSE) + + + + ///datum/reagent/fermi/overdose_start(mob/living/carbon/M) //current_cycle++ @@ -776,6 +794,20 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/creatorName var/mob/living/creator +/datum/reagent/fermi/enthrall/on_new() + message_admins("On new for enthral proc'd") + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + //var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list + if (B.["gender"] == "female") + creatorGender = "Mistress" + else + creatorGender = "Master" + creatorName = B.["real_name"] + creatorID = B.["ckey"] + var/mob/living/creatore = holder + creator = creatore + message_admins("name: [creatorName], ID: [creatorID], gender: [creatorGender], creator:[creator]") + /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) ..() if(!creatorID) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index d8b80a9c91..2f890244b7 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -125,6 +125,7 @@ /datum/chemical_reaction/enthral/on_reaction(datum/reagents/holder) + message_admins("On reaction for enthral proc'd") var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list if (B.["gender"] == "female") From 0d907db516a2180268778c7c213c351132348c6c Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 14 May 2019 21:20:38 +0100 Subject: [PATCH 111/608] Almost done. Just need to update reagent vars. --- code/modules/reagents/chemistry/holder.dm | 12 ++-- code/modules/reagents/chemistry/reagents.dm | 3 +- .../chemistry/reagents/fermi_reagents.dm | 15 ++-- .../reagents/chemistry/recipes/fermi.dm | 7 -- .../objects}/fermiclothes.dm | 0 .../code/modules/reagents/objects/items.dm | 67 ++++++++++++++++++ modular_citadel/icons/obj/FermiChem.dmi | Bin 0 -> 814 bytes tgstation.dme | 3 +- 8 files changed, 86 insertions(+), 21 deletions(-) rename modular_citadel/code/modules/{clothing/fermichemclothe => reagents/objects}/fermiclothes.dm (100%) create mode 100644 modular_citadel/code/modules/reagents/objects/items.dm create mode 100644 modular_citadel/icons/obj/FermiChem.dmi diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6ef2ade8fe..e58225068c 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -832,10 +832,10 @@ if(cached_reagents[reagent]) //if it's already in us, merge var/datum/reagent/R = cached_reagents[reagent] - WIP_TAG //check my maths for purity calculations + //WIP_TAG //check my maths for purity calculations //Add amount and equalize purity - var/our_pure_moles = R.volume * R.purity - var/their_pure_moles = amount * other_purity + //var/our_pure_moles = R.volume * R.purity + //var/their_pure_moles = amount * other_purity R.volume += amount //R.purity = (our_pure_moles + their_pure_moles) / (R.volume) R.purity = ((R.purity * R.volume) + (other_purity * amount)) /((R.volume + amount)) //This should add the purity to the product @@ -846,7 +846,7 @@ my_atom.on_reagent_change(ADD_REAGENT) R.on_merge(data, amount) if(!no_react) - start_reacting() + handle_reactions() return TRUE else @@ -863,7 +863,7 @@ if(my_atom) my_atom.on_reagent_change(ADD_REAGENT) if(!no_react) - start_reacting() + handle_reactions() if(isliving(my_atom)) R.on_mob_add(my_atom) return TRUE @@ -897,7 +897,7 @@ //clamp the removal amount to be between current reagent amount //and zero, to prevent removing more than the holder has stored amount = CLAMP(amount, 0, R.volume) - pH = ((pH * volume)-(R.pH * amount))/(volume - amount) + pH = ((pH * total_volume)-(R.pH * amount))/(total_volume - amount) R.volume -= amount update_total() if(!safety)//So it does not handle reactions when it need not to diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 4a3579bf07..d95a18dc3e 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -36,7 +36,8 @@ //Fermichem vars: var/purity = 1 var/impureChem = "toxin" - var/loc = null + //var/loc = null + var/pH /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 8c4f16aa09..43aac65143 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -8,9 +8,12 @@ //Naninte chem /datum/reagent/fermi - name = "Fermi" - id = "fermi" - taste_description = "If affection had a taste, this would be it." + name = "Fermi" //Why did I putthis here? + id = "fermi" //It's meeee + taste_description = "If affection had a taste, this would be it." + var/ImpureChem = "toxin" // What chemical is metabolised with an inpure reaction + var/InverseChemVal = 0 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising + var/InverseChem = "Initropidril" // What chem is metabolised when purity is below InverseChemVal ///datum/reagent/fermi/on_mob_life(mob/living/carbon/M) //current_cycle++ @@ -22,15 +25,15 @@ /datum/reagent/fermi/on_mob_add(mob/living/carbon/M) if (src.purity == 1) return - if (CR.InverseChemVal > src.purity) + else if (src.InverseChemVal > src.purity) holder.remove_reagent(src.id, volume, FALSE) - holder.add_reagent(CR.InverseChem) + holder.add_reagent(src.InverseChem) return else var/pureVol = volume * purity var/impureVol = volume * (1 - pureVol) holder.remove_reagent(src.id, (volume*impureVol), FALSE) - holder.add_reagent(CR.ImpureChem, impureVol, FALSE) + holder.add_reagent(src.ImpureChem, impureVol, FALSE) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 2f890244b7..ff78aea252 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -21,7 +21,6 @@ RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way - ImpureChem = "toxin" //What chemical is produced with an inpure reaction /datum/chemical_reaction/eigenstate/on_reaction(datum/reagents/holder) var/location = get_turf(holder.my_atom) @@ -50,9 +49,6 @@ RateUpLim = 5 // Optimal/max rate possible if all conditions are perfect FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE // If the chemical explodes in a special way - ImpureChem = "SDGFTox" // What chemical is metabolised with an inpure reaction - InverseChemVal = 0.5 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising - InverseChem = "SDZF" // What chem is metabolised when purity is below InverseChemVal /datum/chemical_reaction/BElarger name = "" @@ -119,9 +115,6 @@ RateUpLim = 5 // Optimal/max rate possible if all conditions are perfect FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE // If the chemical explodes in a special way - //ImpureChem = "SDGFTox" // What chemical is metabolised with an inpure reaction - //InverseChemVal = 0.5 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising - //InverseChem = "SDZF" // What chem is metabolised when purity is below InverseChemVal /datum/chemical_reaction/enthral/on_reaction(datum/reagents/holder) diff --git a/modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm b/modular_citadel/code/modules/reagents/objects/fermiclothes.dm similarity index 100% rename from modular_citadel/code/modules/clothing/fermichemclothe/fermiclothes.dm rename to modular_citadel/code/modules/reagents/objects/fermiclothes.dm diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm new file mode 100644 index 0000000000..3dd4c41029 --- /dev/null +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -0,0 +1,67 @@ +/obj/item/pHbooklet + name = "pH indicator booklet" + desc = "A piece of paper that will change colour depending on the pH of what it's added to." + icon_state = "pHbooklet" + icon = 'modular_citadel/icons/obj/FermiChem.dmi' + item_flags = NOBLUDGEON + var/numberOfPages = 100 + +/obj/item/pHbooklet/attack_hand(mob/user) + if(numberOfPages >= 1) + var/obj/item/pHpaper/P = new /obj/item/pHpaper + //P.add_fingerprint(user) + P.forceMove(user.loc) + user.put_in_hands(P) + to_chat(user, "You take [P] out of \the [src].") + numberOfPages-- + else + to_chat(user, "[src] is empty!") + add_fingerprint(user) + return ..() + +/obj/item/pHpaper + name = "pH indicator strip" + desc = "A piece of paper that will change colour depending on the pH of a solution." + icon_state = "pHpaper" + icon = 'modular_citadel/icons/obj/FermiChem.dmi' + item_flags = NOBLUDGEON + color = "#f5c352" + var/used = FALSE + +/obj/item/pHpaper/attack_hand(mob/user, obj/I) + if(!I.reagents.pH) + return + if(used == TRUE) + to_chat(user, "[src] has already been used!") + return + switch(I.reagents.pH) + if(14 to INFINITY) + src.color = "#462c83" + if(13 to 14) + src.color = "#63459b" + if(12 to 13) + src.color = "#5a51a2" + if(11 to 12) + src.color = "#3853a4" + if(10 to 11) + src.color = "#3f93cf" + if(9 to 10) + src.color = "#0bb9b7" + if(8 to 9) + src.color = "#23b36e" + if(7 to 8) + src.color = "#3aa651" + if(6 to 7) + src.color = "#4cb849" + if(5 to 6) + src.color = "#b5d335" + if(4 to 5) + src.color = "#b5d333" + if(3 to 4) + src.color = "#f7ec1e" + if(2 to 3) + src.color = "#fbc314" + if(1 to 2) + src.color = "#f26724" + if(0 to 1) + src.color = "#ef1d26" diff --git a/modular_citadel/icons/obj/FermiChem.dmi b/modular_citadel/icons/obj/FermiChem.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ffc50d28992e145f5b59292d302c6a2bddb70331 GIT binary patch literal 814 zcmV+}1JV46P)LoV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6# za*U0*I5Sc+(=$pSoZ^zil2jm5$s@qWIW@PSq*95CGbOXA7$|1Q#hF%=n41b=!&Me| zB<1I4=cJYpp|T*cAhigWI%Ne{KNqlL0k*F*70wH!{Qv*~_(?=TR9J=8*Ntw1Fcbyg z0+s@!4u&|Wy#I6V-WEz*paL~!9uqXU^YsU1k&ur|G{y5bv5c?m2jT>?1`r<*&$(cZ z0x&G4i9C3KNk}0saG@-t7n(5|-vzlvTR@sea|0S9R?J)NwJq8k}FR739Yi zo&d6rWAlph8Uaganq~>W$?@$Zk=1E%5Nca!ZtcDN)lo0YdwXjv0IJwr5hP$-MwJ;r z!D!+$EW-u5uInN2G+qS*0KsUE6i&zlpabO&t7;ESKns;2a2tRQ4m@w71&{)W%3MZO z^Ez<=`zqLg6wGD7F)4Ol1ue{zQ2lfUKyY$z9RNO0#zvTZ_#C0&1p79Cf?kH%C!%jw z(+c853borOqRRw4%rHFBEdVtMw+}!sdXY26s0_Tw;Y7azjLXpb?*LQ{PdxxpHyyG8 zFc~j^gnLH7*FcEJBd25X{2`#f0jxx9WN-if#QQ&g9}p-+!w^J3e+VKJfW$du>W{|p zz6qQm>^>521{VEb;NTuaFJD3E76xC$kDGuCynhE?Jb~kV7dY6LKO#aVAcdel5 Date: Wed, 15 May 2019 05:27:09 +0100 Subject: [PATCH 112/608] Gearing up for PR --- code/modules/reagents/chemistry/holder.dm | 90 +++-- code/modules/reagents/chemistry/reagents.dm | 2 +- code/modules/reagents/reagent_containers.dm | 45 ++- .../code/datums/mood_events/chem_events.dm | 4 +- .../code/datums/status_effects/chems.dm | 9 +- .../code/modules/arousal/organs/genitals.dm | 6 +- .../chemistry/reagents/fermi_reagents.dm | 350 ++++++++++++------ .../code/modules/reagents/objects/items.dm | 77 ++-- 8 files changed, 377 insertions(+), 206 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index e58225068c..6466ac8b61 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -48,7 +48,7 @@ var/maximum_volume = 100 var/atom/my_atom = null var/chem_temp = 150 - var/pH = REAGENT_NORMAL_PH + var/pH = REAGENT_NORMAL_PH//This is definately 7, right? var/last_tick = 1 var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() @@ -545,6 +545,7 @@ var/list/cached_required_reagents = C.required_reagents//update reagents list var/list/cached_results = C.results//resultant chemical list var/multiplier = INFINITY + var/special_react_result = C.check_special_react(src) message_admins("updating targetVol from [targetVol]") for(var/B in cached_required_reagents) // @@ -557,6 +558,8 @@ targetVol = 0 handle_reactions() update_total() + + C.on_reaction(src, multiplier, special_react_result) return for(var/P in cached_results) targetVol = cached_results[P]*multiplier @@ -578,6 +581,7 @@ targetVol = 0 handle_reactions() update_total() + C.on_reaction(src, multiplier, special_react_result) return else STOP_PROCESSING(SSprocessing, src) @@ -587,6 +591,7 @@ targetVol = 0 handle_reactions() update_total() + C.on_reaction(src, multiplier, special_react_result) return //handle_reactions() @@ -827,48 +832,54 @@ chem_temp = thermal_energy / (specific_heat * new_total) //// - pH = round(-log(10, ((cached_total * (10^(-cached_pH))) + (amount * (10^(-other_pH)))) / new_total), REAGENT_PH_ACCURACY) + //pH = round(-log(10, ((cached_total * (10^(-cached_pH))) + (amount * (10^(-other_pH)))) / new_total), REAGENT_PH_ACCURACY) I think this is wrong? I'm getting negative numbers? + pH = ((cached_pH * cached_total)+(D.pH * amount))/(cached_total + amount)//should be right //add the reagent to the existing if it exists - if(cached_reagents[reagent]) //if it's already in us, merge - var/datum/reagent/R = cached_reagents[reagent] - //WIP_TAG //check my maths for purity calculations - //Add amount and equalize purity - //var/our_pure_moles = R.volume * R.purity - //var/their_pure_moles = amount * other_purity - R.volume += amount - //R.purity = (our_pure_moles + their_pure_moles) / (R.volume) - R.purity = ((R.purity * R.volume) + (other_purity * amount)) /((R.volume + amount)) //This should add the purity to the product - //// + for(var/A in cached_reagents) + var/datum/reagent/R = A + if (R.id == reagent) + //WIP_TAG //check my maths for purity calculations + //Add amount and equalize purity + R.volume += amount + //Maybe make a pH for reagents, not sure. it's hard to imagine where the H+ ions would go. I'm okay with this solution for now. + //R.purity = (our_pure_moles + their_pure_moles) / (R.volume) + R.purity = ((R.purity * R.volume) + (other_purity * amount)) /((R.volume + amount)) //This should add the purity to the product + //// - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - R.on_merge(data, amount) - if(!no_react) - handle_reactions() - return TRUE + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + R.on_merge(data, amount) + if(!no_react) + handle_reactions() + return TRUE - else - var/datum/reagent/R = new D.type(data) - cached_reagents[R.id] = R - R.holder = src - R.volume = amount - R.purity = other_purity - if(data) - R.data = data - R.on_new(data) - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - if(!no_react) - handle_reactions() - if(isliving(my_atom)) - R.on_mob_add(my_atom) - return TRUE + //otherwise make a new one + var/datum/reagent/R = new D.type(data) + cached_reagents += R + R.holder = src + R.volume = amount + R.purity = other_purity + R.loc = get_turf(my_atom) + if(data) + R.data = data + R.on_new(data) + if(istype(D, /datum/reagent/fermi))//Is this a fermichem? + var/datum/reagent/fermi/FermiTime = D //It's Fermi time! + FermiTime.fermiCreate(R.holder) //Seriously what is "data" ???? + //This is how I keep myself sane. - return FALSE + + update_total() + if(my_atom) + my_atom.on_reagent_change(ADD_REAGENT) + if(!no_react) + handle_reactions() + if(isliving(my_atom)) + R.on_mob_add(my_atom) + return TRUE /datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) @@ -896,8 +907,11 @@ if (R.id == reagent) //clamp the removal amount to be between current reagent amount //and zero, to prevent removing more than the holder has stored + if((total_volume - amount) == 0)//Because this can result in 0, I don't want it to crash. + pH = 7 + else + pH = ((pH * total_volume)-(R.pH * amount))/(total_volume - amount) amount = CLAMP(amount, 0, R.volume) - pH = ((pH * total_volume)-(R.pH * amount))/(total_volume - amount) R.volume -= amount update_total() if(!safety)//So it does not handle reactions when it need not to diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index d95a18dc3e..dd1bd31aaf 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -36,7 +36,7 @@ //Fermichem vars: var/purity = 1 var/impureChem = "toxin" - //var/loc = null + var/loc = null //Should be the creation location! var/pH /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 98c85b875f..03bbd6f6a8 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -45,6 +45,49 @@ if(user.a_intent == INTENT_HARM) return ..() +/obj/item/reagent_containers/attack(obj/item/W, mob/user, params) + ..() + if(!istype(W, /obj/item/pHpaper)) + return + var/obj/item/pHpaper/P = W + if(P.used == TRUE) + to_chat(user, "[src] has already been used!") + return + switch(src.reagents.pH) + if(14 to INFINITY) + P.color = "#462c83" + if(13 to 14) + P.color = "#63459b" + if(12 to 13) + P.color = "#5a51a2" + if(11 to 12) + P.color = "#3853a4" + if(10 to 11) + P.color = "#3f93cf" + if(9 to 10) + P.color = "#0bb9b7" + if(8 to 9) + P.color = "#23b36e" + if(7 to 8) + P.color = "#3aa651" + if(6 to 7) + P.color = "#4cb849" + if(5 to 6) + P.color = "#b5d335" + if(4 to 5) + P.color = "#b5d333" + if(3 to 4) + P.color = "#f7ec1e" + if(2 to 3) + P.color = "#fbc314" + if(1 to 2) + P.color = "#f26724" + if(-INFINITY to 1) + P.color = "#ef1d26" + P.used = TRUE + + + /obj/item/reagent_containers/proc/canconsume(mob/eater, mob/user) if(!iscarbon(eater)) return 0 @@ -127,4 +170,4 @@ ..() /obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - reagents.expose_temperature(exposed_temperature) \ No newline at end of file + reagents.expose_temperature(exposed_temperature) diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index e46bf023f7..e0e4622495 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -9,7 +9,7 @@ /datum/mood_event/enthrallpraise mood_change = 12 description = "I feel so happy! I'm a good pet who Master loves!\n" - timeout = 400 + timeout = 600 /datum/mood_event/enthrallscold mood_change = -12 @@ -30,4 +30,4 @@ /datum/mood_event/enthrallmissing4 mood_change = -25 - description = "You're all alone, It's so hard to continute without your Master...\n" + description = "I'm all alone, It's so hard to continute without Master...\n" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 9b71ebd457..2070e0dda0 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -207,9 +207,9 @@ to_chat(owner, "Your mind starts to restore some of it's clarity as you feel the effects of the drug wain.") if (mental_capacity <= 500 || phase == 4) if (owner.reagents.has_reagent("mannitol")) - mental_capacity += 1 + mental_capacity += 5 if (owner.reagents.has_reagent("neurine")) - mental_capacity += 2 + mental_capacity += 10 //mindshield check if(M.has_trait(TRAIT_MINDSHIELD)) @@ -409,13 +409,12 @@ //qdel(redirect_component2.resolve()) //redirect_component2 = null -/* + /datum/status_effect/chem/enthrall/mob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) - if(enthrallID.name in message || enthrallID.first_name in message) + if(master in message || master in message) return else . = ..() -*/ /datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) var/mob/living/carbon/C = owner diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 8923d196c2..7c6cc74392 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -269,8 +269,8 @@ /mob/living/carbon/human/proc/Force_update_genitals(mob/living/carbon/human/H) dna.species.handle_genitals(src) - dna.species.handle_breasts(src) - H.update_body() + //dna.species.handle_breasts(src) + //H.update_body() /datum/species/proc/handle_genitals(mob/living/carbon/human/H) message_admins("attempting to update sprite") @@ -351,6 +351,7 @@ for(var/L in relevant_layers) H.apply_overlay(L) +/* Behold the maddness I went through. /datum/species/proc/handle_breasts(mob/living/carbon/human/H) //check for breasts first! @@ -420,3 +421,4 @@ H.apply_overlay(L) H.update_icons() ///obj/item/organ/genital/breasts/update_icon(/obj/item/organ/genital) //Where did this come from? +*/ diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 43aac65143..511aec2b62 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -7,6 +7,8 @@ //And tips their hat //Naninte chem + + /datum/reagent/fermi name = "Fermi" //Why did I putthis here? id = "fermi" //It's meeee @@ -20,6 +22,9 @@ //holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism //return ..() +/datum/reagent/fermi/proc/fermiCreate(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? + return + //This should process fermichems to find out how pure they are and what effect to do. //TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE /datum/reagent/fermi/on_mob_add(mob/living/carbon/M) @@ -27,7 +32,7 @@ return else if (src.InverseChemVal > src.purity) holder.remove_reagent(src.id, volume, FALSE) - holder.add_reagent(src.InverseChem) + holder.add_reagent(src.InverseChem, volume, FALSE) return else var/pureVol = volume * purity @@ -41,14 +46,25 @@ ///datum/reagent/fermi/overdose_start(mob/living/carbon/M) //current_cycle++ -//eigenstate Chem -//Teleports you to chemistry and back -//OD teleports you randomly around the Station -//Addiction send you on a wild ride and replaces you with an alternative reality version of yourself. + //////////////////////////////////////////////////////////////////////////////////////////////////// // EIGENSTASIUM /////////////////////////////////////////////////////////////////////////////////////////////////// +//eigenstate Chem +//Teleports you to chemistry and back +//OD teleports you randomly around the Station +//Addiction send you on a wild ride and replaces you with an alternative reality version of yourself. +//During the process you get really hungry, then your items start teleporting randomly, +//then alternative versions of yourself are brought in from a different universe and they yell at you. +//and finally you yourself get teleported to an alternative universe, and character your playing is replaced with said alternative (this used to reroll objectives, but Kevin said prooobably not). +//Currently the creation loc doesn't work, so it teleports you back to where you took it. Which is fine too. +//Bugginess level: low - I can't get the remove all status effects and moodlets to work. Basically I'd like to reset the character to roundstart if possible. + +//Important factors to consider while balancing: +//1.It's... Fun. And thats mostly it. The teleport thing isn't that useful, since you have to be not stunned to take it. +//You could use it as an antag and OD someone, but you have to inject 20u, which is 5 more than a syringe, and it doesn't kill you. +//I'd like to make it reroll your objectives or expand upon the alternative version of you. /datum/reagent/fermi/eigenstate name = "Eigenstasium" @@ -105,7 +121,7 @@ to_chat(M, "Oh god, you feel like your wavefunction is about to tear.") M.Jitter(10) -/datum/reagent/fermi/eigenstate/overdose_process(mob/living/M) //Overdose, makes you teleport randomly +/datum/reagent/fermi/eigenstate/overdose_process(mob/living/M) //Overdose, makes you teleport randomly, probably one of my favourite effects. Sometimes kills you. do_sparks(5,FALSE,src) do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) @@ -210,6 +226,8 @@ //////////////////////////////////////////////////// // synthetic-derived growth factor // ////////////////////////////////////////////////// +other files that are relivant: +modular_citadel/code/datums/status_effects/chems.dm - SDGF WHAT IT DOES Several outcomes are possible (in priority order): @@ -349,7 +367,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //qdel(src) else if(src.playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!). - message_admins("Failed to find clone Candidate") + //message_admins("Failed to find clone Candidate") src.unitCheck = TRUE if(M.has_status_effect(/datum/status_effect/chem/SGDF)) // Heal the user if they went to all this trouble to make it and can't get a clone, the poor fellow. switch(current_cycle) @@ -387,7 +405,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) if(87 to INFINITY) - holder.remove_reagent(src.id, 1)//removes SGDF on completion. + holder.remove_reagent(src.id, 1000)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. message_admins("Purging SGDF [volume]") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") @@ -524,11 +542,28 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //////////////////////////////////////////////////////////////////////////////////////////////////// // BREAST ENLARGE /////////////////////////////////////////////////////////////////////////////////////////////////// +//Other files that are relivant: +//modular_citadel/code/datums/status_effects/chems.dm +//modular_citadel/code/modules/arousal/organs/breasts.dm //breast englargement //Honestly the most requested chems //I'm not a very kinky person, sorry if it's not great //I tried to make it interesting..!! + +//Normal function increases your breast size by 0.1, 1 unit = 1 cup. +//If you get stupid big, it presses against your clothes, causing brute and oxydamage. Then rips them off. +//If you keep going, it makes you slower, in speed and action. +//decreasing your size will return you to normal. +//(see the status effect in chem.dm) +//Need to add something that checks to see if the breasts are gone to remove negative debuffs, as well as improve how they're added instead of a flat +/- +//I think most of the layering stuff Works +//but by god does it make me mad, never again. +//Overdosing on (what is essentially space estrogen) makes you female, removes balls and shrinks your dick. +//OD is low for a reason. I'd like fermichems to have low ODs, and dangerous ODs, and since this is a meme chem that everyone will rush to make, it'll be a lesson learnt early. + +//Bug status: Maybe a bit buggy with the spritecode, and the sprites themselves need touching up. +//TODO - fail reaction explosion makes breasts and baps you with them. /datum/reagent/fermi/BElarger name = "Sucubus milk" id = "BEenlager" @@ -611,12 +646,15 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //////////////////////////////////////////////////////////////////////////////////////////////////// // PENIS ENLARGE /////////////////////////////////////////////////////////////////////////////////////////////////// - +//See breast explanation, it's the same but with taliwhackers +//Oh and I refuse to draw dicks. Someone else can or I'll replace large sprites with a redtail. +//Since someone else made this in the time it took me to PR it, I merged the two ideas. +//Which basically means I took the description. //TODO: failing the reaction creates a penis instead. /datum/reagent/fermi/PElarger // Due to popular demand...! name = "Incubus draft" id = "PElarger" - description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermicem corp and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? + description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? dumb color = "#888888" // This is greyish..? taste_description = "chinese dragon powder" overdose_threshold = 12 //ODing makes you male and removes female genitals @@ -682,10 +720,22 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING nT.Insert(M) T = nT ..() - +/* //////////////////////////////////////////////////////////////////////////////////////////////////// // ASTROGEN /////////////////////////////////////////////////////////////////////////////////////////////////// +More fun chems! +When you take it, it spawns a ghost that shouldn't be able to interact with the world, it can talk cause eh, it's space whattya gonna do +This ghost moves pretty quickly and is mostly invisible, but is still visible for people with eyes. +When it's out of your system, you return back to yourself. It doesn't last long and metabolism of the chem is exponential. +ODing doesn't seem to work, I dunno why, I'd like it to frustrate your attempts to move around and make you fall aleep after. +Addiction is particularlly brutal, it slowly turns you invisible with flavour text, then kills you at a low enough alpha. (i've also added something to prevent geneticists speeding this up) +There's afairly major catch regarding the death though. I'm not gonna say here, go read the code, it explains it and puts my comments on it in context. I know that anyone reading it without understanding it is going to freak out so, this is my attempt to get you to read it and understand it. +I'd like to point out from my calculations it'll take about 60-80 minutes to die this way too. Plenty of time to visit me and ask for some pills to quench your addiction. + +Buginess level: low +*/ + /datum/reagent/fermi/astral // Gives you the ability to astral project for a moment! name = "Astrogen" id = "astral" @@ -694,19 +744,20 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING taste_description = "velvety brambles" metabolization_rate = 0//Removal is exponential, see code overdose_threshold = 20 - addiction_threshold = 30 - addiction_stage1_end = 9999//Should never end. + addiction_threshold = 25 + addiction_stage1_end = 9999//Should never end. There is no escape make your time var/mob/living/carbon/origin var/mob/living/simple_animal/hostile/retaliate/ghost/G = null var/ODing = FALSE + var/antiGenetics = 255 + var/sleepytime = 0 //var/Svol = volume /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! M.alpha = 255//Reset addiction switch(current_cycle) if(0)//Require a minimum - //var/mob/living/carbon/H = M - //M.alpha = 255 + M.alpha = 255 origin = M if (G == null) G = new(get_turf(M.loc)) @@ -723,52 +774,57 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING G.alpha = 35 G.name = "[M]'s astral projection" M.mind.transfer_to(G) + sleepytime = 10*volume + if(overdosed) + if(prob(50)) + to_chat(M, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") + do_teleport(G, M.loc) holder.remove_reagent(src.id, current_cycle, FALSE) ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) G.mind.transfer_to(origin) qdel(G) - if(ODing == TRUE) - M.Sleeping(10*volume, 0) + if(overdosed) + M.Sleeping(sleepytime, 0) ODing = FALSE ..() -/datum/reagent/fermi/astral/overdose_process(mob/living/carbon/M) - ODing = TRUE - if (!G == null) - if(prob(70)) - to_chat(M, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") - do_teleport(G, M.loc) - ..() - //Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. /datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) if(prob(65)) - M.alpha = M.alpha - 1 - switch(M.alpha) + M.alpha-- + antiGenetics-- + switch(antiGenetics) if(245) to_chat(M, "You notice your body starting to disappear, maybe you took too much Astrogen...?") - M.alpha = M.alpha - 1 + M.alpha-- + antiGenetics-- if(220) to_chat(M, "Your addiction is only getting worse as your body disappears. Maybe you should get some more, and fast?") - M.alpha = M.alpha - 1 + M.alpha-- + antiGenetics-- if(180) to_chat(M, "You're starting to get scared as more and more of your body and consciousness begins to fade.") - M.alpha = M.alpha - 1 + M.alpha-- + antiGenetics-- if(120) to_chat(M, "As you lose more and more of yourself, you start to think that maybe shedding your mortality isn't too bad.") - M.alpha = M.alpha - 1 + M.alpha-- + antiGenetics-- if(100) to_chat(M, "You feel a substantial part of your soul flake off into the ethereal world, rendering yourself unclonable.") - M.alpha = M.alpha - 1 + M.alpha-- + antiGenetics-- M.add_trait(TRAIT_NOCLONE) //So you can't scan yourself, then die, to metacomm. You can only use your memories if you come back as something else. if(80) to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates the forthcoming oblivion.") - M.alpha = M.alpha - 1 + M.alpha-- + antiGenetics-- if(45) to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.") - M.alpha = M.alpha - 1 + M.alpha-- + antiGenetics-- if(0 to 30) to_chat(M, "Your body disperses from existence, as you become one with the universe.") to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life and afterlife remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. @@ -778,10 +834,148 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING qdel(M) //Approx 60minutes till death from initial addiction ..() - +/* //////////////////////////////////////// // MKULTA // //////////////////////////////////////// +The magnum opus of FermiChem - +Long and complicated, I highly recomend you look at the two other files heavily involved in this +modular_citadel/code/datums/status_effects/chems.dm - handles the subject's reactions +code/modules/surgery/organs/vocal_cords.dm - handles the enchanter speaking +What started as a chem for bhijin became way too ambitious, because I live in the sky with pie. + +HOW IT WORKS +Fermis_Reagent.dm +There's 3 main ways this chemical works; I'll start off with discussing how it's set up. +Upon reacting with blood as a catalyst, the blood is used to define who the enthraller is - thus only the creator is/can choose who the master will be. As a side note, you can't adminbus this chem, even admins have to earn it. +This uses the fermichem only proc; FermiCreate, which is basically the same as On_new, except it doesn't require "data" which is something to do with blood and breaks everything so I said bugger it and made my own proc. It basically sets up vars. +When it's first made, the creator has to drink some of it, in order to give them the vocal chords needed. +When it's given to someone, it gives them the status effect and kicks off that side of things. For every metabolism tick, it increases the enthrall tally. +Finally, if you manage to pump 150u into some poor soul, you overload them, and mindbreak them. Making them your willing, but broken slave. Which can only be reversed by; fixing their brain with mannitol and neurine (100 / 50u respectively) (or less with both), + +vocal_cords.dm +This handles when the enchanter speaks - basically uses code from voice of god, but only for people with the staus effect. Most of the words are self explainitory, and has a smaller range of commands. If you're not sure what one does, it likely affects the enthrall tally, or the resist tally. +list of commands: + +-mixables- +enthral_words +reward_words +punish_words +0 +saymyname_words +wakeup_words +1 +silence_words +antiresist_words +resist_words +forget_words +attract_words +orgasm_words +2 +awoo_words +nya_words +sleep_words +strip_words +walk_words +run_words +knockdown_words +3 +statecustom_words +custom_words +objective_words +heal_words +stun_words +hallucinate_words +hot_words +cold_words +getup_words +pacify_words +charge_words + +Mixables can be used intersperced with other commands, 0 is commands that work on sleeper against (i.e. players enthralled to state 3, then ordered to wake up and forget, they can be triggered back instantly) +1 is for players who immediately are injected with the chem - no stuns, only a silence and something that draws them towrds them. This is the best time to try to fight it and you're likely to win by spamming resist, unless the enchantress has plans. +2 is the seconds stage, which allows removal of clothes, slowdown and light stunning. You can also make them nya and awoo, because cute. +3 is the finaly state, which allows application of a few status effects (see chem.dm) and allows custom triggers to be installed (kind of like nanites), again, see chem.dm +In a nutshell, this is the way you enthrall people, by typing messages into chat and managing cooldowns on the stronger words. You have to type words and your message strength is increases with the number of characters - if you type short messages the cooldown will be too much and the other player will overcome the chem. +I suppose people could spam gdjshogndjoadphgiuaodp but, the truth of this chem is that it mostly allows a casus beli for subs to give in, and everyones a sub on cit (mostly), so if you aujigbnadjgipagdsjk then they might resist harder cause you're a baddie and baddies don't deserve pets. +Also, the use of this chem as a murder aid is antithetic to it's design, the subject gains bonus resistance if they're hurt or hungry (I'd like to expland this more, I like the idea that you have to look after all of them otherwise they aren't as effective, kind of like tamagachis!). If this becomes a problem, I'll deal with it, I'm not happy with people abusing this chem for an easy murder. (I might make it so you an't strike your pet when health is too low.) +Additionaly, in lieu of previous statement - the pet is ordered to not kill themselves, even if ordered to. + +chem.dm +oof +There's a few basic things that have to be understood with this status effect +1. There is a min loop which calculates the enthrall state of the subject, when the entrall tally is over a certain amount, it will push you up 1 phase. +0 - Sleeper +1 - initial +2 - enthralled +3 - Fully entranced +4 - mindbroken +4 can only be reached via OD, whereas you can increment up from 1 > 2 > 3. 0 is only obtainable on a state 3 pet, and it toggles between the two. + +1.5 Chem warfare +Since this is a chem, it's expected that you will use all of the chemicals at your disposal. Using aphro and aphro+ will weaken the resistance of the subject, while ananphro, anaphro+, mannitol and neurine will strengthen it. +Additionally, the more aroused you are, the weaker your resistance will be, as a result players immune to aphro and anaphro give a flat bonus to the enthraller. +using furranium and hatmium on the enchanter weakens their power considerably, because they sound rediculous. "Youwe fweewing wery sweepy uwu" This completely justifies their existance. +The impure toxin for this chem increases resistance too, so if they're a bad chemist it'll be unlikely they have a good ratio (and as a secret bonus, really good chemists cann purposely make the impure chem, to use either to combat the use of it against them, or as smoke grenades to deal with a large party) + +2. There is a resistance proc which occurs whenever the player presses resist. You have to press it a lot, this is intentional. If you're trying to fight the enchanter, then you can't click both. You usually will win if you just mash resist and the enchanter does nothing, so you've got to react. +Each step futher it becomes harder to resist, in state 2 it's longer, but resisting is still worthwhile. If you're not in state 3, and you've not got MKultra inside of you, you generate resistance very fast. So in some cases the better option will be to stall out any attempts to entrance you. +At the moment, resistance doesn't affect the commands - mostly because it's a way to tell if a state 3 is trying to resist. But this might change if it gets too hard to fight them off. +Durign state 3, it's impossible to resist if the enthraller is in your presence (8 tiles), you generate no resistance if so. If they're out of your range, then you start to go into the addiction processed +As your resistance is tied to your arousal, sometimes your best option is to wah + +3. The addition process starts when the enthraller is out of range, it roughtly follows the five stages of grief; denial, anger, bargaining, depression and acceptance. +What it mostly does makes you sad, hurts your brain, and sometimes you lash out in anger. +Denial - minor brain damaged +bargaining - 50:50 chance of brain damage and brain healing +anger - randomly lashing out and hitting people +depression - massive mood loss, stuttering, jittering, hallucinations and brain damage +depression, again - random stunning and crying, brain damage, and resistance +acceptance - minor brain damage and resistance. +You can also resist while out of range, but you can only break free of a stange 3 enthrallment by hitting the acceptance phase with a high enough resistance. +Finally, being near your enthraller reverts the damages caused. +It is expected that if you intend to break free you'll need to use psicodine and mannitol or you'll end up in a bad, but not dead, state. This gives more work for medical!! Finally the true rational of this complicated chem comes out. + +4. Status effects in status effects. +There's a few commands that give status effects, such as antiresist, which will cause resistance presses to increase the enthrallment instead, theses are called from the vocal chords. +They're mostly self explainitory; antiresist, charge, pacify and heal. Heals quite weak for obvious reasons. I'd like to add more, maybe some weak adneals with brute/exhaustion costs after the status is over. A truth serum might be neat too. +State 4 pets don't get status effects. + +5. Custom triggers +Because it wasnt complicated enough already. +Custom triggers are set by stating a trigger word, which will call a sub proc, which is also defined when the trigger is Called +The effects avalible at the moment are: +Speak - forces pet to say a preallocated phrase in response to the trigger +Echo - sends a message to that player only (i.e. makes them think something) +Shock - gives them a seizure/zaps them +You can look this one up yourself - it's what you expect, it's cit +kneel - gives a short knockdown +strip - strips jumpsuit only +objective - gives the pet a new objective. This requires a high ammount of mental capasity - which is determined by how much you resist. If you resist enough during phase 1 and 2, then they can't give you an objective. +Feel free to add more. +triggers work when said by ANYONE, not just the enchanter. +This is only state 3 pets, state 4 pets cannot get custom triggers, you broke them you bully. + +6. One other thing that I can't get to work - replacing the mention of your enthraller with Master/Mistress. Maybe it's too much trouble. + +7. If you're an antage you get a bonus to resistance AND to enthralling. Thus it can be worth using this on both sides. It shouldn't be hard to resist as an antag. There are futher bonuses to command, Chaplains and chemist. +If you give your pet a collar then their resistance reduced too. +(I think thats everything?) + +How buggy is it? +Probably very, it's hard to test this by myself. + +BALANCE ISSUES: +There are none, but I'm glad you asked. + +Okay, seriously, unless you're an antag, it will be difficult to enthrall people, you'll need to put a lot of work into it, and really it's supposed to be a mix of rp and combat(?) use. If you get a small army of pets then it can be useful, but equally, they can revered with a ananphro + mannitol grenade. +If it becomes an issue, I'll make all pets pacifists and apply more weakness effects based on mood and state. I'll probably do this anyways as I want the bond between the two to be imperative. +As stated earlier the biggest concern is the use as a murder aid, which I have ideas for. (weaken the enthraller during the enthrallment process?) + +And as stated earlier, this chem is hard to make, and is punishing on failure. You fall in love with the chem dispencer and have to stay within 8 tiles of it. Additionally, you hug the dispencer instead of using it - thus making you unable to continue chemistry for that round, and likely getting the CMO mad as hecc at you. +(thats not written yet but thats the idea.) +*/ + /datum/reagent/fermi/enthrall name = "MKUltra" id = "enthral" @@ -797,7 +991,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/creatorName var/mob/living/creator -/datum/reagent/fermi/enthrall/on_new() +/datum/reagent/fermi/enthrall/fermiCreate() message_admins("On new for enthral proc'd") var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list //var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list @@ -866,6 +1060,12 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //////////////////////////////////////////////////////////////////////////////////////////////////// // HATIMUIM /////////////////////////////////////////////////////////////////////////////////////////////////// +//Fun chem, simply adds a heat upon your head, and tips their hat +//Also has a speech alteration effect when the hat is there +//Should, but doesn't currently, increase armour; 1 armour per 10u +//but if you OD it becomes negative. +//please help fix that + /datum/reagent/fermi/hatmium //for hatterhat name = "Hat growth serium" @@ -891,16 +1091,20 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //hat.armor = list("melee" = (1+(current_cycle/20)), "bullet" = (1+(current_cycle/20)), "laser" = (1+(current_cycle/20)), "energy" = (1+(current_cycle/20)), "bomb" = (1+(current_cycle/20)), "bio" = (1+(current_cycle/20)), "rad" = (1+(current_cycle/20)), "fire" = (1+(current_cycle/20)), "acid" = (1+(current_cycle/20))) if(!overdosed) for (var/i in hat.armor) - hat.armor[i] = (1+(current_cycle*20)) //Doesn't work aaarghhhhh!!!! + hat.armor[i] = -(1+(current_cycle/10)) //Doesn't work aaarghhhhh!!!! else for (var/i in hat.armor) - hat.armor[i] = (1/(current_cycle*10)) + hat.armor[i] = (1+(current_cycle/10)) ..() //////////////////////////////////////////////////////////////////////////////////////////////////// // FURRANIUM /////////////////////////////////////////////////////////////////////////////////////////////////// +//OwO whats this? //Works as intended!! +//Makes you nya and awoo +//At a certain amount of time in your system it gives you a fluffy tongue owo! + /datum/reagent/fermi/furranium name = "Furranium" id = "furranium" @@ -946,71 +1150,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /////////////////////////////////////////////////////////////////////////////////////////////// -/datum/reagent/fermi/secretcatchem //Should I hide this from code divers? A secret cit chem? - //name = "Catgirl" //an attempt at hiding it - id = "secretcatchem" - description = "An illegal and hidden chem that turns people into catgirls. It's said you see the light if you take too much of it." - color = "#A0B0E4" // rgb: , 0, 255 - taste_description = "hairballs and cream" - overdose_threshold = 10 - -/datum/reagent/fermi/secretcatchem/New() - name = "Catgirli[pick("a","u","e","y")]m [pick("apex", "prime", "meow")]" - -/datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H) - . = ..() - var/current_species = H.dna.species.type - var/datum/species/mutation = /datum/species/human/felinid - if(mutation && mutation != current_species) - to_chat(H, "You crumple in agony as your flesh wildly morphs into new forms!") - H.visible_message("[H] falls to the ground and screams as [H.p_their()] skin bubbles and froths!") - H.Knockdown(60) - H.set_species(mutation) - else - to_chat(H, "The pain vanishes suddenly. You feel no different.") - -/datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/M) - if(prob(10)) - playsound(get_turf(M), 'modular_citadel/sound/voice/nya.ogg', 50, 1, -1) - M.emote("me","lets out a nya!") - if(prob(10)) - playsound(get_turf(M), 'sound/effects/meow1.ogg', 50, 1, -1) - M.emote("me","lets out a mewl!") - if(prob(10)) - playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) - M.emote("me","lets out a meowrowr!") - ..() - -/datum/reagent/fermi/secretcatchem/overdose_start(mob/living/carbon/human/H) //I couldn't resist - should I hide this somewhere else? - . = ..() - to_chat(H, "You suddenly see the light and realise that everyone will be better off, and much happier, if they were only a cat girl.") - var/objective = "Aid in the production of more chemicals and turn everyone on the station into catgirls. Avoid any and all attempts at renoucing your newfound catgirl form for this is your true form now." - if (H.mind.assigned_role in GLOB.antagonists) - objective += "Complete your objectives in tandem with this new objective. If you are tasked with murdering someone turning someone into a catgirl is now an alternative to you." - brainwash(H, objective) - -/* -/proc/secretcatchem(mob/living/carbon/C) //Explosion turns you into a cat. Meow. - C.unequip_everything() - //var/cat = new /mob/living/simple_animal/pet/cat(C.loc) - var/mob/living/simple_animal/pet/cat = new(get_turf(C.loc)) - C.mind.transfer_to(cat) - cat.name = C.name - qdel(C) - //Add to chat lines - //Maybe teleport player away instead? -*/ - - -/* -/mob/living/simple_animal/hostile/retaliate/ghost -incorporeal_move = 1 -name -alpha = 20 -reduce viewrange? -*/ - -/* Needs to be fixed: +/* Needs to be fixed, I cannot get it to work and it's giving me compile errors aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa //Nanite removal //Writen by Trilby!! /datum/reagent/fermi/naninte_b_gone @@ -1025,13 +1165,13 @@ reduce viewrange? var/component/nanites/nane = C.GetComponent(/component/nanites) if(isnull(nane)) return - nane.regen_rate = -5.0 + nane.regen_rate = -5.0//This seems really high /datum/reagent/fermi/naninte_b_gone/overdose_start(mob/living/carbon/C) var/component/nanites/nane = C.GetComponent(/component/nanites) if(isnull(nane)) return - nane.regen_rate = -7.5 + nane.regen_rate = -7.5//12.5 seems crazy high? */ /* diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 3dd4c41029..2ea13b92c1 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -1,67 +1,40 @@ /obj/item/pHbooklet name = "pH indicator booklet" - desc = "A piece of paper that will change colour depending on the pH of what it's added to." + desc = "A booklet containing paper soaked in universal indicator." icon_state = "pHbooklet" icon = 'modular_citadel/icons/obj/FermiChem.dmi' item_flags = NOBLUDGEON - var/numberOfPages = 100 + var/numberOfPages = 50 + //set flammable somehow /obj/item/pHbooklet/attack_hand(mob/user) - if(numberOfPages >= 1) - var/obj/item/pHpaper/P = new /obj/item/pHpaper - //P.add_fingerprint(user) - P.forceMove(user.loc) - user.put_in_hands(P) - to_chat(user, "You take [P] out of \the [src].") - numberOfPages-- - else - to_chat(user, "[src] is empty!") - add_fingerprint(user) - return ..() + ..() + if(user.get_held_index_of_item(src)) + if(numberOfPages >= 1) + var/obj/item/pHpaper/P = new /obj/item/pHpaper + P.add_fingerprint(user) + P.forceMove(user.loc) + user.put_in_active_hand(P) + to_chat(user, "You take [P] out of \the [src].") + numberOfPages-- + playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1) + add_fingerprint(user) + return + else + to_chat(user, "[src] is empty!") + add_fingerprint(user) + return + var/I = user.get_active_held_item() + if(!I) + user.put_in_active_hand(src) + return /obj/item/pHpaper name = "pH indicator strip" desc = "A piece of paper that will change colour depending on the pH of a solution." icon_state = "pHpaper" icon = 'modular_citadel/icons/obj/FermiChem.dmi' - item_flags = NOBLUDGEON + //item_flags = NOBLUDGEON color = "#f5c352" var/used = FALSE - -/obj/item/pHpaper/attack_hand(mob/user, obj/I) - if(!I.reagents.pH) - return - if(used == TRUE) - to_chat(user, "[src] has already been used!") - return - switch(I.reagents.pH) - if(14 to INFINITY) - src.color = "#462c83" - if(13 to 14) - src.color = "#63459b" - if(12 to 13) - src.color = "#5a51a2" - if(11 to 12) - src.color = "#3853a4" - if(10 to 11) - src.color = "#3f93cf" - if(9 to 10) - src.color = "#0bb9b7" - if(8 to 9) - src.color = "#23b36e" - if(7 to 8) - src.color = "#3aa651" - if(6 to 7) - src.color = "#4cb849" - if(5 to 6) - src.color = "#b5d335" - if(4 to 5) - src.color = "#b5d333" - if(3 to 4) - src.color = "#f7ec1e" - if(2 to 3) - src.color = "#fbc314" - if(1 to 2) - src.color = "#f26724" - if(0 to 1) - src.color = "#ef1d26" + //set flammable somehow From aa289b67dc2e5fc7d6a30490bd2d82a7d2c0fd40 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 15 May 2019 05:28:41 +0100 Subject: [PATCH 113/608] Quick fix --- .../code/datums/status_effects/chems.dm | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 2070e0dda0..f204494eac 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -237,19 +237,19 @@ to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) - to_chat(owner, "[pick("It feels so good to listen to [master.name].", "You can't keep your eyes off [master.name].", "[master.name]'s voice is making you feel so sleepy.", "You feel so comfortable with [master.name]", "[master.name] is so sexy and dominant, it feels right to obey them.")].") + to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so sexy and dominant, it feels right to obey them.")].") else if (2) //partially enthralled if (enthrallTally > 150) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 - to_chat(owner, "Your mind gives, eagerly obeying and serving [master.name].") - to_chat(owner, "You are now fully enthralled to [master.name], and eager to follow their commands. However you find that in your intoxicated state you are much less likely to resort to violence, unless it is to defend your [enthrallGender]. Equally you are unable to commit suicide, even if ordered to, as you cannot server your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. + to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") + to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are much less likely to resort to violence, unless it is to defend your [enthrallGender]. Equally you are unable to commit suicide, even if ordered to, as you cannot server your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. else if (resistanceTally > 150) enthrallTally *= 0.5 phase -= 1 resistanceTally = 0 - to_chat(owner, "You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [master.name].") + to_chat(owner, "You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [master].") //owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment, else if (3)//fully entranced if (resistanceTally >= 250 && withdrawalTick >= 150) @@ -409,12 +409,13 @@ //qdel(redirect_component2.resolve()) //redirect_component2 = null - +/* /datum/status_effect/chem/enthrall/mob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) if(master in message || master in message) return else . = ..() +*/ /datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) var/mob/living/carbon/C = owner @@ -555,16 +556,15 @@ if (deltaResist>0)//just in case deltaResist /= phase//later phases require more resistance -/* + /datum/status_effect/chem/enthrall/proc/owner_say(message) //I can only hope this works var/datum/status_effect/chem/enthrall/E = owner.has_status_effect(/datum/status_effect/chem/enthrall) var/mob/living/master = E.master - var/static/regex/owner_words = regex("[master.name]|[master.first_name()]") + var/static/regex/owner_words = regex("[master]") if(findtext(message, owner_words)) - message = replacetext(lowertext(message), lowertext(master.real_name), "[enthrallGender]") - message = replacetext(lowertext(message), lowertext(master.name), "[enthrallGender]") + message = replacetext(lowertext(message), lowertext(master), "[enthrallGender]") return message -*/ + /* /datum/status_effect/chem/OwO id = "OwO" From 6dba14eafd779715b388ba2a3f605d0b3dd1669e Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 15 May 2019 05:34:16 +0100 Subject: [PATCH 114/608] Final fix. --- .../holder(nonProc.old.functional.).dm | 967 ---------------- .../reagents/chemistry/holderBackup.dm | 952 ---------------- .../reagents/chemistry/holderProcBackup.dm | 1003 ----------------- code/modules/reagents/chemistry/holderbk3.dm | 962 ---------------- .../code/datums/status_effects/chems.dm | 4 +- 5 files changed, 2 insertions(+), 3886 deletions(-) delete mode 100644 code/modules/reagents/chemistry/holder(nonProc.old.functional.).dm delete mode 100644 code/modules/reagents/chemistry/holderBackup.dm delete mode 100644 code/modules/reagents/chemistry/holderProcBackup.dm delete mode 100644 code/modules/reagents/chemistry/holderbk3.dm diff --git a/code/modules/reagents/chemistry/holder(nonProc.old.functional.).dm b/code/modules/reagents/chemistry/holder(nonProc.old.functional.).dm deleted file mode 100644 index c38f065383..0000000000 --- a/code/modules/reagents/chemistry/holder(nonProc.old.functional.).dm +++ /dev/null @@ -1,967 +0,0 @@ -/proc/build_chemical_reagent_list() - //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id - - if(GLOB.chemical_reagents_list) - return - - var/paths = subtypesof(/datum/reagent) - GLOB.chemical_reagents_list = list() - - for(var/path in paths) - var/datum/reagent/D = new path() - GLOB.chemical_reagents_list[D.id] = D - -/proc/build_chemical_reactions_list() - //Chemical Reactions - Initialises all /datum/chemical_reaction into a list - // It is filtered into multiple lists within a list. - // For example: - // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma - - if(GLOB.chemical_reactions_list) - return - - var/paths = subtypesof(/datum/chemical_reaction) - GLOB.chemical_reactions_list = list() - - for(var/path in paths) - - var/datum/chemical_reaction/D = new path() - var/list/reaction_ids = list() - - if(D.required_reagents && D.required_reagents.len) - for(var/reaction in D.required_reagents) - reaction_ids += reaction - - // Create filters based on each reagent id in the required reagents list - for(var/id in reaction_ids) - if(!GLOB.chemical_reactions_list[id]) - GLOB.chemical_reactions_list[id] = list() - GLOB.chemical_reactions_list[id] += D - break // Don't bother adding ourselves to other reagent ids, it is redundant - -/////////////////////////////////////////////////////////////////////////////////// - -/datum/reagents - var/list/datum/reagent/reagent_list = new/list() - var/total_volume = 0 - var/maximum_volume = 100 - var/atom/my_atom = null - var/chem_temp = 150 - var/pH = REAGENT_NORMAL_PH - var/last_tick = 1 - var/addiction_tick = 1 - var/list/datum/reagent/addiction_list = new/list() - var/reagents_holder_flags - -/datum/reagents/New(maximum=100) - maximum_volume = maximum - - //I dislike having these here but map-objects are initialised before world/New() is called. >_> - if(!GLOB.chemical_reagents_list) - build_chemical_reagent_list() - if(!GLOB.chemical_reactions_list) - build_chemical_reactions_list() - -/datum/reagents/Destroy() - . = ..() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - qdel(R) - cached_reagents.Cut() - cached_reagents = null - if(my_atom && my_atom.reagents == src) - my_atom.reagents = null - my_atom = null - -// Used in attack logs for reagents in pills and such -/datum/reagents/proc/log_list() - if(!length(reagent_list)) - return "no reagents" - - var/list/data = list() - for(var/r in reagent_list) //no reagents will be left behind - var/datum/reagent/R = r - data += "[R.id] ([round(R.volume, 0.1)]u)" - //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. - return english_list(data) - -/datum/reagents/proc/remove_any(amount = 1) - var/list/cached_reagents = reagent_list - var/total_transfered = 0 - var/current_list_element = 1 - - current_list_element = rand(1, cached_reagents.len) - - while(total_transfered != amount) - if(total_transfered >= amount) - break - if(total_volume <= 0 || !cached_reagents.len) - break - - if(current_list_element > cached_reagents.len) - current_list_element = 1 - - var/datum/reagent/R = cached_reagents[current_list_element] - remove_reagent(R.id, 1) - - current_list_element++ - total_transfered++ - update_total() - - handle_reactions() - return total_transfered - -/datum/reagents/proc/remove_all(amount = 1) - var/list/cached_reagents = reagent_list - if(total_volume > 0) - var/part = amount / total_volume - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - remove_reagent(R.id, R.volume * part) - - update_total() - handle_reactions() - return amount - -/datum/reagents/proc/get_master_reagent_name() - var/list/cached_reagents = reagent_list - var/name - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - name = R.name - - return name - -/datum/reagents/proc/get_master_reagent_id() - var/list/cached_reagents = reagent_list - var/id - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - id = R.id - - return id - -/datum/reagents/proc/get_master_reagent() - var/list/cached_reagents = reagent_list - var/datum/reagent/master - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - master = R - - return master - -/datum/reagents/proc/trans_to(obj/target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. - var/list/cached_reagents = reagent_list - if(!target || !total_volume) - return - if(amount < 0) - return - - var/datum/reagents/R - if(istype(target, /datum/reagents)) - R = target - else - if(!target.reagents) - return - R = target.reagents - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - var/part = amount / src.total_volume - var/trans_data = null - for(var/reagent in cached_reagents) - var/datum/reagent/T = reagent - var/transfer_amount = T.volume * part - if(preserve_data) - trans_data = copy_data(T) - - //fermichem Added ph TODO: add T.purity - R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. - //R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. - remove_reagent(T.id, transfer_amount) - - update_total() - R.update_total() - if(!no_react) - R.handle_reactions() - src.handle_reactions() - return amount - -/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1) - var/list/cached_reagents = reagent_list - if(!target || !total_volume) - return - - var/datum/reagents/R - if(istype(target, /datum/reagents)) - R = target - else - if(!target.reagents) - return - R = target.reagents - - if(amount < 0) - return - amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) - var/part = amount / total_volume - var/trans_data = null - for(var/reagent in cached_reagents) - var/datum/reagent/T = reagent - var/copy_amount = T.volume * part - if(preserve_data) - trans_data = T.data - R.add_reagent(T.id, copy_amount * multiplier, trans_data) - - src.update_total() - R.update_total() - R.handle_reactions() - src.handle_reactions() - return amount - -/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N - var/list/cached_reagents = reagent_list - if (!target) - return - if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) - return - if(amount < 0) - return - - var/datum/reagents/R = target.reagents - if(src.get_reagent_amount(reagent)= R.overdose_threshold && !R.overdosed) - R.overdosed = 1 - need_mob_update += R.overdose_start(C) - if(R.addiction_threshold) - if(R.volume >= R.addiction_threshold && !is_type_in_list(R, cached_addictions)) - var/datum/reagent/new_reagent = new R.type() - cached_addictions.Add(new_reagent) - if(R.overdosed) - need_mob_update += R.overdose_process(C) - if(is_type_in_list(R,cached_addictions)) - for(var/addiction in cached_addictions) - var/datum/reagent/A = addiction - if(istype(R, A)) - A.addiction_stage = -15 // you're satisfied for a good while. - need_mob_update += R.on_mob_life(C) - - if(can_overdose) - if(addiction_tick == 6) - addiction_tick = 1 - for(var/addiction in cached_addictions) - var/datum/reagent/R = addiction - if(C && R) - R.addiction_stage++ - if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end) - need_mob_update += R.addiction_act_stage1(C) - else if(R.addiction_stage1_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end) - need_mob_update += R.addiction_act_stage2(C) - else if(R.addiction_stage2_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end) - need_mob_update += R.addiction_act_stage3(C) - else if(R.addiction_stage3_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end) - need_mob_update += R.addiction_act_stage4(C) - else if(R.addiction_stage4_end <= R.addiction_stage) - to_chat(C, "You feel like you've gotten over your need for [R.name].") - SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.id]_addiction") - cached_addictions.Remove(R) - addiction_tick++ - if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. - C.updatehealth() - C.update_canmove() - C.update_stamina() - update_total() - - -/datum/reagents/proc/set_reacting(react = TRUE) - if(react) - reagents_holder_flags &= ~(REAGENT_NOREACT) - else - reagents_holder_flags |= REAGENT_NOREACT - -/datum/reagents/proc/conditional_update_move(atom/A, Running = 0) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - R.on_move (A, Running) - update_total() - -/datum/reagents/proc/conditional_update(atom/A) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - R.on_update (A) - update_total() - -/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar - var/list/cached_reagents = reagent_list //a list of the reagents? - var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? - var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! - if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. - return //Yup, no reactions here. No siree. - - var/reaction_occurred = 0 // checks if reaction, binary variable - do //What does do do in byond? It sounds very redundant? is it a while loop? - var/list/possible_reactions = list() //init list - reaction_occurred = 0 // sets it back to 0? - for(var/reagent in cached_reagents) //for reagent in beaker/holder - var/datum/reagent/R = reagent //check to make sure that reagent is there for the reaction list - for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id - if(!reaction) - continue - - var/datum/chemical_reaction/C = reaction - var/list/cached_required_reagents = C.required_reagents - var/total_required_reagents = cached_required_reagents.len - var/total_matching_reagents = 0 - var/list/cached_required_catalysts = C.required_catalysts - var/total_required_catalysts = cached_required_catalysts.len - var/total_matching_catalysts= 0 - var/matching_container = 0 - var/matching_other = 0 - var/required_temp = C.required_temp - var/is_cold_recipe = C.is_cold_recipe - var/meets_temp_requirement = 0 - var/has_special_react = C.special_react - var/can_special_react = 0 - //FermiChem WHY ARE VARIBLES SO ESTRANGED it makes me sad - /* - var/OptimalTempMin = C.OptimalTempMin // Lower area of bell curve for determining heat based rate reactions - var/OptimalTempMax = C.OptimalTempMax - var/ExplodeTemp = C.ExplodeTemp - var/OptimalpHMin = C.OptimalpHMin - var/OptimalpHMax = C.OptimalpHMax - var/ReactpHLim = C.ReactpHLim - //var/CatalystFact = C.CatalystFact - var/CurveSharpT = C.CurveSharpT - var/CurveSharppH = C.CurveSharppH - var/ThermicConstant = C.ThermicConstant - var/HIonRelease = C.HIonRelease - var/RateUpLim = C.RateUpLim - var/FermiChem = C.FermiChem - var/FermiExplode = C.FermiExplode - var/ImpureChem = C.ImpureChem - */ - //FermiChem - - for(var/B in cached_required_reagents) - if(!has_reagent(B, cached_required_reagents[B])) - break - total_matching_reagents++ - for(var/B in cached_required_catalysts) - if(!has_reagent(B, cached_required_catalysts[B])) - break - total_matching_catalysts++ - if(cached_my_atom) - if(!C.required_container) - matching_container = 1 - - else - if(cached_my_atom.type == C.required_container)//if the suspected container is a container - matching_container = 1 - if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs - return - if(!C.required_other)//Checks for other things required - matching_other = 1//binary check passes - - else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem - var/obj/item/slime_extract/M = cached_my_atom - - if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1 - else - if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? Oh, cyro. - matching_container = 1 - if(!C.required_other) - matching_other = 1 - - //FermiChem - if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! - if (C.FermiExplode == TRUE) - //To be added! - else - FermiExplode() - //explode function!! - - if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! - meets_temp_requirement = 1//binary pass - - if(!has_special_react || C.check_special_react(src)) - can_special_react = 1 - - if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react) - possible_reactions += C - - if(possible_reactions.len)//does list exist? - var/datum/chemical_reaction/selected_reaction = possible_reactions[1] - //select the reaction with the most extreme temperature requirements - for(var/V in possible_reactions)//why V, surely that would indicate volume? V is the reaction potential. - var/datum/chemical_reaction/competitor = V //competitor? I think this is theres two of them. Troubling..! - if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. - if(competitor.required_temp <= selected_reaction.required_temp)//only returns with lower if reaction "is cold" var. - selected_reaction = competitor - else - if(competitor.required_temp >= selected_reaction.required_temp) //will return with the hotter reacting first. - selected_reaction = competitor - var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list - var/list/cached_results = selected_reaction.results//resultant chemical list - var/special_react_result = selected_reaction.check_special_react(src) - var/list/multiplier = INFINITY //Wat - - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - - //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. - //FermiChem relies on two additional properties; pH and impurity - //Temperature plays into a larger role too. - //if(selected_reaction) - var/datum/chemical_reaction/C = selected_reaction - if (C.FermiChem == TRUE) - //FermiReact(C) - //B is Beaker - //P is product - //multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmmount = 0 - var/ammoReacted = 0 - //get purity from combined beaker reactant purities. - var/purity = 1 - - - while (ammoReacted < multiplier) - message_admins("Loop beginning") - CHECK_TICK - //Begin Parse - - //Check extremes first - if (chem_temp > C.ExplodeTemp) - //go to explode proc - message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") - FermiExplode() - - if (pH > 14 || pH < 0) - //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - message_admins("pH is lover limit, cur pH: [pH]") - FermiExplode() - - //For now, purity is handled elsewhere - - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax || chem_temp >= C.OptimalTempMin) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) - // 350 300 - else if (chem_temp >= C.OptimalTempMax) - deltaT = 1 - else - deltaT = 0 - message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") - - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < C.OptimalpHMin) - if (pH < (C.OptimalpHMin - C.ReactpHLim)) - deltapH = 0 - else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) - //Upper range - else if (pH > C.OptimalpHMin) - if (pH > (C.OptimalpHMin + C.ReactpHLim)) - deltapH = 0 - else - deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) - //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) - deltapH = 1 - //This should never proc: - else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") - WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") - //TODO Add CatalystFact - message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") - - stepChemAmmount = multiplier * deltaT - if (stepChemAmmount > C.RateUpLim) - stepChemAmmount = C.RateUpLim - else if (stepChemAmmount < 0.01) - stepChemAmmount = 0.1 - if (ammoReacted > 0) - purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /((ammoReacted + stepChemAmmount)) //This should add the purity to the product - else - purity = deltapH - message_admins("purity: [purity], purity of beaker") - message_admins("Temp before change: [chem_temp], pH after change: [pH]") - //Apply pH changes and thermal output of reaction to beaker - chem_temp += (C.ThermicConstant * stepChemAmmount) - pH += (C.HIonRelease * stepChemAmmount) - message_admins("Temp after change: [chem_temp], pH after change: [pH]") - - // End. - - selected_reaction.on_reaction(src, multiplier, special_react_result) - - message_admins("cached_results: [cached_results], multiplier: [multiplier], stepChemAmmount [stepChemAmmount]") - for(var/B in cached_required_reagents) - message_admins("cached_results: [cached_results], multiplier: [multiplier], stepChemAmmount [stepChemAmmount]") - remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: - - ammoReacted = ammoReacted + stepChemAmmount - CHECK_TICK - - reaction_occurred = 1 - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", ammoReacted, C.id)//log - //Standard reaction mechanics: - else: - - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - - for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log - add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: - - - var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers - var/iconhtml = icon2html(cached_my_atom, seen) - if(cached_my_atom) - if(!ismob(cached_my_atom)) // No bubbling mobs - if(selected_reaction.mix_sound) - playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) - - for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") - - if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." - - selected_reaction.on_reaction(src, multiplier, special_react_result) - reaction_occurred = 1 - - while(reaction_occurred)//while do nothing? - update_total()//Don't know waht this does. - return 0//end! - -/datum/reagents/proc/FermiReact() - return - -/datum/reagents/proc/FermiExplode() - return - -/datum/reagents/proc/isolate_reagent(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if(R.id != reagent) - del_reagent(R.id) - update_total() - -/datum/reagents/proc/del_reagent(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if(R.id == reagent) - if(my_atom && isliving(my_atom)) - var/mob/living/M = my_atom - R.on_mob_delete(M) - qdel(R) - reagent_list -= R - update_total() - if(my_atom) - my_atom.on_reagent_change(DEL_REAGENT) - return 1 - -/datum/reagents/proc/update_total() - var/list/cached_reagents = reagent_list - total_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume < 0.1) - del_reagent(R.id) - else - total_volume += R.volume - - return 0 - -/datum/reagents/proc/clear_reagents() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - del_reagent(R.id) - return 0 - -/datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1) - var/react_type - if(isliving(A)) - react_type = "LIVING" - if(method == INGEST) - var/mob/living/L = A - L.taste(src) - else if(isturf(A)) - react_type = "TURF" - else if(isobj(A)) - react_type = "OBJ" - else - return - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - switch(react_type) - if("LIVING") - var/touch_protection = 0 - if(method == VAPOR) - var/mob/living/L = A - touch_protection = L.get_permeability_protection() - R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection) - if("TURF") - R.reaction_turf(A, R.volume * volume_modifier, show_message) - if("OBJ") - R.reaction_obj(A, R.volume * volume_modifier, show_message) - -/datum/reagents/proc/holder_full() - if(total_volume >= maximum_volume) - return TRUE - return FALSE - -//Returns the average specific heat for all reagents currently in this holder. -/datum/reagents/proc/specific_heat() - . = 0 - var/cached_amount = total_volume //cache amount - var/list/cached_reagents = reagent_list //cache reagents - for(var/I in cached_reagents) - var/datum/reagent/R = I - . += R.specific_heat * (R.volume / cached_amount) - -/datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) - var/S = specific_heat() - chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) - -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, pH = 7, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ - if(!isnum(amount) || !amount) - return FALSE - - if(amount <= 0) - return FALSE - - var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] - if(!D) - WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") - return FALSE - - update_total() - var/cached_total = total_volume - if(cached_total + amount > maximum_volume) - amount = (maximum_volume - cached_total) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. - if(amount <= 0) - return FALSE - var/new_total = cached_total + amount - var/cached_temp = chem_temp - var/list/cached_reagents = reagent_list - - //Equalize temperature - Not using specific_heat() because the new chemical isn't in yet. - var/specific_heat = 0 - var/thermal_energy = 0 - for(var/i in cached_reagents) - var/datum/reagent/R = i - specific_heat += R.specific_heat * (R.volume / new_total) - thermal_energy += R.specific_heat * R.volume * cached_temp - specific_heat += D.specific_heat * (amount / new_total) - thermal_energy += D.specific_heat * amount * reagtemp - chem_temp = thermal_energy / (specific_heat * new_total) - //// - - //add the reagent to the existing if it exists - for(var/A in cached_reagents) - var/datum/reagent/R = A - if (R.id == reagent) - R.volume += amount - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - R.on_merge(data, amount) - if(!no_react) - handle_reactions() - return TRUE - - //otherwise make a new one - var/datum/reagent/R = new D.type(data) - cached_reagents += R - R.holder = src - R.volume = amount - if(data) - R.data = data - R.on_new(data) - - if(isliving(my_atom)) - R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - if(!no_react) - handle_reactions() - return TRUE - -/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) - for(var/r_id in list_reagents) - var/amt = list_reagents[r_id] - add_reagent(r_id, amt, data) - -/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to - - if(isnull(amount)) - amount = 0 - CRASH("null amount passed to reagent code") - return FALSE - - if(!isnum(amount)) - return FALSE - - if(amount < 0) - return FALSE - - var/list/cached_reagents = reagent_list - - for(var/A in cached_reagents) - var/datum/reagent/R = A - if (R.id == reagent) - //clamp the removal amount to be between current reagent amount - //and zero, to prevent removing more than the holder has stored - amount = CLAMP(amount, 0, R.volume) - R.volume -= amount - update_total() - if(!safety)//So it does not handle reactions when it need not to - handle_reactions() - if(my_atom) - my_atom.on_reagent_change(REM_REAGENT) - return TRUE - - return FALSE - -/datum/reagents/proc/has_reagent(reagent, amount = -1) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if (R.id == reagent) - if(!amount) - return R - else - if(R.volume >= amount) - return R - else - return 0 - - return 0 - -/datum/reagents/proc/get_reagent_amount(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if (R.id == reagent) - return R.volume - - return 0 - -/datum/reagents/proc/get_reagents() - var/list/names = list() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - names += R.name - - return jointext(names, ",") - -/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. - if(!isnum(amount)) - return 1 - var/list/cached_reagents = reagent_list - var/has_removed_reagent = 0 - - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - var/matches = 0 - // Switch between how we check the reagent type - if(strict) - if(R.type == reagent_type) - matches = 1 - else - if(istype(R, reagent_type)) - matches = 1 - // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. - if(matches) - // Have our other proc handle removement - has_removed_reagent = remove_reagent(R.id, amount, safety) - - return has_removed_reagent - -//two helper functions to preserve data across reactions (needed for xenoarch) -/datum/reagents/proc/get_data(reagent_id) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.id == reagent_id) - return R.data - -/datum/reagents/proc/set_data(reagent_id, new_data) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.id == reagent_id) - R.data = new_data - -/datum/reagents/proc/copy_data(datum/reagent/current_reagent) - if(!current_reagent || !current_reagent.data) - return null - if(!istype(current_reagent.data, /list)) - return current_reagent.data - - var/list/trans_data = current_reagent.data.Copy() - - // We do this so that introducing a virus to a blood sample - // doesn't automagically infect all other blood samples from - // the same donor. - // - // Technically we should probably copy all data lists, but - // that could possibly eat up a lot of memory needlessly - // if most data lists are read-only. - if(trans_data["viruses"]) - var/list/v = trans_data["viruses"] - trans_data["viruses"] = v.Copy() - - return trans_data - -/datum/reagents/proc/get_reagent(type) - var/list/cached_reagents = reagent_list - . = locate(type) in cached_reagents - -/datum/reagents/proc/generate_taste_message(minimum_percent=15) - // the lower the minimum percent, the more sensitive the message is. - var/list/out = list() - var/list/tastes = list() //descriptor = strength - if(minimum_percent <= 100) - for(var/datum/reagent/R in reagent_list) - if(!R.taste_mult) - continue - - if(istype(R, /datum/reagent/consumable/nutriment)) - var/list/taste_data = R.data - for(var/taste in taste_data) - var/ratio = taste_data[taste] - var/amount = ratio * R.taste_mult * R.volume - if(taste in tastes) - tastes[taste] += amount - else - tastes[taste] = amount - else - var/taste_desc = R.taste_description - var/taste_amount = R.volume * R.taste_mult - if(taste_desc in tastes) - tastes[taste_desc] += taste_amount - else - tastes[taste_desc] = taste_amount - //deal with percentages - // TODO it would be great if we could sort these from strong to weak - var/total_taste = counterlist_sum(tastes) - if(total_taste > 0) - for(var/taste_desc in tastes) - var/percent = tastes[taste_desc]/total_taste * 100 - if(percent < minimum_percent) - continue - var/intensity_desc = "a hint of" - if(percent > minimum_percent * 2 || percent == 100) - intensity_desc = "" - else if(percent > minimum_percent * 3) - intensity_desc = "the strong flavor of" - if(intensity_desc != "") - out += "[intensity_desc] [taste_desc]" - else - out += "[taste_desc]" - - return english_list(out, "something indescribable") - -/datum/reagents/proc/expose_temperature(var/temperature, var/coeff=0.02) - var/temp_delta = (temperature - chem_temp) * coeff - if(temp_delta > 0) - chem_temp = min(chem_temp + max(temp_delta, 1), temperature) - else - chem_temp = max(chem_temp + min(temp_delta, -1), temperature) - chem_temp = round(chem_temp) - handle_reactions() - -/////////////////////////////////////////////////////////////////////////////////// - - -// Convenience proc to create a reagents holder for an atom -// Max vol is maximum volume of holder -/atom/proc/create_reagents(max_vol) - if(reagents) - qdel(reagents) - reagents = new/datum/reagents(max_vol) - reagents.my_atom = src - -/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents - var/static/list/random_reagents = list() - if(!random_reagents.len) - for(var/thing in subtypesof(/datum/reagent)) - var/datum/reagent/R = thing - if(initial(R.can_synth)) - random_reagents += initial(R.id) - var/picked_reagent = pick(random_reagents) - return picked_reagent \ No newline at end of file diff --git a/code/modules/reagents/chemistry/holderBackup.dm b/code/modules/reagents/chemistry/holderBackup.dm deleted file mode 100644 index b434b348f0..0000000000 --- a/code/modules/reagents/chemistry/holderBackup.dm +++ /dev/null @@ -1,952 +0,0 @@ - -/proc/build_chemical_reagent_list() - //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id - - if(GLOB.chemical_reagents_list) - return - - var/paths = subtypesof(/datum/reagent) - GLOB.chemical_reagents_list = list() - - for(var/path in paths) - var/datum/reagent/D = new path() - GLOB.chemical_reagents_list[D.id] = D - -/proc/build_chemical_reactions_list() - //Chemical Reactions - Initialises all /datum/chemical_reaction into a list - // It is filtered into multiple lists within a list. - // For example: - // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma - - if(GLOB.chemical_reactions_list) - return - - var/paths = subtypesof(/datum/chemical_reaction) - GLOB.chemical_reactions_list = list() - - for(var/path in paths) - - var/datum/chemical_reaction/D = new path() - var/list/reaction_ids = list() - - if(D.required_reagents && D.required_reagents.len) - for(var/reaction in D.required_reagents) - reaction_ids += reaction - - // Create filters based on each reagent id in the required reagents list - for(var/id in reaction_ids) - if(!GLOB.chemical_reactions_list[id]) - GLOB.chemical_reactions_list[id] = list() - GLOB.chemical_reactions_list[id] += D - break // Don't bother adding ourselves to other reagent ids, it is redundant - -/////////////////////////////////////////////////////////////////////////////////// - -/datum/reagents - var/list/datum/reagent/reagent_list = new/list() - var/total_volume = 0 - var/maximum_volume = 100 - var/atom/my_atom = null - var/chem_temp = 150 - var/pH = REAGENT_NORMAL_PH - var/last_tick = 1 - var/addiction_tick = 1 - var/list/datum/reagent/addiction_list = new/list() - var/reagents_holder_flags - -/datum/reagents/New(maximum=100) - maximum_volume = maximum - - //I dislike having these here but map-objects are initialised before world/New() is called. >_> - if(!GLOB.chemical_reagents_list) - build_chemical_reagent_list() - if(!GLOB.chemical_reactions_list) - build_chemical_reactions_list() - -/datum/reagents/Destroy() - . = ..() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - qdel(R) - cached_reagents.Cut() - cached_reagents = null - if(my_atom && my_atom.reagents == src) - my_atom.reagents = null - my_atom = null - -// Used in attack logs for reagents in pills and such -/datum/reagents/proc/log_list() - if(!length(reagent_list)) - return "no reagents" - - var/list/data = list() - for(var/r in reagent_list) //no reagents will be left behind - var/datum/reagent/R = r - data += "[R.id] ([round(R.volume, 0.1)]u)" - //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. - return english_list(data) - -/datum/reagents/proc/remove_any(amount = 1) - var/list/cached_reagents = reagent_list - var/total_transfered = 0 - var/current_list_element = 1 - - current_list_element = rand(1, cached_reagents.len) - - while(total_transfered != amount) - if(total_transfered >= amount) - break - if(total_volume <= 0 || !cached_reagents.len) - break - - if(current_list_element > cached_reagents.len) - current_list_element = 1 - - var/datum/reagent/R = cached_reagents[current_list_element] - remove_reagent(R.id, 1) - - current_list_element++ - total_transfered++ - update_total() - - handle_reactions() - return total_transfered - -/datum/reagents/proc/remove_all(amount = 1) - var/list/cached_reagents = reagent_list - if(total_volume > 0) - var/part = amount / total_volume - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - remove_reagent(R.id, R.volume * part) - - update_total() - handle_reactions() - return amount - -/datum/reagents/proc/get_master_reagent_name() - var/list/cached_reagents = reagent_list - var/name - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - name = R.name - - return name - -/datum/reagents/proc/get_master_reagent_id() - var/list/cached_reagents = reagent_list - var/id - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - id = R.id - - return id - -/datum/reagents/proc/get_master_reagent() - var/list/cached_reagents = reagent_list - var/datum/reagent/master - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - master = R - - return master - -/datum/reagents/proc/trans_to(obj/target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. - var/list/cached_reagents = reagent_list - if(!target || !total_volume) - return - if(amount < 0) - return - - var/datum/reagents/R - if(istype(target, /datum/reagents)) - R = target - else - if(!target.reagents) - return - R = target.reagents - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - var/part = amount / src.total_volume - var/trans_data = null - for(var/reagent in cached_reagents) - var/datum/reagent/T = reagent - var/transfer_amount = T.volume * part - if(preserve_data) - trans_data = copy_data(T) - - //fermichem Added ph TODO: add T.purity - R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. - //R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. - remove_reagent(T.id, transfer_amount) - - update_total() - R.update_total() - if(!no_react) - R.handle_reactions() - src.handle_reactions() - return amount - -/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1) - var/list/cached_reagents = reagent_list - if(!target || !total_volume) - return - - var/datum/reagents/R - if(istype(target, /datum/reagents)) - R = target - else - if(!target.reagents) - return - R = target.reagents - - if(amount < 0) - return - amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) - var/part = amount / total_volume - var/trans_data = null - for(var/reagent in cached_reagents) - var/datum/reagent/T = reagent - var/copy_amount = T.volume * part - if(preserve_data) - trans_data = T.data - R.add_reagent(T.id, copy_amount * multiplier, trans_data) - - src.update_total() - R.update_total() - R.handle_reactions() - src.handle_reactions() - return amount - -/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N - var/list/cached_reagents = reagent_list - if (!target) - return - if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) - return - if(amount < 0) - return - - var/datum/reagents/R = target.reagents - if(src.get_reagent_amount(reagent)= R.overdose_threshold && !R.overdosed) - R.overdosed = 1 - need_mob_update += R.overdose_start(C) - if(R.addiction_threshold) - if(R.volume >= R.addiction_threshold && !is_type_in_list(R, cached_addictions)) - var/datum/reagent/new_reagent = new R.type() - cached_addictions.Add(new_reagent) - if(R.overdosed) - need_mob_update += R.overdose_process(C) - if(is_type_in_list(R,cached_addictions)) - for(var/addiction in cached_addictions) - var/datum/reagent/A = addiction - if(istype(R, A)) - A.addiction_stage = -15 // you're satisfied for a good while. - need_mob_update += R.on_mob_life(C) - - if(can_overdose) - if(addiction_tick == 6) - addiction_tick = 1 - for(var/addiction in cached_addictions) - var/datum/reagent/R = addiction - if(C && R) - R.addiction_stage++ - if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end) - need_mob_update += R.addiction_act_stage1(C) - else if(R.addiction_stage1_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end) - need_mob_update += R.addiction_act_stage2(C) - else if(R.addiction_stage2_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end) - need_mob_update += R.addiction_act_stage3(C) - else if(R.addiction_stage3_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end) - need_mob_update += R.addiction_act_stage4(C) - else if(R.addiction_stage4_end <= R.addiction_stage) - to_chat(C, "You feel like you've gotten over your need for [R.name].") - SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.id]_addiction") - cached_addictions.Remove(R) - addiction_tick++ - if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. - C.updatehealth() - C.update_canmove() - C.update_stamina() - update_total() - - -/datum/reagents/proc/set_reacting(react = TRUE) - if(react) - reagents_holder_flags &= ~(REAGENT_NOREACT) - else - reagents_holder_flags |= REAGENT_NOREACT - -/datum/reagents/proc/conditional_update_move(atom/A, Running = 0) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - R.on_move (A, Running) - update_total() - -/datum/reagents/proc/conditional_update(atom/A) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - R.on_update (A) - update_total() - -/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar - //FermiChem - var/purity = 1 - var/ammoReacted = 0 - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmmount = 0 - - var/list/cached_reagents = reagent_list //a list of the reagents? - var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? - var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! - if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. - return //Yup, no reactions here. No siree. - - var/reaction_occurred = 0 // checks if reaction, binary variable - do //What does do do in byond? It sounds very redundant? is it a while loop? - var/list/possible_reactions = list() //init list - reaction_occurred = 0 // sets it back to 0? - for(var/reagent in cached_reagents) //for reagent in beaker/holder - var/datum/reagent/R = reagent //check to make sure that reagent is there for the reaction list - for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id - if(!reaction) - continue - - var/datum/chemical_reaction/C = reaction - var/list/cached_required_reagents = C.required_reagents - var/total_required_reagents = cached_required_reagents.len - var/total_matching_reagents = 0 - var/list/cached_required_catalysts = C.required_catalysts - var/total_required_catalysts = cached_required_catalysts.len - var/total_matching_catalysts= 0 - var/matching_container = 0 - var/matching_other = 0 - var/required_temp = C.required_temp - var/is_cold_recipe = C.is_cold_recipe - var/meets_temp_requirement = 0 - var/has_special_react = C.special_react - var/can_special_react = 0 - //FermiChem WHY ARE VARIBLES SO ESTRANGED it makes me sad - var/OptimalTempMin = C.OptimalTempMin // Lower area of bell curve for determining heat based rate reactions - var/OptimalTempMax = C.OptimalTempMax - var/ExplodeTemp = C.ExplodeTemp - var/OptimalpHMin = C.OptimalpHMin - var/OptimalpHMax = C.OptimalpHMax - var/ReactpHLim = C.ReactpHLim - //var/CatalystFact = C.CatalystFact - var/CurveSharpT = C.CurveSharpT - var/CurveSharppH = C.CurveSharppH - var/ThermicConstant = C.ThermicConstant - var/HIonRelease = C.HIonRelease - var/RateUpLim = C.RateUpLim - var/FermiChem = C.FermiChem - var/FermiExplode = C.FermiExplode - var/ImpureChem = C.ImpureChem - - //FermiChem - /* - var/purity = 1 - var/ammoReacted = 0 - - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmmount = 0 - */ - - for(var/B in cached_required_reagents) - if(!has_reagent(B, cached_required_reagents[B])) - break - total_matching_reagents++ - for(var/B in cached_required_catalysts) - if(!has_reagent(B, cached_required_catalysts[B])) - break - total_matching_catalysts++ - if(cached_my_atom) - if(!C.required_container) - matching_container = 1 - - else - if(cached_my_atom.type == C.required_container)//if the suspected container is a container - matching_container = 1 - if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs - return - if(!C.required_other)//Checks for other things required - matching_other = 1//binary check passes - - else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem - var/obj/item/slime_extract/M = cached_my_atom - - if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1 - else - if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? Oh, cyro. - matching_container = 1 - if(!C.required_other) - matching_other = 1 - - //FermiChem - - if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! - meets_temp_requirement = 1//binary pass - - if(!has_special_react || C.check_special_react(src)) - can_special_react = 1 - - if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react) - possible_reactions += C - - if(possible_reactions.len)//does list exist? - var/datum/chemical_reaction/selected_reaction = possible_reactions[1] - //select the reaction with the most extreme temperature requirements - for(var/V in possible_reactions)//why V, surely that would indicate volume? V is the reaction potential. - var/datum/chemical_reaction/competitor = V //competitor? I think this is theres two of them. Troubling..! - if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. - if(competitor.required_temp <= selected_reaction.required_temp)//only returns with lower if reaction "is cold" var. - selected_reaction = competitor - else - if(competitor.required_temp >= selected_reaction.required_temp) //will return with the hotter reacting first. - selected_reaction = competitor - var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list - var/list/cached_results = selected_reaction.results//resultant chemical list - var/special_react_result = selected_reaction.check_special_react(src) - var/list/multiplier = INFINITY //Wat - - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - - //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. - //FermiChem relies on two additional properties; pH and impurity - //Temperature plays into a larger role too. - if (C.FermiChem == TRUE) - message_admins("Hee!!!! Someone is doing a Fermi reaction!!! I'm so excited!!") - //FermiReact(C) - //B is Beaker - //P is product - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - - while (ammoReacted < multiplier) - //Begin Parse - - //Check extremes first - if (chem_temp > ExplodeTemp) - //go to explode proc - FermiExplode() - - if (pH > 14 || pH < 0) - //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - FermiExplode() - - //For now, purity is handled elsewhere - - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMax)**C.CurveSharpT)) - else if (chem_temp >= C.OptimalTempMax) - deltaT = 1 - else - deltaT = 0 - - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < C.OptimalpHMin) - if (pH < (C.OptimalpHMin - C.ReactpHLim)) - deltapH = 0 - else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharp)/(C.ReactpHLim**C.CurveSharppH)) - //Upper range - else if (pH > C.OptimalpHMin) - if (pH > (C.OptimalpHMin + C.ReactpHLim)) - deltapH = 0 - else - deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) - //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) - deltapH = 1 - //This should never proc: - else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") - WARNING("[my_atom] attempted to determine FermiChem pH for '[reagent]' which broke for some reason! ([usr])") - //TODO Add CatalystFact - - stepChemAmmount = multiplier * deltaT - if (ammoReacted > 0) - P.purity = ((P.purity * ammoReacted) + (deltapH * stepChemAmmount)) /(2 * (ammoReacted + stepChemAmmount)) //This should add the purity to the product - else - P.purity = deltapH - //Apply pH changes and thermal output of reaction to beaker - chem_temp += (C.ThermicConstant * stepChemAmmount) - pH += (C.HIonRelease * stepChemAmmount) - - // End. - - selected_reaction.on_reaction(src, multiplier, special_react_result) - - for(var/B in cached_required_reagents) - remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: - - - ammoReacted = ammoReacted + stepChemAmmount - - reaction_occurred = 1 - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", cached_results[P]*ammoReacted, P)//log - //Standard reaction mechanics: - else: - - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - - for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log - add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: - - - var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers - var/iconhtml = icon2html(cached_my_atom, seen) - if(cached_my_atom) - if(!ismob(cached_my_atom)) // No bubbling mobs - if(selected_reaction.mix_sound) - playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) - - for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") - - if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." - - selected_reaction.on_reaction(src, multiplier, special_react_result) - reaction_occurred = 1 - - while(reaction_occurred)//while do nothing? - update_total()//Don't know waht this does. - return 0//end! - -/datum/reagents/proc/FermiReact() - return - -/datum/reagents/proc/FermiExplode() - return - -/datum/reagents/proc/isolate_reagent(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if(R.id != reagent) - del_reagent(R.id) - update_total() - -/datum/reagents/proc/del_reagent(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if(R.id == reagent) - if(my_atom && isliving(my_atom)) - var/mob/living/M = my_atom - R.on_mob_delete(M) - qdel(R) - reagent_list -= R - update_total() - if(my_atom) - my_atom.on_reagent_change(DEL_REAGENT) - return 1 - -/datum/reagents/proc/update_total() - var/list/cached_reagents = reagent_list - total_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume < 0.1) - del_reagent(R.id) - else - total_volume += R.volume - - return 0 - -/datum/reagents/proc/clear_reagents() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - del_reagent(R.id) - return 0 - -/datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1) - var/react_type - if(isliving(A)) - react_type = "LIVING" - if(method == INGEST) - var/mob/living/L = A - L.taste(src) - else if(isturf(A)) - react_type = "TURF" - else if(isobj(A)) - react_type = "OBJ" - else - return - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - switch(react_type) - if("LIVING") - var/touch_protection = 0 - if(method == VAPOR) - var/mob/living/L = A - touch_protection = L.get_permeability_protection() - R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection) - if("TURF") - R.reaction_turf(A, R.volume * volume_modifier, show_message) - if("OBJ") - R.reaction_obj(A, R.volume * volume_modifier, show_message) - -/datum/reagents/proc/holder_full() - if(total_volume >= maximum_volume) - return TRUE - return FALSE - -//Returns the average specific heat for all reagents currently in this holder. -/datum/reagents/proc/specific_heat() - . = 0 - var/cached_amount = total_volume //cache amount - var/list/cached_reagents = reagent_list //cache reagents - for(var/I in cached_reagents) - var/datum/reagent/R = I - . += R.specific_heat * (R.volume / cached_amount) - -/datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) - var/S = specific_heat() - chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) - -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, pH = 7, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ - if(!isnum(amount) || !amount) - return FALSE - - if(amount <= 0) - return FALSE - - var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] - if(!D) - WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") - return FALSE - - update_total() - var/cached_total = total_volume - if(cached_total + amount > maximum_volume) - amount = (maximum_volume - cached_total) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. - if(amount <= 0) - return FALSE - var/new_total = cached_total + amount - var/cached_temp = chem_temp - var/list/cached_reagents = reagent_list - - //Equalize temperature - Not using specific_heat() because the new chemical isn't in yet. - var/specific_heat = 0 - var/thermal_energy = 0 - for(var/i in cached_reagents) - var/datum/reagent/R = i - specific_heat += R.specific_heat * (R.volume / new_total) - thermal_energy += R.specific_heat * R.volume * cached_temp - specific_heat += D.specific_heat * (amount / new_total) - thermal_energy += D.specific_heat * amount * reagtemp - chem_temp = thermal_energy / (specific_heat * new_total) - //// - - //add the reagent to the existing if it exists - for(var/A in cached_reagents) - var/datum/reagent/R = A - if (R.id == reagent) - R.volume += amount - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - R.on_merge(data, amount) - if(!no_react) - handle_reactions() - return TRUE - - //otherwise make a new one - var/datum/reagent/R = new D.type(data) - cached_reagents += R - R.holder = src - R.volume = amount - if(data) - R.data = data - R.on_new(data) - - if(isliving(my_atom)) - R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - if(!no_react) - handle_reactions() - return TRUE - -/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) - for(var/r_id in list_reagents) - var/amt = list_reagents[r_id] - add_reagent(r_id, amt, data) - -/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to - - if(isnull(amount)) - amount = 0 - CRASH("null amount passed to reagent code") - return FALSE - - if(!isnum(amount)) - return FALSE - - if(amount < 0) - return FALSE - - var/list/cached_reagents = reagent_list - - for(var/A in cached_reagents) - var/datum/reagent/R = A - if (R.id == reagent) - //clamp the removal amount to be between current reagent amount - //and zero, to prevent removing more than the holder has stored - amount = CLAMP(amount, 0, R.volume) - R.volume -= amount - update_total() - if(!safety)//So it does not handle reactions when it need not to - handle_reactions() - if(my_atom) - my_atom.on_reagent_change(REM_REAGENT) - return TRUE - - return FALSE - -/datum/reagents/proc/has_reagent(reagent, amount = -1) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if (R.id == reagent) - if(!amount) - return R - else - if(R.volume >= amount) - return R - else - return 0 - - return 0 - -/datum/reagents/proc/get_reagent_amount(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if (R.id == reagent) - return R.volume - - return 0 - -/datum/reagents/proc/get_reagents() - var/list/names = list() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - names += R.name - - return jointext(names, ",") - -/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. - if(!isnum(amount)) - return 1 - var/list/cached_reagents = reagent_list - var/has_removed_reagent = 0 - - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - var/matches = 0 - // Switch between how we check the reagent type - if(strict) - if(R.type == reagent_type) - matches = 1 - else - if(istype(R, reagent_type)) - matches = 1 - // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. - if(matches) - // Have our other proc handle removement - has_removed_reagent = remove_reagent(R.id, amount, safety) - - return has_removed_reagent - -//two helper functions to preserve data across reactions (needed for xenoarch) -/datum/reagents/proc/get_data(reagent_id) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.id == reagent_id) - return R.data - -/datum/reagents/proc/set_data(reagent_id, new_data) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.id == reagent_id) - R.data = new_data - -/datum/reagents/proc/copy_data(datum/reagent/current_reagent) - if(!current_reagent || !current_reagent.data) - return null - if(!istype(current_reagent.data, /list)) - return current_reagent.data - - var/list/trans_data = current_reagent.data.Copy() - - // We do this so that introducing a virus to a blood sample - // doesn't automagically infect all other blood samples from - // the same donor. - // - // Technically we should probably copy all data lists, but - // that could possibly eat up a lot of memory needlessly - // if most data lists are read-only. - if(trans_data["viruses"]) - var/list/v = trans_data["viruses"] - trans_data["viruses"] = v.Copy() - - return trans_data - -/datum/reagents/proc/get_reagent(type) - var/list/cached_reagents = reagent_list - . = locate(type) in cached_reagents - -/datum/reagents/proc/generate_taste_message(minimum_percent=15) - // the lower the minimum percent, the more sensitive the message is. - var/list/out = list() - var/list/tastes = list() //descriptor = strength - if(minimum_percent <= 100) - for(var/datum/reagent/R in reagent_list) - if(!R.taste_mult) - continue - - if(istype(R, /datum/reagent/consumable/nutriment)) - var/list/taste_data = R.data - for(var/taste in taste_data) - var/ratio = taste_data[taste] - var/amount = ratio * R.taste_mult * R.volume - if(taste in tastes) - tastes[taste] += amount - else - tastes[taste] = amount - else - var/taste_desc = R.taste_description - var/taste_amount = R.volume * R.taste_mult - if(taste_desc in tastes) - tastes[taste_desc] += taste_amount - else - tastes[taste_desc] = taste_amount - //deal with percentages - // TODO it would be great if we could sort these from strong to weak - var/total_taste = counterlist_sum(tastes) - if(total_taste > 0) - for(var/taste_desc in tastes) - var/percent = tastes[taste_desc]/total_taste * 100 - if(percent < minimum_percent) - continue - var/intensity_desc = "a hint of" - if(percent > minimum_percent * 2 || percent == 100) - intensity_desc = "" - else if(percent > minimum_percent * 3) - intensity_desc = "the strong flavor of" - if(intensity_desc != "") - out += "[intensity_desc] [taste_desc]" - else - out += "[taste_desc]" - - return english_list(out, "something indescribable") - -/datum/reagents/proc/expose_temperature(var/temperature, var/coeff=0.02) - var/temp_delta = (temperature - chem_temp) * coeff - if(temp_delta > 0) - chem_temp = min(chem_temp + max(temp_delta, 1), temperature) - else - chem_temp = max(chem_temp + min(temp_delta, -1), temperature) - chem_temp = round(chem_temp) - handle_reactions() - -/////////////////////////////////////////////////////////////////////////////////// - - -// Convenience proc to create a reagents holder for an atom -// Max vol is maximum volume of holder -/atom/proc/create_reagents(max_vol) - if(reagents) - qdel(reagents) - reagents = new/datum/reagents(max_vol) - reagents.my_atom = src - -/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents - var/static/list/random_reagents = list() - if(!random_reagents.len) - for(var/thing in subtypesof(/datum/reagent)) - var/datum/reagent/R = thing - if(initial(R.can_synth)) - random_reagents += initial(R.id) - var/picked_reagent = pick(random_reagents) - return picked_reagent diff --git a/code/modules/reagents/chemistry/holderProcBackup.dm b/code/modules/reagents/chemistry/holderProcBackup.dm deleted file mode 100644 index 02ebbc5096..0000000000 --- a/code/modules/reagents/chemistry/holderProcBackup.dm +++ /dev/null @@ -1,1003 +0,0 @@ - -/proc/build_chemical_reagent_list() - //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id - - if(GLOB.chemical_reagents_list) - return - - var/paths = subtypesof(/datum/reagent) - GLOB.chemical_reagents_list = list() - - for(var/path in paths) - var/datum/reagent/D = new path() - GLOB.chemical_reagents_list[D.id] = D - -/proc/build_chemical_reactions_list() - //Chemical Reactions - Initialises all /datum/chemical_reaction into a list - // It is filtered into multiple lists within a list. - // For example: - // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma - - if(GLOB.chemical_reactions_list) - return - - var/paths = subtypesof(/datum/chemical_reaction) - GLOB.chemical_reactions_list = list() - - for(var/path in paths) - - var/datum/chemical_reaction/D = new path() - var/list/reaction_ids = list() - - if(D.required_reagents && D.required_reagents.len) - for(var/reaction in D.required_reagents) - reaction_ids += reaction - - // Create filters based on each reagent id in the required reagents list - for(var/id in reaction_ids) - if(!GLOB.chemical_reactions_list[id]) - GLOB.chemical_reactions_list[id] = list() - GLOB.chemical_reactions_list[id] += D - break // Don't bother adding ourselves to other reagent ids, it is redundant - -/////////////////////////////////////////////////////////////////////////////////// - -/datum/reagents - var/list/datum/reagent/reagent_list = new/list() - var/total_volume = 0 - var/maximum_volume = 100 - var/atom/my_atom = null - var/chem_temp = 150 - var/pH = REAGENT_NORMAL_PH - var/last_tick = 1 - var/addiction_tick = 1 - var/list/datum/reagent/addiction_list = new/list() - var/reagents_holder_flags - var/targetVol = 0 - var/reactedVol = 0 - var/fermiIsReacting = FALSE - var/fermiReactID = null - -/datum/reagents/New(maximum=100) - maximum_volume = maximum - - //I dislike having these here but map-objects are initialised before world/New() is called. >_> - if(!GLOB.chemical_reagents_list) - build_chemical_reagent_list() - if(!GLOB.chemical_reactions_list) - build_chemical_reactions_list() - -/datum/reagents/Destroy() - . = ..() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - qdel(R) - cached_reagents.Cut() - cached_reagents = null - if(my_atom && my_atom.reagents == src) - my_atom.reagents = null - my_atom = null - -// Used in attack logs for reagents in pills and such -/datum/reagents/proc/log_list() - if(!length(reagent_list)) - return "no reagents" - - var/list/data = list() - for(var/r in reagent_list) //no reagents will be left behind - var/datum/reagent/R = r - data += "[R.id] ([round(R.volume, 0.1)]u)" - //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. - return english_list(data) - -/datum/reagents/proc/remove_any(amount = 1) - var/list/cached_reagents = reagent_list - var/total_transfered = 0 - var/current_list_element = 1 - - current_list_element = rand(1, cached_reagents.len) - - while(total_transfered != amount) - if(total_transfered >= amount) - break - if(total_volume <= 0 || !cached_reagents.len) - break - - if(current_list_element > cached_reagents.len) - current_list_element = 1 - - var/datum/reagent/R = cached_reagents[current_list_element] - remove_reagent(R.id, 1) - - current_list_element++ - total_transfered++ - update_total() - - handle_reactions() - return total_transfered - -/datum/reagents/proc/remove_all(amount = 1) - var/list/cached_reagents = reagent_list - if(total_volume > 0) - var/part = amount / total_volume - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - remove_reagent(R.id, R.volume * part) - - update_total() - handle_reactions() - return amount - -/datum/reagents/proc/get_master_reagent_name() - var/list/cached_reagents = reagent_list - var/name - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - name = R.name - - return name - -/datum/reagents/proc/get_master_reagent_id() - var/list/cached_reagents = reagent_list - var/id - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - id = R.id - - return id - -/datum/reagents/proc/get_master_reagent() - var/list/cached_reagents = reagent_list - var/datum/reagent/master - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - master = R - - return master - -/datum/reagents/proc/trans_to(obj/target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. - var/list/cached_reagents = reagent_list - if(!target || !total_volume) - return - if(amount < 0) - return - - var/datum/reagents/R - if(istype(target, /datum/reagents)) - R = target - else - if(!target.reagents) - return - R = target.reagents - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - var/part = amount / src.total_volume - var/trans_data = null - for(var/reagent in cached_reagents) - var/datum/reagent/T = reagent - var/transfer_amount = T.volume * part - if(preserve_data) - trans_data = copy_data(T) - - //fermichem Added ph TODO: add T.purity - R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. - //R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. - remove_reagent(T.id, transfer_amount) - - update_total() - R.update_total() - if(!no_react) - R.handle_reactions() - src.handle_reactions() - return amount - -/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1) - var/list/cached_reagents = reagent_list - if(!target || !total_volume) - return - - var/datum/reagents/R - if(istype(target, /datum/reagents)) - R = target - else - if(!target.reagents) - return - R = target.reagents - - if(amount < 0) - return - amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) - var/part = amount / total_volume - var/trans_data = null - for(var/reagent in cached_reagents) - var/datum/reagent/T = reagent - var/copy_amount = T.volume * part - if(preserve_data) - trans_data = T.data - R.add_reagent(T.id, copy_amount * multiplier, trans_data) - - src.update_total() - R.update_total() - R.handle_reactions() - src.handle_reactions() - return amount - -/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N - var/list/cached_reagents = reagent_list - if (!target) - return - if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) - return - if(amount < 0) - return - - var/datum/reagents/R = target.reagents - if(src.get_reagent_amount(reagent)= R.overdose_threshold && !R.overdosed) - R.overdosed = 1 - need_mob_update += R.overdose_start(C) - if(R.addiction_threshold) - if(R.volume >= R.addiction_threshold && !is_type_in_list(R, cached_addictions)) - var/datum/reagent/new_reagent = new R.type() - cached_addictions.Add(new_reagent) - if(R.overdosed) - need_mob_update += R.overdose_process(C) - if(is_type_in_list(R,cached_addictions)) - for(var/addiction in cached_addictions) - var/datum/reagent/A = addiction - if(istype(R, A)) - A.addiction_stage = -15 // you're satisfied for a good while. - need_mob_update += R.on_mob_life(C) - - if(can_overdose) - if(addiction_tick == 6) - addiction_tick = 1 - for(var/addiction in cached_addictions) - var/datum/reagent/R = addiction - if(C && R) - R.addiction_stage++ - if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end) - need_mob_update += R.addiction_act_stage1(C) - else if(R.addiction_stage1_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end) - need_mob_update += R.addiction_act_stage2(C) - else if(R.addiction_stage2_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end) - need_mob_update += R.addiction_act_stage3(C) - else if(R.addiction_stage3_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end) - need_mob_update += R.addiction_act_stage4(C) - else if(R.addiction_stage4_end <= R.addiction_stage) - to_chat(C, "You feel like you've gotten over your need for [R.name].") - SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.id]_addiction") - cached_addictions.Remove(R) - addiction_tick++ - if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. - C.updatehealth() - C.update_canmove() - C.update_stamina() - update_total() - - -/datum/reagents/proc/set_reacting(react = TRUE) - if(react) - reagents_holder_flags &= ~(REAGENT_NOREACT) - else - reagents_holder_flags |= REAGENT_NOREACT - -/datum/reagents/proc/conditional_update_move(atom/A, Running = 0) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - R.on_move (A, Running) - update_total() - -/datum/reagents/proc/conditional_update(atom/A) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - R.on_update (A) - update_total() - -/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar - var/list/cached_reagents = reagent_list //a list of the reagents? - var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? - var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! - if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. - return //Yup, no reactions here. No siree. - - var/reaction_occurred = 0 // checks if reaction, binary variable - var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. - - if(fermiIsReacting == TRUE) - if (reactedVol >= targetVol && targetVol != 0) - STOP_PROCESSING(SSfastprocess, src) - fermiIsReacting = FALSE - message_admins("FermiChem processing stopped") - reaction_occurred = 1 - return - - - - do //What does do do in byond? It sounds very redundant? is it a while loop? - var/list/possible_reactions = list() //init list - reaction_occurred = 0 // sets it back to 0? - for(var/reagent in cached_reagents) //for reagent in beaker/holder - var/datum/reagent/R = reagent //check to make sure that reagent is there for the reaction list - for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id - if(!reaction) - continue - - var/datum/chemical_reaction/C = reaction - var/list/cached_required_reagents = C.required_reagents - var/total_required_reagents = cached_required_reagents.len - var/total_matching_reagents = 0 - var/list/cached_required_catalysts = C.required_catalysts - var/total_required_catalysts = cached_required_catalysts.len - var/total_matching_catalysts= 0 - var/matching_container = 0 - var/matching_other = 0 - var/required_temp = C.required_temp - var/is_cold_recipe = C.is_cold_recipe - var/meets_temp_requirement = 0 - var/has_special_react = C.special_react - var/can_special_react = 0 - - - for(var/B in cached_required_reagents) - if(!has_reagent(B, cached_required_reagents[B])) - break - total_matching_reagents++ - for(var/B in cached_required_catalysts) - if(!has_reagent(B, cached_required_catalysts[B])) - break - total_matching_catalysts++ - if(cached_my_atom) - if(!C.required_container) - matching_container = 1 - - else - if(cached_my_atom.type == C.required_container)//if the suspected container is a container - matching_container = 1 - if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs - return - if(!C.required_other)//Checks for other things required - matching_other = 1//binary check passes - - else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem - var/obj/item/slime_extract/M = cached_my_atom - - if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1 - else - if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? Oh, cyro. - matching_container = 1 - if(!C.required_other) - matching_other = 1 - - //FermiChem - /* - if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! - if (C.FermiExplode == TRUE) - //To be added! - else - FermiExplode() - //explode function!! - */ - - if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! - meets_temp_requirement = 1//binary pass - - if(!has_special_react || C.check_special_react(src)) - can_special_react = 1 - - if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react) - possible_reactions += C - - if(possible_reactions.len)//does list exist? - var/datum/chemical_reaction/selected_reaction = possible_reactions[1] - //select the reaction with the most extreme temperature requirements - for(var/V in possible_reactions)//why V, surely that would indicate volume? V is the reaction potential. - var/datum/chemical_reaction/competitor = V //competitor? I think this is theres two of them. Troubling..! - if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. - if(competitor.required_temp <= selected_reaction.required_temp)//only returns with lower if reaction "is cold" var. - selected_reaction = competitor - else - if(competitor.required_temp >= selected_reaction.required_temp) //will return with the hotter reacting first. - selected_reaction = competitor - var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list - var/list/cached_results = selected_reaction.results//resultant chemical list - var/special_react_result = selected_reaction.check_special_react(src) - var/list/multiplier = INFINITY //Wat - - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - - //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. - //FermiChem relies on two additional properties; pH and impurity - //Temperature plays into a larger role too. - //BRANCH HERE - //if(selected_reaction) - var/datum/chemical_reaction/C = selected_reaction - - if (C.FermiChem == TRUE && !continue_reacting) - message_admins("FermiChem Proc'd") - reaction_occurred = 1 - - for(var/P in selected_reaction.results) - targetVol = cached_results[P]*multiplier - - if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions - if (reactedVol < targetVol) - //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) - START_PROCESSING(SSfastprocess, src) - message_admins("FermiChem processing started") - fermiIsReacting = TRUE - fermiReactID = selected_reaction - else - fermiIsReacting = FALSE - STOP_PROCESSING(SSfastprocess, src) - else - return - - - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", reactedVol, C.id)//log - - //Standard reaction mechanics: - else - - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - - for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log - add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: - - - var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers - var/iconhtml = icon2html(cached_my_atom, seen) - if(cached_my_atom) - if(!ismob(cached_my_atom)) // No bubbling mobs - if(selected_reaction.mix_sound) - playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) - - for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") - - if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." - - selected_reaction.on_reaction(src, multiplier, special_react_result) - reaction_occurred = 1 - continue_reacting = TRUE - - while(reaction_occurred)//while do nothing? - update_total()//Don't know waht this does. - return 0//end! - -/datum/reagents/process() - if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions - if (reactedVol < targetVol) - reactedVol = FermiReact(fermiReactID, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) - else - STOP_PROCESSING(SSfastprocess, src) - //handle_reactions() - -/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) - var/datum/chemical_reaction/C = selected_reaction - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmmount = 0 - //var/ammoReacted = 0 - //get purity from combined beaker reactant purities HERE. - var/purity = 1 - //var/tempVol = totalVol - //var/list/multiplier = INFINITY - - message_admins("Loop beginning") - //Begin Parse - - //Check extremes first - if (chem_temp > C.ExplodeTemp) - //go to explode proc - message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") - FermiExplode() - - if (pH > 14 || pH < 0) - //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - message_admins("pH is lover limit, cur pH: [pH]") - FermiExplode() - - //For now, purity is handled elsewhere - - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) - else if (chem_temp >= C.OptimalTempMax) - deltaT = 1 - else - deltaT = 0 - message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") - - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < C.OptimalpHMin) - if (pH < (C.OptimalpHMin - C.ReactpHLim)) - deltapH = 0 - else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) - //Upper range - else if (pH > C.OptimalpHMin) - if (pH > (C.OptimalpHMin + C.ReactpHLim)) - deltapH = 0 - else - deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) - //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) - deltapH = 1 - //This should never proc: - else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") - WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") - //TODO Add CatalystFact - message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") - - stepChemAmmount = targetVol * deltaT - if (stepChemAmmount > C.RateUpLim) - stepChemAmmount = C.RateUpLim - else if (stepChemAmmount < 0.01) - stepChemAmmount = 0.01 - - if ((reactedVol + stepChemAmmount) > targetVol) - stepChemAmmount = targetVol - reactedVol - message_admins("target volume reached. Reaction should stop after this loop") - - if (reactedVol > 0) - purity = ((purity * reactedVol) + (deltapH * stepChemAmmount)) /((reactedVol+ stepChemAmmount)) //This should add the purity to the product - else - purity = deltapH - message_admins("purity: [purity], purity of beaker") - message_admins("Temp before change: [chem_temp], pH after change: [pH]") - //Apply pH changes and thermal output of reaction to beaker - chem_temp += (C.ThermicConstant * stepChemAmmount) - pH += (C.HIonRelease * stepChemAmmount) - message_admins("Temp after change: [chem_temp], pH after change: [pH]") - - // End. - /* - for(var/B in cached_required_reagents) // - tempVol = min(reactedVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - */ - message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]") - - - - for(var/B in cached_required_reagents) - message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]") - remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - - for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? - reactedVol = max(reactedVol, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: - - reactedVol = reactedVol + stepChemAmmount - - - return //(reactedVol) - -/datum/reagents/proc/FermiExplode() - return - -/datum/reagents/proc/isolate_reagent(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if(R.id != reagent) - del_reagent(R.id) - update_total() - -/datum/reagents/proc/del_reagent(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if(R.id == reagent) - if(my_atom && isliving(my_atom)) - var/mob/living/M = my_atom - R.on_mob_delete(M) - qdel(R) - reagent_list -= R - update_total() - if(my_atom) - my_atom.on_reagent_change(DEL_REAGENT) - return 1 - -/datum/reagents/proc/update_total() - var/list/cached_reagents = reagent_list - total_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume < 0.1) - del_reagent(R.id) - else - total_volume += R.volume - - return 0 - -/datum/reagents/proc/clear_reagents() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - del_reagent(R.id) - return 0 - -/datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1) - var/react_type - if(isliving(A)) - react_type = "LIVING" - if(method == INGEST) - var/mob/living/L = A - L.taste(src) - else if(isturf(A)) - react_type = "TURF" - else if(isobj(A)) - react_type = "OBJ" - else - return - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - switch(react_type) - if("LIVING") - var/touch_protection = 0 - if(method == VAPOR) - var/mob/living/L = A - touch_protection = L.get_permeability_protection() - R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection) - if("TURF") - R.reaction_turf(A, R.volume * volume_modifier, show_message) - if("OBJ") - R.reaction_obj(A, R.volume * volume_modifier, show_message) - -/datum/reagents/proc/holder_full() - if(total_volume >= maximum_volume) - return TRUE - return FALSE - -//Returns the average specific heat for all reagents currently in this holder. -/datum/reagents/proc/specific_heat() - . = 0 - var/cached_amount = total_volume //cache amount - var/list/cached_reagents = reagent_list //cache reagents - for(var/I in cached_reagents) - var/datum/reagent/R = I - . += R.specific_heat * (R.volume / cached_amount) - -/datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) - var/S = specific_heat() - chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) - -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, pH = 7, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ - if(!isnum(amount) || !amount) - return FALSE - - if(amount <= 0) - return FALSE - - var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] - if(!D) - WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") - return FALSE - - update_total() - var/cached_total = total_volume - if(cached_total + amount > maximum_volume) - amount = (maximum_volume - cached_total) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. - if(amount <= 0) - return FALSE - var/new_total = cached_total + amount - var/cached_temp = chem_temp - var/list/cached_reagents = reagent_list - - //Equalize temperature - Not using specific_heat() because the new chemical isn't in yet. - var/specific_heat = 0 - var/thermal_energy = 0 - for(var/i in cached_reagents) - var/datum/reagent/R = i - specific_heat += R.specific_heat * (R.volume / new_total) - thermal_energy += R.specific_heat * R.volume * cached_temp - specific_heat += D.specific_heat * (amount / new_total) - thermal_energy += D.specific_heat * amount * reagtemp - chem_temp = thermal_energy / (specific_heat * new_total) - //// - - //add the reagent to the existing if it exists - for(var/A in cached_reagents) - var/datum/reagent/R = A - if (R.id == reagent) - R.volume += amount - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - R.on_merge(data, amount) - if(!no_react) - handle_reactions() - return TRUE - - //otherwise make a new one - var/datum/reagent/R = new D.type(data) - cached_reagents += R - R.holder = src - R.volume = amount - if(data) - R.data = data - R.on_new(data) - - if(isliving(my_atom)) - R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - if(!no_react) - handle_reactions() - return TRUE - -/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) - for(var/r_id in list_reagents) - var/amt = list_reagents[r_id] - add_reagent(r_id, amt, data) - -/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to - - if(isnull(amount)) - amount = 0 - CRASH("null amount passed to reagent code") - return FALSE - - if(!isnum(amount)) - return FALSE - - if(amount < 0) - return FALSE - - var/list/cached_reagents = reagent_list - - for(var/A in cached_reagents) - var/datum/reagent/R = A - if (R.id == reagent) - //clamp the removal amount to be between current reagent amount - //and zero, to prevent removing more than the holder has stored - amount = CLAMP(amount, 0, R.volume) - R.volume -= amount - update_total() - if(!safety)//So it does not handle reactions when it need not to - handle_reactions() - if(my_atom) - my_atom.on_reagent_change(REM_REAGENT) - return TRUE - - return FALSE - -/datum/reagents/proc/has_reagent(reagent, amount = -1) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if (R.id == reagent) - if(!amount) - return R - else - if(R.volume >= amount) - return R - else - return 0 - - return 0 - -/datum/reagents/proc/get_reagent_amount(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if (R.id == reagent) - return R.volume - - return 0 - -/datum/reagents/proc/get_reagents() - var/list/names = list() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - names += R.name - - return jointext(names, ",") - -/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. - if(!isnum(amount)) - return 1 - var/list/cached_reagents = reagent_list - var/has_removed_reagent = 0 - - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - var/matches = 0 - // Switch between how we check the reagent type - if(strict) - if(R.type == reagent_type) - matches = 1 - else - if(istype(R, reagent_type)) - matches = 1 - // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. - if(matches) - // Have our other proc handle removement - has_removed_reagent = remove_reagent(R.id, amount, safety) - - return has_removed_reagent - -//two helper functions to preserve data across reactions (needed for xenoarch) -/datum/reagents/proc/get_data(reagent_id) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.id == reagent_id) - return R.data - -/datum/reagents/proc/set_data(reagent_id, new_data) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.id == reagent_id) - R.data = new_data - -/datum/reagents/proc/copy_data(datum/reagent/current_reagent) - if(!current_reagent || !current_reagent.data) - return null - if(!istype(current_reagent.data, /list)) - return current_reagent.data - - var/list/trans_data = current_reagent.data.Copy() - - // We do this so that introducing a virus to a blood sample - // doesn't automagically infect all other blood samples from - // the same donor. - // - // Technically we should probably copy all data lists, but - // that could possibly eat up a lot of memory needlessly - // if most data lists are read-only. - if(trans_data["viruses"]) - var/list/v = trans_data["viruses"] - trans_data["viruses"] = v.Copy() - - return trans_data - -/datum/reagents/proc/get_reagent(type) - var/list/cached_reagents = reagent_list - . = locate(type) in cached_reagents - -/datum/reagents/proc/generate_taste_message(minimum_percent=15) - // the lower the minimum percent, the more sensitive the message is. - var/list/out = list() - var/list/tastes = list() //descriptor = strength - if(minimum_percent <= 100) - for(var/datum/reagent/R in reagent_list) - if(!R.taste_mult) - continue - - if(istype(R, /datum/reagent/consumable/nutriment)) - var/list/taste_data = R.data - for(var/taste in taste_data) - var/ratio = taste_data[taste] - var/amount = ratio * R.taste_mult * R.volume - if(taste in tastes) - tastes[taste] += amount - else - tastes[taste] = amount - else - var/taste_desc = R.taste_description - var/taste_amount = R.volume * R.taste_mult - if(taste_desc in tastes) - tastes[taste_desc] += taste_amount - else - tastes[taste_desc] = taste_amount - //deal with percentages - // TODO it would be great if we could sort these from strong to weak - var/total_taste = counterlist_sum(tastes) - if(total_taste > 0) - for(var/taste_desc in tastes) - var/percent = tastes[taste_desc]/total_taste * 100 - if(percent < minimum_percent) - continue - var/intensity_desc = "a hint of" - if(percent > minimum_percent * 2 || percent == 100) - intensity_desc = "" - else if(percent > minimum_percent * 3) - intensity_desc = "the strong flavor of" - if(intensity_desc != "") - out += "[intensity_desc] [taste_desc]" - else - out += "[taste_desc]" - - return english_list(out, "something indescribable") - -/datum/reagents/proc/expose_temperature(var/temperature, var/coeff=0.02) - var/temp_delta = (temperature - chem_temp) * coeff - if(temp_delta > 0) - chem_temp = min(chem_temp + max(temp_delta, 1), temperature) - else - chem_temp = max(chem_temp + min(temp_delta, -1), temperature) - chem_temp = round(chem_temp) - handle_reactions() - -/////////////////////////////////////////////////////////////////////////////////// - - -// Convenience proc to create a reagents holder for an atom -// Max vol is maximum volume of holder -/atom/proc/create_reagents(max_vol) - if(reagents) - qdel(reagents) - reagents = new/datum/reagents(max_vol) - reagents.my_atom = src - -/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents - var/static/list/random_reagents = list() - if(!random_reagents.len) - for(var/thing in subtypesof(/datum/reagent)) - var/datum/reagent/R = thing - if(initial(R.can_synth)) - random_reagents += initial(R.id) - var/picked_reagent = pick(random_reagents) - return picked_reagent diff --git a/code/modules/reagents/chemistry/holderbk3.dm b/code/modules/reagents/chemistry/holderbk3.dm deleted file mode 100644 index 6c2f5a9876..0000000000 --- a/code/modules/reagents/chemistry/holderbk3.dm +++ /dev/null @@ -1,962 +0,0 @@ - -/proc/build_chemical_reagent_list() - //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id - - if(GLOB.chemical_reagents_list) - return - - var/paths = subtypesof(/datum/reagent) - GLOB.chemical_reagents_list = list() - - for(var/path in paths) - var/datum/reagent/D = new path() - GLOB.chemical_reagents_list[D.id] = D - -/proc/build_chemical_reactions_list() - //Chemical Reactions - Initialises all /datum/chemical_reaction into a list - // It is filtered into multiple lists within a list. - // For example: - // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma - - if(GLOB.chemical_reactions_list) - return - - var/paths = subtypesof(/datum/chemical_reaction) - GLOB.chemical_reactions_list = list() - - for(var/path in paths) - - var/datum/chemical_reaction/D = new path() - var/list/reaction_ids = list() - - if(D.required_reagents && D.required_reagents.len) - for(var/reaction in D.required_reagents) - reaction_ids += reaction - - // Create filters based on each reagent id in the required reagents list - for(var/id in reaction_ids) - if(!GLOB.chemical_reactions_list[id]) - GLOB.chemical_reactions_list[id] = list() - GLOB.chemical_reactions_list[id] += D - break // Don't bother adding ourselves to other reagent ids, it is redundant - -/////////////////////////////////////////////////////////////////////////////////// - -/datum/reagents - var/list/datum/reagent/reagent_list = new/list() - var/total_volume = 0 - var/maximum_volume = 100 - var/atom/my_atom = null - var/chem_temp = 150 - var/pH = REAGENT_NORMAL_PH - var/last_tick = 1 - var/addiction_tick = 1 - var/list/datum/reagent/addiction_list = new/list() - var/reagents_holder_flags - -/datum/reagents/New(maximum=100) - maximum_volume = maximum - - //I dislike having these here but map-objects are initialised before world/New() is called. >_> - if(!GLOB.chemical_reagents_list) - build_chemical_reagent_list() - if(!GLOB.chemical_reactions_list) - build_chemical_reactions_list() - -/datum/reagents/Destroy() - . = ..() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - qdel(R) - cached_reagents.Cut() - cached_reagents = null - if(my_atom && my_atom.reagents == src) - my_atom.reagents = null - my_atom = null - -// Used in attack logs for reagents in pills and such -/datum/reagents/proc/log_list() - if(!length(reagent_list)) - return "no reagents" - - var/list/data = list() - for(var/r in reagent_list) //no reagents will be left behind - var/datum/reagent/R = r - data += "[R.id] ([round(R.volume, 0.1)]u)" - //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. - return english_list(data) - -/datum/reagents/proc/remove_any(amount = 1) - var/list/cached_reagents = reagent_list - var/total_transfered = 0 - var/current_list_element = 1 - - current_list_element = rand(1, cached_reagents.len) - - while(total_transfered != amount) - if(total_transfered >= amount) - break - if(total_volume <= 0 || !cached_reagents.len) - break - - if(current_list_element > cached_reagents.len) - current_list_element = 1 - - var/datum/reagent/R = cached_reagents[current_list_element] - remove_reagent(R.id, 1) - - current_list_element++ - total_transfered++ - update_total() - - handle_reactions() - return total_transfered - -/datum/reagents/proc/remove_all(amount = 1) - var/list/cached_reagents = reagent_list - if(total_volume > 0) - var/part = amount / total_volume - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - remove_reagent(R.id, R.volume * part) - - update_total() - handle_reactions() - return amount - -/datum/reagents/proc/get_master_reagent_name() - var/list/cached_reagents = reagent_list - var/name - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - name = R.name - - return name - -/datum/reagents/proc/get_master_reagent_id() - var/list/cached_reagents = reagent_list - var/id - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - id = R.id - - return id - -/datum/reagents/proc/get_master_reagent() - var/list/cached_reagents = reagent_list - var/datum/reagent/master - var/max_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume > max_volume) - max_volume = R.volume - master = R - - return master - -/datum/reagents/proc/trans_to(obj/target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. - var/list/cached_reagents = reagent_list - if(!target || !total_volume) - return - if(amount < 0) - return - - var/datum/reagents/R - if(istype(target, /datum/reagents)) - R = target - else - if(!target.reagents) - return - R = target.reagents - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - var/part = amount / src.total_volume - var/trans_data = null - for(var/reagent in cached_reagents) - var/datum/reagent/T = reagent - var/transfer_amount = T.volume * part - if(preserve_data) - trans_data = copy_data(T) - - //fermichem Added ph TODO: add T.purity - R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. - //R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. - remove_reagent(T.id, transfer_amount) - - update_total() - R.update_total() - if(!no_react) - R.handle_reactions() - src.handle_reactions() - return amount - -/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1) - var/list/cached_reagents = reagent_list - if(!target || !total_volume) - return - - var/datum/reagents/R - if(istype(target, /datum/reagents)) - R = target - else - if(!target.reagents) - return - R = target.reagents - - if(amount < 0) - return - amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) - var/part = amount / total_volume - var/trans_data = null - for(var/reagent in cached_reagents) - var/datum/reagent/T = reagent - var/copy_amount = T.volume * part - if(preserve_data) - trans_data = T.data - R.add_reagent(T.id, copy_amount * multiplier, trans_data) - - src.update_total() - R.update_total() - R.handle_reactions() - src.handle_reactions() - return amount - -/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N - var/list/cached_reagents = reagent_list - if (!target) - return - if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) - return - if(amount < 0) - return - - var/datum/reagents/R = target.reagents - if(src.get_reagent_amount(reagent)= R.overdose_threshold && !R.overdosed) - R.overdosed = 1 - need_mob_update += R.overdose_start(C) - if(R.addiction_threshold) - if(R.volume >= R.addiction_threshold && !is_type_in_list(R, cached_addictions)) - var/datum/reagent/new_reagent = new R.type() - cached_addictions.Add(new_reagent) - if(R.overdosed) - need_mob_update += R.overdose_process(C) - if(is_type_in_list(R,cached_addictions)) - for(var/addiction in cached_addictions) - var/datum/reagent/A = addiction - if(istype(R, A)) - A.addiction_stage = -15 // you're satisfied for a good while. - need_mob_update += R.on_mob_life(C) - - if(can_overdose) - if(addiction_tick == 6) - addiction_tick = 1 - for(var/addiction in cached_addictions) - var/datum/reagent/R = addiction - if(C && R) - R.addiction_stage++ - if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end) - need_mob_update += R.addiction_act_stage1(C) - else if(R.addiction_stage1_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end) - need_mob_update += R.addiction_act_stage2(C) - else if(R.addiction_stage2_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end) - need_mob_update += R.addiction_act_stage3(C) - else if(R.addiction_stage3_end <= R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end) - need_mob_update += R.addiction_act_stage4(C) - else if(R.addiction_stage4_end <= R.addiction_stage) - to_chat(C, "You feel like you've gotten over your need for [R.name].") - SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.id]_addiction") - cached_addictions.Remove(R) - addiction_tick++ - if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. - C.updatehealth() - C.update_canmove() - C.update_stamina() - update_total() - - -/datum/reagents/proc/set_reacting(react = TRUE) - if(react) - reagents_holder_flags &= ~(REAGENT_NOREACT) - else - reagents_holder_flags |= REAGENT_NOREACT - -/datum/reagents/proc/conditional_update_move(atom/A, Running = 0) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - R.on_move (A, Running) - update_total() - -/datum/reagents/proc/conditional_update(atom/A) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - R.on_update (A) - update_total() - -/datum/reagents/proc/handle_reactions()//HERE EDIT HERE THE MAIN REACTION FERMICHEMS ASSEMBLE! I hope rp is similar - var/list/cached_reagents = reagent_list //a list of the reagents? - var/list/cached_reactions = GLOB.chemical_reactions_list //a list of the whole reactions? - var/datum/cached_my_atom = my_atom //It says my atom, but I didn't bring one with me!! - if(reagents_holder_flags & REAGENT_NOREACT) //Not sure on reagents_holder_flags, but I think it checks to see if theres a reaction with current stuff. - return //Yup, no reactions here. No siree. - - var/reaction_occurred = 0 // checks if reaction, binary variable - do //What does do do in byond? It sounds very redundant? is it a while loop? - var/list/possible_reactions = list() //init list - reaction_occurred = 0 // sets it back to 0? - for(var/reagent in cached_reagents) //for reagent in beaker/holder - var/datum/reagent/R = reagent //check to make sure that reagent is there for the reaction list - for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id - if(!reaction) - continue - - var/datum/chemical_reaction/C = reaction - var/list/cached_required_reagents = C.required_reagents - var/total_required_reagents = cached_required_reagents.len - var/total_matching_reagents = 0 - var/list/cached_required_catalysts = C.required_catalysts - var/total_required_catalysts = cached_required_catalysts.len - var/total_matching_catalysts= 0 - var/matching_container = 0 - var/matching_other = 0 - var/required_temp = C.required_temp - var/is_cold_recipe = C.is_cold_recipe - var/meets_temp_requirement = 0 - var/has_special_react = C.special_react - var/can_special_react = 0 - var/reactedVol = 0 - - for(var/B in cached_required_reagents) - if(!has_reagent(B, cached_required_reagents[B])) - break - total_matching_reagents++ - for(var/B in cached_required_catalysts) - if(!has_reagent(B, cached_required_catalysts[B])) - break - total_matching_catalysts++ - if(cached_my_atom) - if(!C.required_container) - matching_container = 1 - - else - if(cached_my_atom.type == C.required_container)//if the suspected container is a container - matching_container = 1 - if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs - return - if(!C.required_other)//Checks for other things required - matching_other = 1//binary check passes - - else if(istype(cached_my_atom, /obj/item/slime_extract))//if the object is a slime_extract. This might be complicated as to not break them via fermichem - var/obj/item/slime_extract/M = cached_my_atom - - if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1 - else - if(!C.required_container)//I'm not sure why this is here twice, I think if it's not a beaker? Oh, cyro. - matching_container = 1 - if(!C.required_other) - matching_other = 1 - - //FermiChem - /* - if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! - if (C.FermiExplode == TRUE) - //To be added! - else - FermiExplode() - //explode function!! - */ - - if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))//Temperature check!! - meets_temp_requirement = 1//binary pass - - if(!has_special_react || C.check_special_react(src)) - can_special_react = 1 - - if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react) - possible_reactions += C - - if(possible_reactions.len)//does list exist? - var/datum/chemical_reaction/selected_reaction = possible_reactions[1] - //select the reaction with the most extreme temperature requirements - for(var/V in possible_reactions)//why V, surely that would indicate volume? V is the reaction potential. - var/datum/chemical_reaction/competitor = V //competitor? I think this is theres two of them. Troubling..! - if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. - if(competitor.required_temp <= selected_reaction.required_temp)//only returns with lower if reaction "is cold" var. - selected_reaction = competitor - else - if(competitor.required_temp >= selected_reaction.required_temp) //will return with the hotter reacting first. - selected_reaction = competitor - var/list/cached_required_reagents = selected_reaction.required_reagents//update reagents list - var/list/cached_results = selected_reaction.results//resultant chemical list - var/special_react_result = selected_reaction.check_special_react(src) - var/list/multiplier = INFINITY //Wat - - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - - //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. - //FermiChem relies on two additional properties; pH and impurity - //Temperature plays into a larger role too. - //BRANCH HERE - if(selected_reaction) - var/datum/chemical_reaction/C = selected_reaction - - if (C.FermiChem == TRUE) - message_admins("FermiChem Proc'd") - - while (reaction_occurred < 1) - reaction_occurred, reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier) - CHECK_TICK - - //Standard reaction mechanics: - else - - for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - - for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - multiplier = max(multiplier, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P)//log - add_reagent(P, cached_results[P]*multiplier, null, chem_temp)//add reagent function!! I THINK I can do this: - - - var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers - var/iconhtml = icon2html(cached_my_atom, seen) - if(cached_my_atom) - if(!ismob(cached_my_atom)) // No bubbling mobs - if(selected_reaction.mix_sound) - playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, 1) - - for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") - - if(istype(cached_my_atom, /obj/item/slime_extract))//if there's an extract and it's used up. - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." - - selected_reaction.on_reaction(src, multiplier, special_react_result) - reaction_occurred = 1 - - while(reaction_occurred)//while do nothing? - update_total()//Don't know waht this does. - return 0//end! - -/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, totalVol) - var/datum/chemical_reaction/C = selected_reaction - var/deltaT = 0 - var/deltapH = 0 - var/stepChemAmmount = 0 - var/ammoReacted = 0 - //get purity from combined beaker reactant purities HERE. - var/purity = 1 - //var/tempVol = totalVol - //var/list/multiplier = INFINITY - - message_admins("Loop beginning") - //Begin Parse - - //Check extremes first - if (chem_temp > C.ExplodeTemp) - //go to explode proc - message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") - FermiExplode() - - if (pH > 14 || pH < 0) - //Create chemical sludge eventually(for now just destroy the beaker I guess?) - //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - message_admins("pH is lover limit, cur pH: [pH]") - FermiExplode() - - //For now, purity is handled elsewhere - - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) - else if (chem_temp >= C.OptimalTempMax) - deltaT = 1 - else - deltaT = 0 - message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") - - //Calculate DeltapH (Deviation of pH from optimal) - //Lower range - if (pH < C.OptimalpHMin) - if (pH < (C.OptimalpHMin - C.ReactpHLim)) - deltapH = 0 - else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) - //Upper range - else if (pH > C.OptimalpHMin) - if (pH > (C.OptimalpHMin + C.ReactpHLim)) - deltapH = 0 - else - deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) - //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) - deltapH = 1 - //This should never proc: - else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") - WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") - //TODO Add CatalystFact - message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") - - stepChemAmmount = tempVol * deltaT - if (stepChemAmmount > C.RateUpLim) - stepChemAmmount = C.RateUpLim - else if (stepChemAmmount < 0.01) - stepChemAmmount = 0.01 - - if (ammoReacted > 0) - purity = ((purity * ammoReacted) + (deltapH * stepChemAmmount)) /((ammoReacted + stepChemAmmount)) //This should add the purity to the product - else - purity = deltapH - message_admins("purity: [purity], purity of beaker") - message_admins("Temp before change: [chem_temp], pH after change: [pH]") - //Apply pH changes and thermal output of reaction to beaker - chem_temp += (C.ThermicConstant * stepChemAmmount) - pH += (C.HIonRelease * stepChemAmmount) - message_admins("Temp after change: [chem_temp], pH after change: [pH]") - - // End. - - selected_reaction.on_reaction(src, multiplier, special_react_result) - - for(var/B in cached_required_reagents) // - tempVol = min(totalVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - - - message_admins("cached_results: [cached_results], totalVol: [totalVol], stepChemAmmount [stepChemAmmount]") - for(var/B in cached_required_reagents) - message_admins("cached_required_reagents(B): [cached_required_reagents[B]], totalVol: [totalVol], base stepChemAmmount [stepChemAmmount]") - remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. - - for(var/P in selected_reaction.results)//Not sure how this works, what is selected_reaction.results? - totalVol = max(totalVol, 1) //this shouldnt happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp)//add reagent function!! I THINK I can do this: - - ammoReacted = ammoReacted + stepChemAmmount - - if ammoReacted = totalVol - reaction_occurred = 1 - SSblackbox.record_feedback("tally", "Fermi_chemical_reaction", ammoReacted, C.id)//log - - CHECK_TICK - return (reaction_occurred, ammoReacted) - -/datum/reagents/proc/FermiExplode() - return - -/datum/reagents/proc/isolate_reagent(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if(R.id != reagent) - del_reagent(R.id) - update_total() - -/datum/reagents/proc/del_reagent(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if(R.id == reagent) - if(my_atom && isliving(my_atom)) - var/mob/living/M = my_atom - R.on_mob_delete(M) - qdel(R) - reagent_list -= R - update_total() - if(my_atom) - my_atom.on_reagent_change(DEL_REAGENT) - return 1 - -/datum/reagents/proc/update_total() - var/list/cached_reagents = reagent_list - total_volume = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.volume < 0.1) - del_reagent(R.id) - else - total_volume += R.volume - - return 0 - -/datum/reagents/proc/clear_reagents() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - del_reagent(R.id) - return 0 - -/datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1) - var/react_type - if(isliving(A)) - react_type = "LIVING" - if(method == INGEST) - var/mob/living/L = A - L.taste(src) - else if(isturf(A)) - react_type = "TURF" - else if(isobj(A)) - react_type = "OBJ" - else - return - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - switch(react_type) - if("LIVING") - var/touch_protection = 0 - if(method == VAPOR) - var/mob/living/L = A - touch_protection = L.get_permeability_protection() - R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection) - if("TURF") - R.reaction_turf(A, R.volume * volume_modifier, show_message) - if("OBJ") - R.reaction_obj(A, R.volume * volume_modifier, show_message) - -/datum/reagents/proc/holder_full() - if(total_volume >= maximum_volume) - return TRUE - return FALSE - -//Returns the average specific heat for all reagents currently in this holder. -/datum/reagents/proc/specific_heat() - . = 0 - var/cached_amount = total_volume //cache amount - var/list/cached_reagents = reagent_list //cache reagents - for(var/I in cached_reagents) - var/datum/reagent/R = I - . += R.specific_heat * (R.volume / cached_amount) - -/datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) - var/S = specific_heat() - chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) - -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, pH = 7, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ - if(!isnum(amount) || !amount) - return FALSE - - if(amount <= 0) - return FALSE - - var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] - if(!D) - WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") - return FALSE - - update_total() - var/cached_total = total_volume - if(cached_total + amount > maximum_volume) - amount = (maximum_volume - cached_total) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. - if(amount <= 0) - return FALSE - var/new_total = cached_total + amount - var/cached_temp = chem_temp - var/list/cached_reagents = reagent_list - - //Equalize temperature - Not using specific_heat() because the new chemical isn't in yet. - var/specific_heat = 0 - var/thermal_energy = 0 - for(var/i in cached_reagents) - var/datum/reagent/R = i - specific_heat += R.specific_heat * (R.volume / new_total) - thermal_energy += R.specific_heat * R.volume * cached_temp - specific_heat += D.specific_heat * (amount / new_total) - thermal_energy += D.specific_heat * amount * reagtemp - chem_temp = thermal_energy / (specific_heat * new_total) - //// - - //add the reagent to the existing if it exists - for(var/A in cached_reagents) - var/datum/reagent/R = A - if (R.id == reagent) - R.volume += amount - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - R.on_merge(data, amount) - if(!no_react) - handle_reactions() - return TRUE - - //otherwise make a new one - var/datum/reagent/R = new D.type(data) - cached_reagents += R - R.holder = src - R.volume = amount - if(data) - R.data = data - R.on_new(data) - - if(isliving(my_atom)) - R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete - update_total() - if(my_atom) - my_atom.on_reagent_change(ADD_REAGENT) - if(!no_react) - handle_reactions() - return TRUE - -/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) - for(var/r_id in list_reagents) - var/amt = list_reagents[r_id] - add_reagent(r_id, amt, data) - -/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to - - if(isnull(amount)) - amount = 0 - CRASH("null amount passed to reagent code") - return FALSE - - if(!isnum(amount)) - return FALSE - - if(amount < 0) - return FALSE - - var/list/cached_reagents = reagent_list - - for(var/A in cached_reagents) - var/datum/reagent/R = A - if (R.id == reagent) - //clamp the removal amount to be between current reagent amount - //and zero, to prevent removing more than the holder has stored - amount = CLAMP(amount, 0, R.volume) - R.volume -= amount - update_total() - if(!safety)//So it does not handle reactions when it need not to - handle_reactions() - if(my_atom) - my_atom.on_reagent_change(REM_REAGENT) - return TRUE - - return FALSE - -/datum/reagents/proc/has_reagent(reagent, amount = -1) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if (R.id == reagent) - if(!amount) - return R - else - if(R.volume >= amount) - return R - else - return 0 - - return 0 - -/datum/reagents/proc/get_reagent_amount(reagent) - var/list/cached_reagents = reagent_list - for(var/_reagent in cached_reagents) - var/datum/reagent/R = _reagent - if (R.id == reagent) - return R.volume - - return 0 - -/datum/reagents/proc/get_reagents() - var/list/names = list() - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - names += R.name - - return jointext(names, ",") - -/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. - if(!isnum(amount)) - return 1 - var/list/cached_reagents = reagent_list - var/has_removed_reagent = 0 - - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - var/matches = 0 - // Switch between how we check the reagent type - if(strict) - if(R.type == reagent_type) - matches = 1 - else - if(istype(R, reagent_type)) - matches = 1 - // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. - if(matches) - // Have our other proc handle removement - has_removed_reagent = remove_reagent(R.id, amount, safety) - - return has_removed_reagent - -//two helper functions to preserve data across reactions (needed for xenoarch) -/datum/reagents/proc/get_data(reagent_id) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.id == reagent_id) - return R.data - -/datum/reagents/proc/set_data(reagent_id, new_data) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(R.id == reagent_id) - R.data = new_data - -/datum/reagents/proc/copy_data(datum/reagent/current_reagent) - if(!current_reagent || !current_reagent.data) - return null - if(!istype(current_reagent.data, /list)) - return current_reagent.data - - var/list/trans_data = current_reagent.data.Copy() - - // We do this so that introducing a virus to a blood sample - // doesn't automagically infect all other blood samples from - // the same donor. - // - // Technically we should probably copy all data lists, but - // that could possibly eat up a lot of memory needlessly - // if most data lists are read-only. - if(trans_data["viruses"]) - var/list/v = trans_data["viruses"] - trans_data["viruses"] = v.Copy() - - return trans_data - -/datum/reagents/proc/get_reagent(type) - var/list/cached_reagents = reagent_list - . = locate(type) in cached_reagents - -/datum/reagents/proc/generate_taste_message(minimum_percent=15) - // the lower the minimum percent, the more sensitive the message is. - var/list/out = list() - var/list/tastes = list() //descriptor = strength - if(minimum_percent <= 100) - for(var/datum/reagent/R in reagent_list) - if(!R.taste_mult) - continue - - if(istype(R, /datum/reagent/consumable/nutriment)) - var/list/taste_data = R.data - for(var/taste in taste_data) - var/ratio = taste_data[taste] - var/amount = ratio * R.taste_mult * R.volume - if(taste in tastes) - tastes[taste] += amount - else - tastes[taste] = amount - else - var/taste_desc = R.taste_description - var/taste_amount = R.volume * R.taste_mult - if(taste_desc in tastes) - tastes[taste_desc] += taste_amount - else - tastes[taste_desc] = taste_amount - //deal with percentages - // TODO it would be great if we could sort these from strong to weak - var/total_taste = counterlist_sum(tastes) - if(total_taste > 0) - for(var/taste_desc in tastes) - var/percent = tastes[taste_desc]/total_taste * 100 - if(percent < minimum_percent) - continue - var/intensity_desc = "a hint of" - if(percent > minimum_percent * 2 || percent == 100) - intensity_desc = "" - else if(percent > minimum_percent * 3) - intensity_desc = "the strong flavor of" - if(intensity_desc != "") - out += "[intensity_desc] [taste_desc]" - else - out += "[taste_desc]" - - return english_list(out, "something indescribable") - -/datum/reagents/proc/expose_temperature(var/temperature, var/coeff=0.02) - var/temp_delta = (temperature - chem_temp) * coeff - if(temp_delta > 0) - chem_temp = min(chem_temp + max(temp_delta, 1), temperature) - else - chem_temp = max(chem_temp + min(temp_delta, -1), temperature) - chem_temp = round(chem_temp) - handle_reactions() - -/////////////////////////////////////////////////////////////////////////////////// - - -// Convenience proc to create a reagents holder for an atom -// Max vol is maximum volume of holder -/atom/proc/create_reagents(max_vol) - if(reagents) - qdel(reagents) - reagents = new/datum/reagents(max_vol) - reagents.my_atom = src - -/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents - var/static/list/random_reagents = list() - if(!random_reagents.len) - for(var/thing in subtypesof(/datum/reagent)) - var/datum/reagent/R = thing - if(initial(R.can_synth)) - random_reagents += initial(R.id) - var/picked_reagent = pick(random_reagents) - return picked_reagent diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index f204494eac..5a704e6784 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -558,8 +558,8 @@ deltaResist /= phase//later phases require more resistance /datum/status_effect/chem/enthrall/proc/owner_say(message) //I can only hope this works - var/datum/status_effect/chem/enthrall/E = owner.has_status_effect(/datum/status_effect/chem/enthrall) - var/mob/living/master = E.master + //var/datum/status_effect/chem/enthrall/E = owner.has_status_effect(/datum/status_effect/chem/enthrall) + //var/mob/living/master = E.master var/static/regex/owner_words = regex("[master]") if(findtext(message, owner_words)) message = replacetext(lowertext(message), lowertext(master), "[enthrallGender]") From 8229b4529f93f7cc5f15d5d624350cd6c487027b Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 15 May 2019 05:39:07 +0100 Subject: [PATCH 115/608] So sleepy --- .../code/modules/reagents/chemistry/reagents/fermi_reagents.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 511aec2b62..cdeae92ae1 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -58,13 +58,14 @@ //During the process you get really hungry, then your items start teleporting randomly, //then alternative versions of yourself are brought in from a different universe and they yell at you. //and finally you yourself get teleported to an alternative universe, and character your playing is replaced with said alternative (this used to reroll objectives, but Kevin said prooobably not). -//Currently the creation loc doesn't work, so it teleports you back to where you took it. Which is fine too. +//Currently the creation loc doesn't work, so it teleports you back to where you took it. Which is fine too. This should be fixed, so it either does one or the other. //Bugginess level: low - I can't get the remove all status effects and moodlets to work. Basically I'd like to reset the character to roundstart if possible. //Important factors to consider while balancing: //1.It's... Fun. And thats mostly it. The teleport thing isn't that useful, since you have to be not stunned to take it. //You could use it as an antag and OD someone, but you have to inject 20u, which is 5 more than a syringe, and it doesn't kill you. //I'd like to make it reroll your objectives or expand upon the alternative version of you. +//It's maybe one of the most fun chems, I would say so by far. It's hillarious /datum/reagent/fermi/eigenstate name = "Eigenstasium" From 246a344fed5d73db8eedd0ae2db7a01bb9229b8e Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 16 May 2019 00:58:30 +0100 Subject: [PATCH 116/608] Mreac fixed, tongue health, pH vars+ (drink, food, pryo, tox remain) --- code/datums/components/mood.dm | 2 +- code/modules/jobs/job_types/medical.dm | 1 + code/modules/mob/living/taste.dm | 26 ++++++ code/modules/reagents/chemistry/holder.dm | 21 +++-- code/modules/reagents/chemistry/reagents.dm | 2 +- .../chemistry/reagents/alcohol_reagents.dm | 27 ++++++ .../chemistry/reagents/drug_reagents.dm | 9 ++ .../chemistry/reagents/food_reagents.dm | 8 ++ .../chemistry/reagents/medicine_reagents.dm | 54 ++++++++++++ .../chemistry/reagents/other_reagents.dm | 66 +++++++++++++- code/modules/surgery/organs/tongue.dm | 32 +++++++ code/modules/vending/wardrobes.dm | 3 +- .../chemistry/reagents/fermi_reagents.dm | 81 +++++++++++++----- .../reagents/chemistry/recipes/fermi.dm | 4 +- .../code/modules/reagents/objects/items.dm | 4 + modular_citadel/icons/obj/FermiChem.dmi | Bin 814 -> 1877 bytes 16 files changed, 300 insertions(+), 40 deletions(-) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index db82234831..3f993bdd73 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -255,7 +255,7 @@ if(the_event.timeout) addtimer(CALLBACK(src, .proc/clear_event, null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE) return 0 //Don't have to update the event. - the_event = new type(src, param) + the_event = new type(src, param)//This causes a runtime for some reason, was this me? mood_events[category] = the_event update_mood() diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index 5a926f490a..6447077173 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -127,6 +127,7 @@ Chemist backpack = /obj/item/storage/backpack/chemistry satchel = /obj/item/storage/backpack/satchel/chem duffelbag = /obj/item/storage/backpack/duffelbag/med + l_hand = /obj/item/pHbooklet chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index 534bf36c59..71eb84ab5e 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -32,4 +32,30 @@ last_taste_time = world.time last_taste_text = text_output +//FermiChem - How to check pH of a beaker without a meter/pH paper. +//Basically checks the pH of the holder and burns your poor tongue if it's too acidic! +//TRAIT_AGEUSIA players can't taste, unless it's burning them. +//10 sips of a strongly acidic substance will burn your tongue. +/mob/living/carbon/taste(datum/reagents/from) + var/obj/item/organ/tongue/T = src.getorganslot("tongue") + if (!T) + return + ..() + return + if ((from.pH > 12.5) || (from.pH < 1.5)) + to_chat(src, "You taste chemical burns!") + T.adjustTongueLoss(src, 5) + if (!has_trait(TRAIT_AGEUSIA)) //I'll let you get away with not having 1 damage. (add trait that lets you taste this) + switch(from.pH) + if(11.5 to 12.5) + to_chat(src, "You taste a strong alkaline flavour!") + T.adjustTongueLoss(src, 1) + if(8.5 to 11.5) + to_chat(src, "You taste a sort of soapy tone in the mixture.") + if(2.5 to 5.5) + to_chat(src, "You taste a sort of acid tone in the mixture.") + if(1.5 to 2.5) + to_chat(src, "You taste a strong acidic flavour!") + T.adjustTongueLoss(src, 1) + #undef DEFAULT_TASTE_SENSITIVITY diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6466ac8b61..27b8b440f4 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -623,26 +623,19 @@ //For now, purity is handled elsewhere - //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) - else if (chem_temp >= C.OptimalTempMax) - deltaT = 1 - else - deltaT = 0 - message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") - //Calculate DeltapH (Deviation of pH from optimal) //Lower range if (pH < C.OptimalpHMin) if (pH < (C.OptimalpHMin - C.ReactpHLim)) deltapH = 0 + return//If outside pH range, no reaction else deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) //Upper range else if (pH > C.OptimalpHMin) if (pH > (C.OptimalpHMin + C.ReactpHLim)) deltapH = 0 + return //If outside pH range, no reaction else deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) //Within mid range @@ -655,6 +648,16 @@ //TODO Add CatalystFact message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") + //Calculate DeltaT (Deviation of T from optimal) + if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) + deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) + else if (chem_temp >= C.OptimalTempMax) + deltaT = 1 + else + deltaT = 0 + message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") + + stepChemAmmount = targetVol * deltaT if (stepChemAmmount > C.RateUpLim) stepChemAmmount = C.RateUpLim diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index dd1bd31aaf..93c40785f3 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -37,7 +37,7 @@ var/purity = 1 var/impureChem = "toxin" var/loc = null //Should be the creation location! - var/pH + var/pH = 7 /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 92d9da401b..d011b1a8cb 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -14,6 +14,7 @@ nutriment_factor = 0 taste_description = "alcohol" var/boozepwr = 65 //Higher numbers equal higher hardness, higher hardness equals more intense alcohol poisoning + pH = 7.33 /* Boozepwr Chart @@ -86,6 +87,8 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "piss water" glass_name = "glass of beer" glass_desc = "A freezing pint of beer." + pH = 4 + /datum/reagent/consumable/ethanol/beer/light name = "Light Beer" @@ -95,6 +98,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "dish water" glass_name = "glass of light beer" glass_desc = "A freezing pint of watery light beer." + pH = 5 /datum/reagent/consumable/ethanol/beer/green name = "Green Beer" @@ -105,6 +109,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "greenbeerglass" glass_name = "glass of green beer" glass_desc = "A freezing pint of green beer. Festive." + pH = 6 /datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/M) if(M.color != color) @@ -124,6 +129,8 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of RR coffee liquor" glass_desc = "DAMN, THIS THING LOOKS ROBUST!" shot_glass_icon_state = "shotglasscream" + pH = 6 + /datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/M) M.dizziness = max(0,M.dizziness-5) @@ -145,6 +152,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of whiskey" glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." shot_glass_icon_state = "shotglassbrown" + pH = 4.5 /datum/reagent/consumable/ethanol/thirteenloko name = "Thirteen Loko" @@ -161,6 +169,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of Thirteen Loko" glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." + /datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/M) M.drowsyness = max(0,M.drowsyness-7) M.AdjustSleeping(-40) @@ -221,6 +230,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of vodka" glass_desc = "The glass contain wodka. Xynta." shot_glass_icon_state = "shotglassclear" + pH = 4 /datum/reagent/consumable/ethanol/vodka/on_mob_life(mob/living/carbon/M) M.radiation = max(M.radiation-2,0) @@ -255,6 +265,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "threemileislandglass" glass_name = "Three Mile Island Ice Tea" glass_desc = "A glass of this is sure to prevent a meltdown." + pH = 3.5 /datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/M) M.set_drugginess(50) @@ -270,6 +281,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "ginvodkaglass" glass_name = "glass of gin" glass_desc = "A crystal clear glass of Griffeater gin." + pH = 6.9 /datum/reagent/consumable/ethanol/rum name = "Rum" @@ -282,6 +294,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of rum" glass_desc = "Now you want to Pray for a pirate suit, don't you?" shot_glass_icon_state = "shotglassbrown" + pH = 6.5 /datum/reagent/consumable/ethanol/tequila name = "Tequila" @@ -294,6 +307,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of tequila" glass_desc = "Now all that's missing is the weird colored shades!" shot_glass_icon_state = "shotglassgold" + pH = 4 /datum/reagent/consumable/ethanol/vermouth name = "Vermouth" @@ -306,6 +320,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of vermouth" glass_desc = "You wonder why you're even drinking this straight." shot_glass_icon_state = "shotglassclear" + pH = 3.25 /datum/reagent/consumable/ethanol/wine name = "Wine" @@ -318,6 +333,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of wine" glass_desc = "A very classy looking drink." shot_glass_icon_state = "shotglassred" + pH = 3.45 /datum/reagent/consumable/ethanol/lizardwine name = "Lizard wine" @@ -327,6 +343,7 @@ All effects don't start immediately, but rather get worse over time; the rate is boozepwr = 45 quality = DRINK_FANTASTIC taste_description = "scaley sweetness" + pH = 3 /datum/reagent/consumable/ethanol/grappa name = "Grappa" @@ -338,6 +355,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "grappa" glass_name = "glass of grappa" glass_desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking." + pH = 3.5 /datum/reagent/consumable/ethanol/cognac name = "Cognac" @@ -350,6 +368,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of cognac" glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this." shot_glass_icon_state = "shotglassbrown" + pH = 3.5 /datum/reagent/consumable/ethanol/absinthe name = "Absinthe" @@ -390,6 +409,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "aleglass" glass_name = "glass of ale" glass_desc = "A freezing pint of delicious Ale." + pH = 4.5 /datum/reagent/consumable/ethanol/goldschlager name = "Goldschlager" @@ -416,6 +436,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of patron" glass_desc = "Drinking patron in the bar, with all the subpar ladies." shot_glass_icon_state = "shotglassclear" + pH = 4.5 /datum/reagent/consumable/ethanol/gintonic name = "Gin and Tonic" @@ -428,6 +449,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "gintonicglass" glass_name = "Gin and Tonic" glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman." + pH = 3 /datum/reagent/consumable/ethanol/rum_coke name = "Rum and Coke" @@ -440,6 +462,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskeycolaglass" glass_name = "Rum and Coke" glass_desc = "The classic go-to of space-fratboys." + pH = 4 /datum/reagent/consumable/ethanol/cuba_libre name = "Cuba Libre" @@ -453,6 +476,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Cuba Libre" glass_desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!" + /datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/carbon/M) if(M.mind && M.mind.has_antag_datum(/datum/antagonist/rev)) //Cuba Libre, the traditional drink of revolutions! Heals revolutionaries. M.adjustBruteLoss(-1, 0) @@ -638,6 +662,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "beepskysmashglass" glass_name = "Beepsky Smash" glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." + pH = 2 /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/carbon/M) if(M.has_trait(TRAIT_ALCOHOL_TOLERANCE)) @@ -1533,6 +1558,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Bastion Bourbon" glass_desc = "If you're feeling low, count on the buttery flavor of our own bastion bourbon." shot_glass_icon_state = "shotglassgreen" + pH = 4 /datum/reagent/consumable/ethanol/bastion_bourbon/on_mob_add(mob/living/L) var/heal_points = 10 @@ -1837,6 +1863,7 @@ All effects don't start immediately, but rather get worse over time; the rate is can_synth = FALSE var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit. var/list/tastes = list("bad coding" = 1) //List of tastes. See above. + pH = 4 /datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data) names = data["names"] diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index cd439b1899..cdbc224367 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -15,6 +15,7 @@ description = "An illegal chemical compound used as drug." color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 30 + pH = 9 /datum/reagent/drug/space_drugs/on_mob_life(mob/living/carbon/M) M.set_drugginess(15) @@ -44,6 +45,7 @@ addiction_threshold = 30 taste_description = "smoke" trippy = FALSE + pH = 8 /datum/reagent/drug/nicotine/on_mob_life(mob/living/carbon/M) if(prob(1)) @@ -65,6 +67,7 @@ color = "#FA00C8" overdose_threshold = 20 addiction_threshold = 10 + pH = 10 /datum/reagent/drug/crank/on_mob_life(mob/living/carbon/M) if(prob(5)) @@ -112,6 +115,7 @@ color = "#0064B4" overdose_threshold = 20 addiction_threshold = 15 + pH = 9 /datum/reagent/drug/krokodil/on_mob_life(mob/living/carbon/M) @@ -164,6 +168,7 @@ overdose_threshold = 20 addiction_threshold = 10 metabolization_rate = 0.75 * REAGENTS_METABOLISM + pH = 5 /datum/reagent/drug/methamphetamine/on_mob_add(mob/living/L) ..() @@ -250,6 +255,7 @@ addiction_threshold = 10 taste_description = "salt" // because they're bathsalts? var/datum/brain_trauma/special/psychotic_brawling/bath_salts/rage + pH = 8.2 /datum/reagent/drug/bath_salts/on_mob_add(mob/living/L) ..() @@ -346,6 +352,7 @@ description = "Amps you up and gets you going, fixes all stamina damage you might have but can cause toxin and oxygen damage." reagent_state = LIQUID color = "#78FFF0" + pH = 9.2 /datum/reagent/drug/aranesp/on_mob_life(mob/living/carbon/M) var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") @@ -367,6 +374,7 @@ color = "#FFF378" addiction_threshold = 10 overdose_threshold = 20 + pH = 10.5 /datum/reagent/drug/happiness/on_mob_add(mob/living/L) ..() @@ -446,6 +454,7 @@ addiction_threshold = 1 addiction_stage3_end = 40 addiction_stage4_end = 240 + pH = 12.5 /datum/reagent/drug/skooma/on_mob_add(mob/living/L) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 5071150e24..c5929967ff 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -228,6 +228,7 @@ description = "A special oil that noticably chills the body. Extracted from Icepeppers and slimes." color = "#8BA6E9" // rgb: 139, 166, 233 taste_description = "mint" + pH = 13 //HMM! I wonder /datum/reagent/consumable/frostoil/on_mob_life(mob/living/carbon/M) var/cooling = 0 @@ -273,6 +274,7 @@ description = "A chemical agent used for self-defense and in police work." color = "#B31008" // rgb: 179, 16, 8 taste_description = "scorching agony" + pH = 7.4 /datum/reagent/consumable/condensedcapsaicin/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(!ishuman(M) && !ismonkey(M)) @@ -400,6 +402,7 @@ color = "#E700E7" // rgb: 231, 0, 231 metabolization_rate = 0.2 * REAGENTS_METABOLISM taste_description = "mushroom" + pH = 11 /datum/reagent/mushroomhallucinogen/on_mob_life(mob/living/carbon/M) M.slurring = max(M.slurring,50) @@ -608,6 +611,7 @@ description = "A blinding substance extracted from certain onions." color = "#c0c9a0" taste_description = "bitterness" + pH = 5 /datum/reagent/consumable/tearjuice/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(!istype(M)) @@ -662,6 +666,7 @@ description = "An ichor, derived from a certain mushroom, makes for a bad time." color = "#1d043d" taste_description = "bitter mushroom" + pH = 12 /datum/reagent/consumable/entpoly/on_mob_life(mob/living/carbon/M) if(current_cycle >= 10) @@ -682,6 +687,7 @@ description = "A stimulating ichor which causes luminescent fungi to grow on the skin. " color = "#b5a213" taste_description = "tingling mushroom" + pH = 11.2 /datum/reagent/consumable/tinlux/reaction_mob(mob/living/M) M.set_light(2) @@ -696,6 +702,7 @@ color = "#d3a308" nutriment_factor = 3 * REAGENTS_METABOLISM taste_description = "fruity mushroom" + pH = 10.4 /datum/reagent/consumable/vitfro/on_mob_life(mob/living/carbon/M) if(prob(80)) @@ -711,3 +718,4 @@ nutriment_factor = 5 * REAGENTS_METABOLISM color = "#eef442" // rgb: 238, 244, 66 taste_description = "mournful honking" + pH = 9.2 diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index b20880d239..097de0cadc 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -19,6 +19,7 @@ id = "leporazine" description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels." color = "#C8A5DC" // rgb: 200, 165, 220 + pH = 8.4 /datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/M) if(M.bodytemperature > BODYTEMP_NORMAL) @@ -82,6 +83,7 @@ id = "synaptizine" description = "Increases resistance to stuns as well as reducing drowsiness and hallucinations." color = "#FF00FF" + pH = 4 /datum/reagent/medicine/synaptizine/on_mob_life(mob/living/carbon/M) M.drowsyness = max(M.drowsyness-5, 0) @@ -101,6 +103,7 @@ id = "synaphydramine" description = "Reduces drowsiness, hallucinations, and Histamine from body." color = "#EC536D" // rgb: 236, 83, 109 + pH = 5.2 /datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/carbon/M) M.drowsyness = max(M.drowsyness-5, 0) @@ -119,6 +122,7 @@ id = "inacusiate" description = "Instantly restores all hearing to the patient, but does not cure deafness." color = "#6600FF" // rgb: 100, 165, 255 + pH = 2 /datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/M) M.restoreEars() @@ -130,6 +134,7 @@ description = "A chemical mixture with almost magical healing powers. Its main limitation is that the patient's body temperature must be under 270K for it to metabolise correctly." color = "#0000C8" taste_description = "sludge" + pH = 11 /datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M) var/power = -0.00003 * (M.bodytemperature ** 2) + 3 @@ -151,6 +156,7 @@ color = "#0000C8" taste_description = "muscle" metabolization_rate = 1.5 * REAGENTS_METABOLISM + pH = 13 /datum/reagent/medicine/clonexadone/on_mob_life(mob/living/carbon/M) if(M.bodytemperature < T0C) @@ -166,6 +172,7 @@ description = "A mixture of cryoxadone and slime jelly, that apparently inverses the requirement for its activation." color = "#f7832a" taste_description = "spicy jelly" + pH = 14 /datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/M) if(M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) @@ -197,6 +204,7 @@ color = "#669900" // rgb: 102, 153, 0 overdose_threshold = 30 taste_description = "fish" + ph = 12.2 /datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/M) M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. @@ -218,6 +226,7 @@ description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with." color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 0.1 * REAGENTS_METABOLISM + pH = 8.1 //Goon Chems. Ported mainly from Goonstation. Easily mixable (or not so easily) and provide a variety of effects. /datum/reagent/medicine/silver_sulfadiazine @@ -226,6 +235,7 @@ description = "If used in touch-based applications, immediately restores burn wounds as well as restoring more over time. If ingested through other means, deals minor toxin damage." reagent_state = LIQUID color = "#C8A5DC" + pH = 7.2 /datum/reagent/medicine/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) @@ -254,6 +264,7 @@ color = "#f7ffa5" metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 25 + pH = 10.7 /datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M) if(M.getFireLoss() > 50) @@ -275,6 +286,7 @@ description = "If used in touch-based applications, immediately restores bruising as well as restoring more over time. If ingested through other means, deals minor toxin damage." reagent_state = LIQUID color = "#FF9696" + pH = 6.7 /datum/reagent/medicine/styptic_powder/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) @@ -307,6 +319,7 @@ taste_description = "sweetness and salt" var/last_added = 0 var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active + pH = 5.5 /datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M) if(last_added) @@ -321,6 +334,11 @@ M.adjustBruteLoss(-0.5*REM, 0) M.adjustFireLoss(-0.5*REM, 0) . = TRUE + //Fermichem + if (M.reagents.pH < 5.5) + M.reagents.pH += 0.2 + else if (M.reagents.pH > 9.5) + M.reagents.pH -= 0.2 ..() /datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M) @@ -345,6 +363,7 @@ reagent_state = LIQUID color = "#6D6374" metabolization_rate = 0.4 * REAGENTS_METABOLISM + pH = 2.6 /datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/C) C.hal_screwyhud = SCREWYHUD_HEALTHY @@ -383,6 +402,7 @@ description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only." reagent_state = LIQUID color = "#FFEBEB" + pH = 11.5 /datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) if(iscarbon(M)) @@ -404,6 +424,7 @@ color = "#000000" metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "ash" + pH = 5 /datum/reagent/medicine/charcoal/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(-2*REM, 0) @@ -421,6 +442,7 @@ color = "#DCDCDC" metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 + pH = 2 /datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(-0.5*REM, 0) @@ -446,6 +468,7 @@ color = "#19C832" metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "acid" + pH = 1.5 /datum/reagent/medicine/calomel/on_mob_life(mob/living/carbon/M) for(var/datum/reagent/R in M.reagents.reagent_list) @@ -463,6 +486,7 @@ reagent_state = LIQUID color = "#14FF3C" metabolization_rate = 2 * REAGENTS_METABOLISM + pH = 12 //It's a reducing agent /datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/carbon/M) if(M.radiation > 0) @@ -476,6 +500,7 @@ reagent_state = LIQUID color = "#003153" // RGB 0, 49, 83 metabolization_rate = 0.5 * REAGENTS_METABOLISM + pH = 8.9 /datum/reagent/medicine/prussian_blue/on_mob_life(mob/living/carbon/M) if(M.radiation > 0) @@ -489,6 +514,7 @@ reagent_state = LIQUID color = "#E6FFF0" metabolization_rate = 0.5 * REAGENTS_METABOLISM + pH = -1 //One of the best buffers, /datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/M) M.radiation -= max(M.radiation-RAD_MOB_SAFE, 0)/50 @@ -507,6 +533,7 @@ color = "#D2D2D2" metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 25 + pH = 1 /datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M) @@ -530,6 +557,7 @@ reagent_state = LIQUID color = "#00FFFF" metabolization_rate = 0.25 * REAGENTS_METABOLISM + pH = 2 /datum/reagent/medicine/salbutamol/on_mob_life(mob/living/carbon/M) M.adjustOxyLoss(-3*REM, 0) @@ -545,6 +573,7 @@ reagent_state = LIQUID color = "#FF6464" metabolization_rate = 0.25 * REAGENTS_METABOLISM + pH = 11 /datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M) M.adjustOxyLoss(-12*REM, 0) @@ -564,6 +593,7 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 45 addiction_threshold = 30 + pH = 12 /datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M) M.AdjustStun(-20, 0) @@ -618,6 +648,7 @@ reagent_state = LIQUID color = "#64FFE6" metabolization_rate = 0.5 * REAGENTS_METABOLISM + pH = 13 /datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/carbon/M) if(prob(10)) @@ -635,6 +666,7 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 30 addiction_threshold = 25 + pH = 8.96 /datum/reagent/medicine/morphine/on_mob_add(mob/living/L) ..() @@ -703,6 +735,7 @@ color = "#FFFFFF" metabolization_rate = 0.25 * REAGENTS_METABOLISM taste_description = "dull toxin" + pH = 10 /datum/reagent/medicine/oculine/on_mob_life(mob/living/carbon/M) var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) @@ -734,6 +767,7 @@ color = "#000000" metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 35 + pH = 14 /datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/M) if(M.health < 0) @@ -763,6 +797,7 @@ color = "#D2FFFA" metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 + pH = 10.2 /datum/reagent/medicine/epinephrine/on_mob_life(mob/living/carbon/M) if(M.health < 0) @@ -799,6 +834,7 @@ color = "#A0E85E" metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "magnets" + pH = 0 /datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/carbon/human/M, method=TOUCH, reac_volume) if(M.stat == DEAD) @@ -832,6 +868,7 @@ id = "mannitol" description = "Efficiently restores brain damage." color = "#DCDCFF" + ph = 10.4 /datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/C) C.adjustBrainLoss(-2*REM) @@ -845,6 +882,7 @@ description = "Removes jitteriness and restores genetic defects." color = "#5096C8" taste_description = "acid" + pH = 2 /datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/M) M.jitteriness = 0 @@ -859,6 +897,7 @@ description = "Purges alcoholic substance from the patient's body and eliminates its side effects." color = "#00B4C8" taste_description = "raw egg" + pH = 4 /datum/reagent/medicine/antihol/on_mob_life(mob/living/carbon/M) M.dizziness = 0 @@ -880,6 +919,7 @@ color = "#78008C" metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 60 + pH = 8.7 /datum/reagent/medicine/stimulants/on_mob_add(mob/living/L) ..() @@ -917,6 +957,7 @@ reagent_state = LIQUID color = "#FFFFF0" metabolization_rate = 0.5 * REAGENTS_METABOLISM + pH = 6.7 /datum/reagent/medicine/insulin/on_mob_life(mob/living/carbon/M) if(M.AdjustSleeping(-20, FALSE)) @@ -932,6 +973,7 @@ reagent_state = LIQUID color = "#C8A5DC" overdose_threshold = 30 + pH = 5 /datum/reagent/medicine/bicaridine/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-2*REM, 0) @@ -950,6 +992,7 @@ reagent_state = LIQUID color = "#C8A5DC" overdose_threshold = 30 + pH = 9.7 /datum/reagent/medicine/dexalin/on_mob_life(mob/living/carbon/M) M.adjustOxyLoss(-2*REM, 0) @@ -968,6 +1011,7 @@ reagent_state = LIQUID color = "#C8A5DC" overdose_threshold = 30 + pH = 9 /datum/reagent/medicine/kelotane/on_mob_life(mob/living/carbon/M) M.adjustFireLoss(-2*REM, 0) @@ -987,6 +1031,7 @@ color = "#C8A5DC" overdose_threshold = 30 taste_description = "a roll of gauze" + pH = 10 /datum/reagent/medicine/antitoxin/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(-2*REM, 0) @@ -1006,6 +1051,7 @@ description = "Stabilizes the breathing of patients. Good for those in critical condition." reagent_state = LIQUID color = "#C8A5DC" + pH = 8.5 /datum/reagent/medicine/inaprovaline/on_mob_life(mob/living/carbon/M) if(M.losebreath >= 5) @@ -1060,6 +1106,7 @@ description = "Miniature medical robots that swiftly restore bodily damage." reagent_state = SOLID color = "#555555" + pH = 11 /datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-5*REM, 0) //A ton of healing - this is a 50 telecrystal investment. @@ -1081,6 +1128,7 @@ color = "#91D865" overdose_threshold = 30 taste_description = "jelly" + pH = 13 /datum/reagent/medicine/neo_jelly/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-1.5*REM, 0) @@ -1103,6 +1151,7 @@ description = "Ichor from an extremely powerful plant. Great for restoring wounds, but it's a little heavy on the brain." color = rgb(255, 175, 0) overdose_threshold = 25 + pH = 11 /datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-3 * REM, 0) @@ -1130,6 +1179,7 @@ reagent_state = LIQUID color = "#27870a" metabolization_rate = 0.4 * REAGENTS_METABOLISM + pH = 4.3 /datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/M) for(var/datum/reagent/drug/R in M.reagents.reagent_list) @@ -1152,6 +1202,7 @@ color = "#C8A5DC" // rgb: 200, 165, 220 overdose_threshold = 3 //To prevent people stacking massive amounts of a very strong healing reagent can_synth = FALSE + pH = 14 /datum/reagent/medicine/lavaland_extract/on_mob_life(mob/living/carbon/M) M.heal_bodypart_damage(5,5) @@ -1214,6 +1265,7 @@ description = "A medication used to treat pain, fever, and inflammation, along with heart attacks." color = "#F5F5F5" self_consuming = TRUE + pH = 12.5 /datum/reagent/medicine/corazone/on_mob_add(mob/living/M) ..() @@ -1246,6 +1298,7 @@ overdose_threshold = 20 // with the random effects this might be awesome or might kill you at less than 10u (extensively tested) taste_description = "salt" // it actually does taste salty var/overdose_progress = 0 // to track overdose progress + pH = 7.89 /datum/reagent/medicine/modafinil/on_mob_add(mob/living/M) M.add_trait(TRAIT_SLEEPIMMUNE, id) @@ -1311,6 +1364,7 @@ color = "#07E79E" metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 + pH = 9.12 /datum/reagent/medicine/psicodine/on_mob_add(mob/living/L) ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index adfc1a507e..558f2ebdf4 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -10,6 +10,7 @@ glass_name = "glass of tomato juice" glass_desc = "Are you sure this is tomato juice?" shot_glass_icon_state = "shotglassred" + pH = 7.4 /datum/reagent/blood/reaction_mob(mob/living/L, method=TOUCH, reac_volume) if(data && data["viruses"]) @@ -95,6 +96,7 @@ description = "You don't even want to think about what's in here." taste_description = "gross iron" shot_glass_icon_state = "shotglassred" + pH = 7.45 /datum/reagent/vaccine //data must contain virus type @@ -195,6 +197,7 @@ glass_icon_state = "glass_clear" glass_name = "glass of holy water" glass_desc = "A glass of holy water." + pH = 7.5 //God is alkaline /datum/reagent/water/holywater/on_mob_add(mob/living/L) ..() @@ -266,6 +269,7 @@ id = "unholywater" description = "Something that shouldn't exist on this plane of existence." taste_description = "suffering" + pH = 6.5 /datum/reagent/fuel/unholywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) @@ -308,6 +312,7 @@ M.adjustFireLoss(1, 0) //Hence the other damages... ain't I a bastard? M.adjustBrainLoss(5, 150) holder.remove_reagent(id, 1) + pH = 0.1 /datum/reagent/medicine/omnizine/godblood name = "Godblood" @@ -336,6 +341,7 @@ metabolization_rate = 10 * REAGENTS_METABOLISM // very fast, so it can be applied rapidly. But this changes on an overdose overdose_threshold = 11 //Slightly more than one un-nozzled spraybottle. taste_description = "sour oranges" + pH = 5 /datum/reagent/spraytan/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(ishuman(M)) @@ -660,6 +666,7 @@ color = "#202040" // rgb: 20, 20, 40 metabolization_rate = 0.25 * REAGENTS_METABOLISM taste_description = "bitterness" + pH = 10 /datum/reagent/serotrotium/on_mob_life(mob/living/carbon/M) if(ishuman(M)) @@ -674,6 +681,7 @@ reagent_state = GAS color = "#808080" // rgb: 128, 128, 128 taste_mult = 0 // oderless and tasteless + pH = 9.2//It's acutally a huge range and very dependant on the chemistry but pH is basically a made up var in it's implementation anyways /datum/reagent/oxygen/reaction_obj(obj/O, reac_volume) if((!O) || (!reac_volume)) @@ -694,6 +702,7 @@ reagent_state = SOLID color = "#6E3B08" // rgb: 110, 59, 8 taste_description = "metal" + pH = 5.5 /datum/reagent/copper/reaction_obj(obj/O, reac_volume) if(istype(O, /obj/item/stack/sheet/metal)) @@ -710,6 +719,7 @@ color = "#808080" // rgb: 128, 128, 128 taste_mult = 0 + /datum/reagent/nitrogen/reaction_obj(obj/O, reac_volume) if((!O) || (!reac_volume)) return 0 @@ -729,6 +739,7 @@ reagent_state = GAS color = "#808080" // rgb: 128, 128, 128 taste_mult = 0 + pH = 0.1//Now I'm stuck in a trap of my own design. Maybe I should make -ve pHes? (not 0 so I don't get div/0 errors) /datum/reagent/potassium name = "Potassium" @@ -760,6 +771,7 @@ reagent_state = SOLID color = "#BF8C00" // rgb: 191, 140, 0 taste_description = "rotten eggs" + pH = 4.5 /datum/reagent/carbon name = "Carbon" @@ -768,6 +780,7 @@ reagent_state = SOLID color = "#1C1300" // rgb: 30, 20, 0 taste_description = "sour chalk" + pH = 5 /datum/reagent/carbon/reaction_turf(turf/T, reac_volume) if(!isspaceturf(T)) @@ -782,6 +795,7 @@ reagent_state = GAS color = "#808080" // rgb: 128, 128, 128 taste_description = "chlorine" + pH = 7.4 /datum/reagent/chlorine/on_mob_life(mob/living/carbon/M) M.take_bodypart_damage(1*REM, 0, 0, 0) @@ -795,6 +809,7 @@ reagent_state = GAS color = "#808080" // rgb: 128, 128, 128 taste_description = "acid" + pH = 2 /datum/reagent/fluorine/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(1*REM, 0) @@ -808,6 +823,7 @@ reagent_state = SOLID color = "#808080" // rgb: 128, 128, 128 taste_description = "salty metal" + pH = 11.6 /datum/reagent/phosphorus name = "Phosphorus" @@ -816,6 +832,7 @@ reagent_state = SOLID color = "#832828" // rgb: 131, 40, 40 taste_description = "vinegar" + pH = 6.5 /datum/reagent/lithium name = "Lithium" @@ -824,6 +841,7 @@ reagent_state = SOLID color = "#808080" // rgb: 128, 128, 128 taste_description = "metal" + pH = 11.3 /datum/reagent/lithium/on_mob_life(mob/living/carbon/M) if(M.canmove && !isspaceturf(M.loc)) @@ -838,6 +856,7 @@ description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." color = "#808080" // rgb: 128, 128, 128 taste_description = "sweetness" + pH = 9 /datum/reagent/radium name = "Radium" @@ -846,6 +865,7 @@ reagent_state = SOLID color = "#C7C7C7" // rgb: 199,199,199 taste_description = "the colour blue and regret" + pH = 10 /datum/reagent/radium/on_mob_life(mob/living/carbon/M) M.apply_effect(2*REM/M.metabolism_efficiency,EFFECT_IRRADIATE,0) @@ -865,6 +885,7 @@ description = "Sterilizes wounds in preparation for surgery." color = "#C8A5DC" // rgb: 200, 165, 220 taste_description = "bitterness" + pH = 10.5 /datum/reagent/space_cleaner/sterilizine/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume) if(method in list(TOUCH, VAPOR, PATCH)) @@ -880,6 +901,7 @@ description = "Pure iron is a metal." reagent_state = SOLID taste_description = "iron" + pH = 6 color = "#C8A5DC" // rgb: 200, 165, 220 @@ -922,6 +944,7 @@ reagent_state = SOLID color = "#B8B8C0" // rgb: 184, 184, 192 taste_description = "the inside of a reactor" + pH = 4 /datum/reagent/uranium/on_mob_life(mob/living/carbon/M) M.apply_effect(1/M.metabolism_efficiency,EFFECT_IRRADIATE,0) @@ -942,6 +965,7 @@ reagent_state = SOLID color = "#0000CC" taste_description = "fizzling blue" + pH = 12 /datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) @@ -974,6 +998,7 @@ reagent_state = SOLID color = "#A8A8A8" // rgb: 168, 168, 168 taste_mult = 0 + pH = 10 /datum/reagent/fuel name = "Welding fuel" @@ -984,6 +1009,8 @@ glass_icon_state = "dr_gibb_glass" glass_name = "glass of welder fuel" glass_desc = "Unless you're an industrial tool, this is probably not safe for consumption." + pH = 4 + /datum/reagent/fuel/reaction_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with welding fuel to make them easy to ignite! if(method == TOUCH || method == VAPOR) @@ -1002,6 +1029,7 @@ description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" color = "#A5F0EE" // rgb: 165, 240, 238 taste_description = "sourness" + pH = 5.5 /datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume) if(istype(O, /obj/effect/decal/cleanable)) @@ -1059,6 +1087,7 @@ description = "A powerful, acidic cleaner sold by Waffle Co. Affects organic matter while leaving other objects unaffected." metabolization_rate = 1.5 * REAGENTS_METABOLISM taste_description = "acid" + pH = 2 /datum/reagent/space_cleaner/ez_clean/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(3.33) @@ -1093,6 +1122,7 @@ description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." color = "#C8A5DC" // rgb: 200, 165, 220A taste_description = "numbness" + pH = 9.1 /datum/reagent/impedrezene/on_mob_life(mob/living/carbon/M) M.jitteriness = max(M.jitteriness-5,0) @@ -1135,6 +1165,7 @@ color = "#92D17D" // rgb: 146, 209, 125 can_synth = FALSE taste_description = "slime" + pH = 11 /datum/reagent/fungalspores/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) @@ -1146,6 +1177,7 @@ description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." color = "#9E6B38" // rgb: 158, 107, 56 taste_description = "metal" + pH = 13 /datum/reagent/foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. name = "Foaming agent" @@ -1154,6 +1186,7 @@ reagent_state = SOLID color = "#664B63" // rgb: 102, 75, 99 taste_description = "metal" + pH = 12.5 /datum/reagent/smart_foaming_agent //Smart foaming agent. Functions similarly to metal foam, but conforms to walls. name = "Smart foaming agent" @@ -1162,6 +1195,7 @@ reagent_state = SOLID color = "#664B63" // rgb: 102, 75, 99 taste_description = "metal" + pH = 11.8 /datum/reagent/ammonia name = "Ammonia" @@ -1170,6 +1204,7 @@ reagent_state = GAS color = "#404030" // rgb: 64, 64, 48 taste_description = "mordant" + pH = 11.6 /datum/reagent/diethylamine name = "Diethylamine" @@ -1177,6 +1212,7 @@ description = "A secondary amine, mildly corrosive." color = "#604030" // rgb: 96, 64, 48 taste_description = "iron" + pH = 12 /datum/reagent/carbondioxide name = "Carbon Dioxide" @@ -1185,6 +1221,7 @@ description = "A gas commonly produced by burning carbon fuels. You're constantly producing this in your lungs." color = "#B0B0B0" // rgb : 192, 192, 192 taste_description = "something unknowable" + pH = 6 /datum/reagent/carbondioxide/reaction_obj(obj/O, reac_volume) if((!O) || (!reac_volume)) @@ -1206,6 +1243,7 @@ metabolization_rate = 1.5 * REAGENTS_METABOLISM color = "#808080" taste_description = "sweetness" + pH = 5.8 /datum/reagent/nitrous_oxide/reaction_obj(obj/O, reac_volume) if((!O) || (!reac_volume)) @@ -1265,6 +1303,7 @@ metabolization_rate = REAGENTS_METABOLISM color = "90560B" taste_description = "burning" + pH = 2 /datum/reagent/nitryl/on_mob_add(mob/living/L) ..() @@ -1298,6 +1337,7 @@ colorname = "red" color = "#DA0000" // red random_color_list = list("#DA0000") + pH = 0.5 /datum/reagent/colorful_reagent/crayonpowder/orange name = "Orange Crayon Powder" @@ -1305,6 +1345,7 @@ colorname = "orange" color = "#FF9300" // orange random_color_list = list("#FF9300") + pH = 2 /datum/reagent/colorful_reagent/crayonpowder/yellow name = "Yellow Crayon Powder" @@ -1312,6 +1353,7 @@ colorname = "yellow" color = "#FFF200" // yellow random_color_list = list("#FFF200") + pH = 5 /datum/reagent/colorful_reagent/crayonpowder/green name = "Green Crayon Powder" @@ -1320,12 +1362,14 @@ color = "#A8E61D" // green random_color_list = list("#A8E61D") + /datum/reagent/colorful_reagent/crayonpowder/blue name = "Blue Crayon Powder" id = "bluecrayonpowder" colorname = "blue" color = "#00B7EF" // blue random_color_list = list("#00B7EF") + pH = 10 /datum/reagent/colorful_reagent/crayonpowder/purple name = "Purple Crayon Powder" @@ -1333,6 +1377,7 @@ colorname = "purple" color = "#DA00FF" // purple random_color_list = list("#DA00FF") + pH = 13 /datum/reagent/colorful_reagent/crayonpowder/invisible name = "Invisible Crayon Powder" @@ -1367,6 +1412,7 @@ color = "#000000" // RBG: 0, 0, 0 var/tox_prob = 0 taste_description = "plant food" + pH = 3 /datum/reagent/plantnutriment/on_mob_life(mob/living/carbon/M) if(prob(tox_prob)) @@ -1380,6 +1426,7 @@ description = "Cheap and extremely common type of plant nutriment." color = "#376400" // RBG: 50, 100, 0 tox_prob = 10 + pH = 2 /datum/reagent/plantnutriment/left4zednutriment name = "Left 4 Zed" @@ -1387,6 +1434,7 @@ description = "Unstable nutriment that makes plants mutate more often than usual." color = "#1A1E4D" // RBG: 26, 30, 77 tox_prob = 25 + pH = 1.5 /datum/reagent/plantnutriment/robustharvestnutriment name = "Robust Harvest" @@ -1394,6 +1442,7 @@ description = "Very potent nutriment that prevents plants from mutating." color = "#9D9D00" // RBG: 157, 157, 0 tox_prob = 15 + pH = 1 @@ -1421,6 +1470,7 @@ color = "#C8A5DC" taste_description = "bitterness" taste_mult = 1.5 + pH = 1.5 /datum/reagent/stable_plasma/on_mob_life(mob/living/carbon/C) C.adjustPlasma(10) @@ -1433,6 +1483,7 @@ reagent_state = LIQUID color = "#C8A5DC" taste_description = "metal" + pH = 4.5 /datum/reagent/carpet name = "Carpet" @@ -1440,7 +1491,7 @@ description = "For those that need a more creative way to roll out a red carpet." reagent_state = LIQUID color = "#C8A5DC" - taste_description = "carpet" // Your tounge feels furry. + taste_description = "carpet" // Your tounge feels furry. Ick /datum/reagent/carpet/reaction_turf(turf/T, reac_volume) if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) @@ -1455,6 +1506,7 @@ reagent_state = LIQUID color = "#C8A5DC" taste_description = "chemicals" + pH = 7.8 /datum/reagent/phenol name = "Phenol" @@ -1463,6 +1515,7 @@ reagent_state = LIQUID color = "#C8A5DC" taste_description = "acid" + pH = 5 /datum/reagent/ash name = "Ash" @@ -1471,6 +1524,7 @@ reagent_state = LIQUID color = "#C8A5DC" taste_description = "ash" + pH = 6.5 /datum/reagent/acetone name = "Acetone" @@ -1568,6 +1622,7 @@ reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 taste_description = "cool salt" + pH = 11.2 /datum/reagent/lye name = "Lye" @@ -1584,6 +1639,7 @@ reagent_state = LIQUID color = "#A70FFF" taste_description = "dryness" + pH = 10.7 /datum/reagent/drying_agent/reaction_turf(turf/open/T, reac_volume) if(istype(T)) @@ -1655,6 +1711,7 @@ description = "Royal Bee Jelly, if injected into a Queen Space Bee said bee will split into two bees." color = "#00ff80" taste_description = "strange honey" + pH = 3 /datum/reagent/royal_bee_jelly/on_mob_life(mob/living/carbon/M) if(prob(2)) @@ -1676,6 +1733,7 @@ metabolization_rate = INFINITY can_synth = FALSE taste_description = "brains" + pH = 0.5 /datum/reagent/romerol/reaction_mob(mob/living/carbon/human/H, method=TOUCH, reac_volume) // Silently add the zombie infection organ to be activated upon death @@ -1734,6 +1792,7 @@ description = "the petroleum based components of plastic." color = "#f7eded" taste_description = "plastic" + pH = 6 /datum/reagent/glitter name = "generic glitter" @@ -1776,6 +1835,7 @@ color = "#AAAAAA55" taste_description = "water" metabolization_rate = 0.25 * REAGENTS_METABOLISM + pH = 15 /datum/reagent/pax/on_mob_add(mob/living/L) ..() @@ -1863,12 +1923,13 @@ description = "The primary precursor for an ancient feline delicacy known as skooma. While it has no notable effects on it's own, mixing it with morphine in a chilled container may yield interesting results." color = "#FAEAFF" taste_description = "synthetic catnip" - + /datum/reagent/moonsugar/on_mob_life(mob/living/carbon/M) if(prob(20)) to_chat(M, "You find yourself unable to supress the desire to meow!") M.emote("nya") +//Kept for legacy, I think it will break everything if you enable it. /datum/reagent/penis_enlargement name = "Penis Enlargement" id = "penis_enlargement" @@ -1885,4 +1946,3 @@ P.length += added_length P.update() ..() - diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 64020bf167..86916217be 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -1,3 +1,5 @@ +#define TONGUE_MAX_HEALTH 50 + /obj/item/organ/tongue name = "tongue" desc = "A fleshy muscle mostly used for lying." @@ -8,6 +10,8 @@ var/list/languages_possible var/say_mod = null var/taste_sensitivity = 15 // lower is more sensitive. + var/maxHealth = TONGUE_MAX_HEALTH + var/damage = 0 var/static/list/languages_possible_base = typecacheof(list( /datum/language/common, /datum/language/draconic, @@ -29,6 +33,25 @@ /obj/item/organ/tongue/proc/TongueSpeech(var/message) return message +/obj/item/organ/tongue/proc/adjustTongueLoss(mob/living/carbon/M, damage_mod) + if (maxHealth == "alien") + return + if (maxHealth == "bone") + var/target = M.get_bodypart(BODY_ZONE_HEAD) + M.apply_damage(damage_mod, BURN, target) + to_chat(M, "The drink burns your skull! Oof, your bones!") + return + + damage += damage_mod + if ((damage / maxHealth) > 1) + to_chat(M, "Your tongue is singed beyond recognition, and disintegrates!") + qdel(src) + else if ((damage / maxHealth) > 0.85) + to_chat(M, "Your tongue feels like it's about to fall out!.") + else if ((damage / maxHealth) > 0.5) + to_chat(M, "Your tongue is really starting to hurt.") + + /obj/item/organ/tongue/Insert(mob/living/carbon/M, special = 0) ..() if(say_mod && M.dna && M.dna.species) @@ -48,6 +71,7 @@ icon_state = "tonguelizard" say_mod = "hisses" taste_sensitivity = 10 // combined nose + tongue, extra sensitive + maxHealth = 35 //extra sensitivity means tongue is more susceptible to damage /obj/item/organ/tongue/lizard/TongueSpeech(var/message) var/regex/lizard_hiss = new("s+", "g") @@ -63,6 +87,7 @@ icon_state = "tonguefly" say_mod = "buzzes" taste_sensitivity = 25 // you eat vomit, this is a mercy + maxHealth = 80 //years of eatting trash has made your tongue strong /obj/item/organ/tongue/fly/TongueSpeech(var/message) var/regex/fly_buzz = new("z+", "g") @@ -78,6 +103,7 @@ icon_state = "tongueayylmao" say_mod = "gibbers" taste_sensitivity = 101 // ayys cannot taste anything. + maxHealth = 120 //Ayys probe a lot /obj/item/organ/tongue/abductor/TongueSpeech(var/message) //Hacks @@ -104,6 +130,7 @@ icon_state = "tonguezombie" say_mod = "moans" taste_sensitivity = 32 + maxHealth = 60 //Stop! It's already dead...! /obj/item/organ/tongue/zombie/TongueSpeech(var/message) var/list/message_list = splittext(message, " ") @@ -127,6 +154,7 @@ icon_state = "tonguexeno" say_mod = "hisses" taste_sensitivity = 10 // LIZARDS ARE ALIENS CONFIRMED + maxHealth = "alien" var/static/list/languages_possible_alien = typecacheof(list( /datum/language/xenocommon, /datum/language/common, @@ -149,6 +177,7 @@ say_mod = "rattles" attack_verb = list("bitten", "chattered", "chomped", "enamelled", "boned") taste_sensitivity = 101 // skeletons cannot taste anything + maxHealth = "bone" //Take brute damage instead var/chattering = FALSE var/phomeme_type = "sans" @@ -178,6 +207,7 @@ name = "plasma bone \"tongue\"" desc = "Like animated skeletons, Plasmamen vibrate their teeth in order to produce speech." icon_state = "tongueplasma" + maxHealth = "alien" /obj/item/organ/tongue/bone/plasmaman/get_spans() return @@ -190,6 +220,7 @@ say_mod = "states" attack_verb = list("beeped", "booped") taste_sensitivity = 25 // not as good as an organic tongue + maxHealth = 100 //RoboTongue! /obj/item/organ/tongue/robot/can_speak_in_language(datum/language/dt) . = TRUE // THE MAGIC OF ELECTRONICS @@ -203,6 +234,7 @@ desc = "OwO what's this?" icon_state = "tonguenormal" taste_sensitivity = 10 // extra sensitive and inquisitive uwu + maxHealth = 35 //Sensitive tongue! /obj/item/organ/tongue/OwO/TongueSpeech(var/message) if(copytext(message, 1, 2) != "*") diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 6db8d4a8b3..6b3fbdf201 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -312,7 +312,8 @@ /obj/item/clothing/suit/toggle/labcoat/chemist = 2, /obj/item/storage/backpack/chemistry = 2, /obj/item/storage/backpack/satchel/chem = 2, - /obj/item/storage/bag/chemistry = 2) + /obj/item/storage/bag/chemistry = 2, + /obj/item/pHbooklet = 2)//pH indicator) refill_canister = /obj/item/vending_refill/wardrobe/chem_wardrobe /obj/item/vending_refill/wardrobe/chem_wardrobe diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index cdeae92ae1..20be8816d5 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1,4 +1,4 @@ -//Fermichem!! + //Fermichem!! //Fun chems for all the family //MCchem @@ -15,7 +15,7 @@ taste_description = "If affection had a taste, this would be it." var/ImpureChem = "toxin" // What chemical is metabolised with an inpure reaction var/InverseChemVal = 0 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising - var/InverseChem = "Initropidril" // What chem is metabolised when purity is below InverseChemVal + var/InverseChem = "Initropidril" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. ///datum/reagent/fermi/on_mob_life(mob/living/carbon/M) //current_cycle++ @@ -28,6 +28,8 @@ //This should process fermichems to find out how pure they are and what effect to do. //TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE /datum/reagent/fermi/on_mob_add(mob/living/carbon/M) + if(src.purity < 0) + CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") if (src.purity == 1) return else if (src.InverseChemVal > src.purity) @@ -278,6 +280,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/pollStarted = FALSE var/location_created var/startHunger + var/ImpureChem = "SDGFtox" + var/InverseChemVal = 0.5 + var/InverseChem = "SDZF" //var/fClone_current_controller = OWNER //var/mob/living/split_personality/clone//there's two so they can swap without overwriting @@ -573,7 +578,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING taste_description = "a milky ice cream like flavour." overdose_threshold = 12 metabolization_rate = 0.5 - var/mob/living/carbon/human/H + //var/mob/living/carbon/human/H + var/ImpureChem = "BEsmaller" //If you make an inpure chem, it stalls growth + var/InverseChemVal = 0.25 + var/InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse /datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M) var/mob/living/carbon/human/H = M @@ -629,7 +637,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!") if(P) - P.length = P.length - 0.1 + P.cached_length = P.cached_length - 0.1 message_admins("lewdsnek size: [P.size], [P.cached_length], [holder]") P.update() if(T) @@ -644,6 +652,24 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING W = nW ..() +/datum/reagent/fermi/BEsmaller + name = "Sucubus milk" + id = "BEsmaller" + description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." + color = "#E60584" // rgb: 96, 0, 255 + taste_description = "a milky ice cream like flavour." + metabolization_rate = 0.5 + +/datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M) + var/mob/living/carbon/human/H = M + var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") + if(!B) + return + B.cached_size = B.cached_size - 0.1 + B.update() + ..() + + //////////////////////////////////////////////////////////////////////////////////////////////////// // PENIS ENLARGE /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -660,17 +686,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING taste_description = "chinese dragon powder" overdose_threshold = 12 //ODing makes you male and removes female genitals metabolization_rate = 0.5 - - //var/mob/living/carbon/M - //var/mob/living/carbon/human/species/S - /* - var/obj/item/organ/genital/penis/P - var/obj/item/organ/genital/testicles/T - var/obj/item/organ/genital/vagina/V - var/obj/item/organ/genital/womb/W - var/obj/item/organ/genital/breasts/B - */ - var/mob/living/carbon/human/H + var/ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth + var/InverseChemVal = 0.25 + var/InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse + //var/mob/living/carbon/human/H /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch. var/mob/living/carbon/human/H = M @@ -706,7 +725,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING message_admins("PE Breast status: [B]") if(M.gender == FEMALE) M.gender = MALE - M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") + M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine as your !") if(B) B.cached_size = B.cached_size - 0.1 @@ -721,6 +740,23 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING nT.Insert(M) T = nT ..() + +/datum/reagent/fermi/PElarger // Due to cozmo's request...! + name = "Incubus draft" + id = "PElarger" + description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? dumb + color = "#888888" // This is greyish..? + taste_description = "chinese dragon powder" + metabolization_rate = 0.5 + +/datum/reagent/fermi/PEsmaller/on_mob_life(mob/living/carbon/M) + var/mob/living/carbon/human/H = M + var/obj/item/organ/genital/breasts/P = M.getorganslot("penis") + if(!B) + return + P.cached_size = P.cached_size - 0.1 + P.update() + ..() /* //////////////////////////////////////////////////////////////////////////////////////////////////// // ASTROGEN @@ -749,7 +785,6 @@ Buginess level: low addiction_stage1_end = 9999//Should never end. There is no escape make your time var/mob/living/carbon/origin var/mob/living/simple_animal/hostile/retaliate/ghost/G = null - var/ODing = FALSE var/antiGenetics = 255 var/sleepytime = 0 //var/Svol = volume @@ -775,10 +810,10 @@ Buginess level: low G.alpha = 35 G.name = "[M]'s astral projection" M.mind.transfer_to(G) - sleepytime = 10*volume + sleepytime = 15*volume if(overdosed) if(prob(50)) - to_chat(M, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") + to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") do_teleport(G, M.loc) holder.remove_reagent(src.id, current_cycle, FALSE) ..() @@ -787,8 +822,8 @@ Buginess level: low G.mind.transfer_to(origin) qdel(G) if(overdosed) + to_chat(M, "The high volume of Astrogren you just took causes you to black out momentarily as your mind snaps back to your body.") M.Sleeping(sleepytime, 0) - ODing = FALSE ..() //Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. @@ -1090,12 +1125,12 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/hatmium/on_mob_life(mob/living/carbon/human/M) //hat.armor = list("melee" = (1+(current_cycle/20)), "bullet" = (1+(current_cycle/20)), "laser" = (1+(current_cycle/20)), "energy" = (1+(current_cycle/20)), "bomb" = (1+(current_cycle/20)), "bio" = (1+(current_cycle/20)), "rad" = (1+(current_cycle/20)), "fire" = (1+(current_cycle/20)), "acid" = (1+(current_cycle/20))) + var/hatArmor = (1+(current_cycle/10)) if(!overdosed) for (var/i in hat.armor) - hat.armor[i] = -(1+(current_cycle/10)) //Doesn't work aaarghhhhh!!!! - else + hat.armor.modifyRating = (hatArmor, hatArmor, hatArmor, hatArmor, hatArmor, hatArmor, hatArmor, hatArmor) for (var/i in hat.armor) - hat.armor[i] = (1+(current_cycle/10)) + hat.armor.modifyRating = (-hatArmor, -hatArmor, -hatArmor, -hatArmor, -hatArmor, -hatArmor, -hatArmor, -hatArmor, -hatArmor) ..() //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index ff78aea252..425d54becf 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -48,13 +48,13 @@ HIonRelease = 0.01 // pH change per 1u reaction RateUpLim = 5 // Optimal/max rate possible if all conditions are perfect FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics - FermiExplode = FALSE // If the chemical explodes in a special way + FermiExplode = TRUE // If the chemical explodes in a special way /datum/chemical_reaction/BElarger name = "" id = "e" results = list("Eigenstasium" = 6) - required_reagents = list("salglu_solution" = 1, "milk" = 5, "synthflesh" = 2, "silicon" = 2, "crocin" = 2) + required_reagents = list("salglu_solution" = 1, "milk" = 5, "synthflesh" = 2, "silicon" = 2, "aphro" = 2) //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 500 // Upper end for above diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 2ea13b92c1..40372bd6b4 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -5,6 +5,8 @@ icon = 'modular_citadel/icons/obj/FermiChem.dmi' item_flags = NOBLUDGEON var/numberOfPages = 50 + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_TINY //set flammable somehow /obj/item/pHbooklet/attack_hand(mob/user) @@ -37,4 +39,6 @@ //item_flags = NOBLUDGEON color = "#f5c352" var/used = FALSE + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_TINY //set flammable somehow diff --git a/modular_citadel/icons/obj/FermiChem.dmi b/modular_citadel/icons/obj/FermiChem.dmi index ffc50d28992e145f5b59292d302c6a2bddb70331..37da7f6aca27ec3b1983b161475e11aeb878c922 100644 GIT binary patch literal 1877 zcmV-b2demqP)V=-0C=2@%}WY{FcgL1ak7ew&P!j@OsdiZRD`Y|)>{*NBqW!X?!E(|v(n7Y z478*l*bqU$ zfwM=@3vT->z3iQvW~2n^wa4(+$*wML_kg%2(J^Rml4Os1`u(3n)s|2;ihls_h*v=4 zFvv zgB5Y0mmVrqsZ}Maszo_~g1`qv)T{4E_|O)J+o-LZs0{@<774a6MqVo>R+Q;sGn@5( zf6T@N<|nPzp4pGd^Stx!%&Y@&IBzpTs~g~zYPn3Tj@cgyG5I^`y;xlj0QRuD5CB}7 zn$i{HyQ^23HQ0{eep4-%2`dwr8E|Q8iX?`HH08O41y;8JAVps*P1w`c27p~}ur$CZ zs`coP#WZEC4QLhBa+y%^0d_{18la5o>6x1VfaLkl)N~#8*eZ9(&r_h z28g1lDXZ1QrtON06Dk+; z*Vj-g6_K93Eti!_MbztS`0?AX0RYRZ&o!H#aZbr*GDIozteI5G zNqYcj#kUkbe-4Oj2Us9>0_zV32mrKybfcxS{f$P$w4Uiq*oj$sm_@x>csbfBMS?)= z#P;`4JA}P4tUowM+?c>}vS&6VWoiIR^n_POIsgRrC9oOENngtAK&ZW`UO0TrwF!Ra ze)%5if>WnQnNRbT*S!DB&xQ@kEiM88&i3B{o=S%Wl?OxwIln8TJ+Lo<&9xjhJC+bA zAC(G2?I5q7K-e4eWP)3)QV*rcfK#VO$%m&t#>+|tmC6eMKz@1I_DzkBeK#CNFxZ6y z!5{z-GZTym>`MRuHX}I%>PI!v-eiKJzLh4}nGIW}pp|FOY~S#or6t?P>M=1nDWtAl zBR~E3DbC^!0{aIvDFuK=WQx)R08($zIo}GeqaVA`57;o^{%?QCpF2DEH`R$^RsMW@ zAkJhIq%>iCIO|wsxu+;n5(zz#$~u;ItQXi_3$irehi|@;KVSUfOT)UERLb)xh(b-6 zogXnY0caLk9qH=l0yWHUoJ2q1a2}u(TwTYSiOESJo5_&bdFlK3aMn^}0J=t@zAk;Q zAI0qa2!I=g_hm8paDjb@NuN z=>$4qqH_TN@_fK8RQv&O5?AC~H<_#6Etl9{@W4vIHf~tr{dr>Ilw@S#?x{q{EqZA~aE6V2pK%tOFG}_y=ZsZ3ngjb_y zgu2`-nhPb4pY-)-e_lsG91e%W;c(tEMw7{Vqsinwt1^xcj3$%!y88MqclGsMrh@C0 zx#6|_UC`^s;F&X@*eP?0qc>u2GYjeT-Gy}eu2q>+xB+hzPYJm~wl_Q_E%|3Uk_92i zGQIcicnHsJiB7kLoV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6# za*U0*I5Sc+(=$pSoZ^zil2jm5$s@qWIW@PSq*95CGbOXA7$|1Q#hF%=n41b=!&Me| zB<1I4=cJYpp|T*cAhigWI%Ne{KNqlL0k*F*70wH!{Qv*~_(?=TR9J=8*Ntw1Fcbyg z0+s@!4u&|Wy#I6V-WEz*paL~!9uqXU^YsU1k&ur|G{y5bv5c?m2jT>?1`r<*&$(cZ z0x&G4i9C3KNk}0saG@-t7n(5|-vzlvTR@sea|0S9R?J)NwJq8k}FR739Yi zo&d6rWAlph8Uaganq~>W$?@$Zk=1E%5Nca!ZtcDN)lo0YdwXjv0IJwr5hP$-MwJ;r z!D!+$EW-u5uInN2G+qS*0KsUE6i&zlpabO&t7;ESKns;2a2tRQ4m@w71&{)W%3MZO z^Ez<=`zqLg6wGD7F)4Ol1ue{zQ2lfUKyY$z9RNO0#zvTZ_#C0&1p79Cf?kH%C!%jw z(+c853borOqRRw4%rHFBEdVtMw+}!sdXY26s0_Tw;Y7azjLXpb?*LQ{PdxxpHyyG8 zFc~j^gnLH7*FcEJBd25X{2`#f0jxx9WN-if#QQ&g9}p-+!w^J3e+VKJfW$du>W{|p zz6qQm>^>521{VEb;NTuaFJD3E76xC$kDGuCynhE?Jb~kV7dY6LKO#aVAcdel5 Date: Thu, 16 May 2019 01:26:46 +0100 Subject: [PATCH 117/608] On-mob_life proc doesn't work for some reason. Fix it/badger helpers. --- code/modules/mob/living/taste.dm | 1 - code/modules/reagents/chemistry/reagents.dm | 2 +- .../chemistry/reagents/medicine_reagents.dm | 20 +++++----- .../chemistry/reagents/fermi_reagents.dm | 40 ++++++++++--------- 4 files changed, 32 insertions(+), 31 deletions(-) diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index 71eb84ab5e..1c0fc9da1d 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -41,7 +41,6 @@ if (!T) return ..() - return if ((from.pH > 12.5) || (from.pH < 1.5)) to_chat(src, "You taste chemical burns!") T.adjustTongueLoss(src, 5) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 93c40785f3..87d823cf52 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -35,7 +35,7 @@ var/self_consuming = FALSE //Fermichem vars: var/purity = 1 - var/impureChem = "toxin" + //var/ImpureChem = "toxin" var/loc = null //Should be the creation location! var/pH = 7 diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 097de0cadc..66a5a629f8 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -204,7 +204,7 @@ color = "#669900" // rgb: 102, 153, 0 overdose_threshold = 30 taste_description = "fish" - ph = 12.2 + pH = 12.2 /datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/M) M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. @@ -868,7 +868,7 @@ id = "mannitol" description = "Efficiently restores brain damage." color = "#DCDCFF" - ph = 10.4 + pH = 10.4 /datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/C) C.adjustBrainLoss(-2*REM) @@ -1120,14 +1120,14 @@ . = 1 /datum/reagent/medicine/neo_jelly - name = "Neo Jelly" - id = "neo_jelly" - description = "Gradually regenerates all types of damage, without harming slime anatomy.Can OD" - reagent_state = LIQUID - metabolization_rate = 1 * REAGENTS_METABOLISM - color = "#91D865" - overdose_threshold = 30 - taste_description = "jelly" + name = "Neo Jelly" + id = "neo_jelly" + description = "Gradually regenerates all types of damage, without harming slime anatomy.Can OD" + reagent_state = LIQUID + metabolization_rate = 1 * REAGENTS_METABOLISM + color = "#91D865" + overdose_threshold = 30 + taste_description = "jelly" pH = 13 /datum/reagent/medicine/neo_jelly/on_mob_life(mob/living/carbon/M) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 20be8816d5..fcfda529d8 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -41,6 +41,7 @@ var/impureVol = volume * (1 - pureVol) holder.remove_reagent(src.id, (volume*impureVol), FALSE) holder.add_reagent(src.ImpureChem, impureVol, FALSE) + return @@ -280,9 +281,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/pollStarted = FALSE var/location_created var/startHunger - var/ImpureChem = "SDGFtox" - var/InverseChemVal = 0.5 - var/InverseChem = "SDZF" + ImpureChem = "SDGFtox" + InverseChemVal = 0.5 + InverseChem = "SDZF" //var/fClone_current_controller = OWNER //var/mob/living/split_personality/clone//there's two so they can swap without overwriting @@ -577,13 +578,13 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING color = "#E60584" // rgb: 96, 0, 255 taste_description = "a milky ice cream like flavour." overdose_threshold = 12 - metabolization_rate = 0.5 - //var/mob/living/carbon/human/H - var/ImpureChem = "BEsmaller" //If you make an inpure chem, it stalls growth - var/InverseChemVal = 0.25 - var/InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse + metabolization_rate = 0.5qa + ImpureChem = "BEsmaller" //If you make an inpure chem, it stalls growth + InverseChemVal = 0.25 + InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse /datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M) + ..() var/mob/living/carbon/human/H = M var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") if(!B) @@ -661,7 +662,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING metabolization_rate = 0.5 /datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M) - var/mob/living/carbon/human/H = M var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts") if(!B) return @@ -686,9 +686,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING taste_description = "chinese dragon powder" overdose_threshold = 12 //ODing makes you male and removes female genitals metabolization_rate = 0.5 - var/ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth - var/InverseChemVal = 0.25 - var/InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse + ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth + InverseChemVal = 0.25 + InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse //var/mob/living/carbon/human/H /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch. @@ -743,7 +743,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/PElarger // Due to cozmo's request...! name = "Incubus draft" - id = "PElarger" + id = "PEsmaller" description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? dumb color = "#888888" // This is greyish..? taste_description = "chinese dragon powder" @@ -751,10 +751,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/PEsmaller/on_mob_life(mob/living/carbon/M) var/mob/living/carbon/human/H = M - var/obj/item/organ/genital/breasts/P = M.getorganslot("penis") - if(!B) + var/obj/item/organ/genital/penis/P = H.getorganslot("penis") + if(!P) return - P.cached_size = P.cached_size - 0.1 + P.cached_length = P.cached_length - 0.1 P.update() ..() /* @@ -770,7 +770,7 @@ Addiction is particularlly brutal, it slowly turns you invisible with flavour te There's afairly major catch regarding the death though. I'm not gonna say here, go read the code, it explains it and puts my comments on it in context. I know that anyone reading it without understanding it is going to freak out so, this is my attempt to get you to read it and understand it. I'd like to point out from my calculations it'll take about 60-80 minutes to die this way too. Plenty of time to visit me and ask for some pills to quench your addiction. -Buginess level: low +Buginess level: works as intended - except teleport makes sparks for some reason. I'd like it to not if possible..? */ /datum/reagent/fermi/astral // Gives you the ability to astral project for a moment! @@ -1128,9 +1128,10 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y var/hatArmor = (1+(current_cycle/10)) if(!overdosed) for (var/i in hat.armor) - hat.armor.modifyRating = (hatArmor, hatArmor, hatArmor, hatArmor, hatArmor, hatArmor, hatArmor, hatArmor) + hat.armor = list("melee" = hatArmor, "bullet" = hatArmor, "laser" = hatArmor, "energy" = hatArmor, "bomb" = hatArmor, "bio" = hatArmor, "rad" = hatArmor, "fire" = hatArmor) + else for (var/i in hat.armor) - hat.armor.modifyRating = (-hatArmor, -hatArmor, -hatArmor, -hatArmor, -hatArmor, -hatArmor, -hatArmor, -hatArmor, -hatArmor) + hat.armor = list("melee" = -hatArmor, "bullet" = -hatArmor, "laser" = -hatArmor, "energy" = -hatArmor, "bomb" = -hatArmor, "bio" = -hatArmor, "rad" = -hatArmor, "fire" = -hatArmor) ..() //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1140,6 +1141,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y //Works as intended!! //Makes you nya and awoo //At a certain amount of time in your system it gives you a fluffy tongue owo! +//STATUS: ready /datum/reagent/fermi/furranium name = "Furranium" From fa5531285a2f8ac41cf9e2ed5558edc640069b03 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 17 May 2019 16:23:34 +0100 Subject: [PATCH 118/608] Push for Neko, probably doesn't compile atm. --- code/modules/reagents/chemistry/holder.dm | 38 ++++++++++----- code/modules/reagents/chemistry/reagents.dm | 3 +- .../chemistry/reagents/other_reagents.dm | 10 ++-- code/modules/surgery/organs/lungs.dm | 47 +++++++++++++++++-- code/modules/surgery/organs/tongue.dm | 3 ++ .../chemistry/reagents/fermi_reagents.dm | 9 ++-- .../reagents/chemistry/recipes/FermiCalc.Py | 7 +++ .../reagents/chemistry/recipes/fermi.dm | 12 ++++- 8 files changed, 103 insertions(+), 26 deletions(-) create mode 100644 modular_citadel/code/modules/reagents/chemistry/recipes/FermiCalc.Py diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 27b8b440f4..85f1f0ad69 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -1,4 +1,4 @@ - +im /proc/build_chemical_reagent_list() //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id @@ -484,6 +484,7 @@ return 0 else //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) + selected_reaction.on_reaction(src, multiplier) START_PROCESSING(SSprocessing, src) message_admins("FermiChem processing started") fermiIsReacting = TRUE @@ -558,8 +559,8 @@ targetVol = 0 handle_reactions() update_total() - - C.on_reaction(src, multiplier, special_react_result) + C.fermiFinish(src, multiplier) + //C.on_reaction(src, multiplier, special_react_result) return for(var/P in cached_results) targetVol = cached_results[P]*multiplier @@ -581,7 +582,8 @@ targetVol = 0 handle_reactions() update_total() - C.on_reaction(src, multiplier, special_react_result) + C.fermiFinish(src, multiplier) + //C.on_reaction(src, multiplier, special_react_result) return else STOP_PROCESSING(SSprocessing, src) @@ -591,7 +593,8 @@ targetVol = 0 handle_reactions() update_total() - C.on_reaction(src, multiplier, special_react_result) + C.fermiFinish(src, multiplier) + //C.on_reaction(src, multiplier, special_react_result) return //handle_reactions() @@ -613,13 +616,16 @@ if (chem_temp > C.ExplodeTemp) //go to explode proc message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") - FermiExplode() + C.FermiExplode(src, (reactedVol+targetVol), chem_temp, pH) - if (pH > 14 || pH < 0) + if (pH > 14) + pH = 14 + else (pH < 0 || ) + pH = 0 //Create chemical sludge eventually(for now just destroy the beaker I guess?) //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) message_admins("pH is lover limit, cur pH: [pH]") - FermiExplode() + //For now, purity is handled elsewhere @@ -630,14 +636,14 @@ deltapH = 0 return//If outside pH range, no reaction else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/((C.ReactpHLim**C.CurveSharppH)) //Upper range else if (pH > C.OptimalpHMin) if (pH > (C.OptimalpHMin + C.ReactpHLim)) deltapH = 0 return //If outside pH range, no reaction else - deltapH = ((C.ReactpHLim -(pH - (C.OptimalpHMax + C.ReactpHLim))+C.ReactpHLim)/(C.ReactpHLim**C.CurveSharppH)) + deltapH = (((pH - (C.OptimalpHMax + C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) //Within mid range else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) deltapH = 1 @@ -650,7 +656,7 @@ //Calculate DeltaT (Deviation of T from optimal) if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) - deltaT = (((C.OptimalTempMin - chem_temp)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) + deltaT = (((chem_temp - C.OptimalTempMin)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) else if (chem_temp >= C.OptimalTempMax) deltaT = 1 else @@ -692,6 +698,7 @@ SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp, purity)//add reagent function!! I THINK I can do this: + C.FermiCreate(src) message_admins("purity: [purity], purity of beaker") message_admins("Temp before change: [chem_temp], pH after change: [pH]") //Apply pH changes and thermal output of reaction to beaker @@ -809,6 +816,14 @@ WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") return FALSE + if (D.id == "water") //Do like an otter, add acid to water. + (if pH <= 2) + var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new + s.set_up(reagents, totalVol, pH*10, src) + s.start() + remove_any(amount/10) + + if(!pH) other_pH = D.pH @@ -872,6 +887,7 @@ if(istype(D, /datum/reagent/fermi))//Is this a fermichem? var/datum/reagent/fermi/FermiTime = D //It's Fermi time! FermiTime.fermiCreate(R.holder) //Seriously what is "data" ???? + //This is how I keep myself sane. diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 87d823cf52..289896ddac 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -131,7 +131,8 @@ rs += "[R.name], [R.volume]" return rs.Join(" | ") - +/* MOVED TO CHEMICAL REACTION //Handler for explosion reaction /datum/reagents/proc/FermiExplode(turf/T, obj/O, mob/living/M, volume) return +*/ diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 558f2ebdf4..1c8fefcfae 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1108,6 +1108,7 @@ color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 1.5 * REAGENTS_METABOLISM taste_description = "sourness" + pH = 11.9 /datum/reagent/cryptobiolin/on_mob_life(mob/living/carbon/M) M.Dizzy(1) @@ -1514,8 +1515,8 @@ description = "An aromatic ring of carbon with a hydroxyl group. A useful precursor to some medicines, but has no healing properties on its own." reagent_state = LIQUID color = "#C8A5DC" - taste_description = "acid" - pH = 5 + taste_description = "sweet and tarry" //Again, not a strong acid. + pH = 5.5 /datum/reagent/ash name = "Ash" @@ -1532,7 +1533,7 @@ description = "A slick, slightly carcinogenic liquid. Has a multitude of mundane uses in everyday life." reagent_state = LIQUID color = "#C8A5DC" - taste_description = "acid" + taste_description = "solvent"//It's neutral though..? /datum/reagent/colorful_reagent name = "Colorful Reagent" @@ -1630,7 +1631,8 @@ description = "Also known as sodium hydroxide. As a profession making this is somewhat underwhelming." reagent_state = LIQUID color = "#FFFFD6" // very very light yellow - taste_description = "acid" + taste_description = "alkali" //who put ACID for NaOH ???? + pH = 13 /datum/reagent/drying_agent name = "Drying agent" diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 412b97d503..b952c19d66 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -54,6 +54,36 @@ var/crit_stabilizing_reagent = "epinephrine" + //health + var/health = 500 + var/damage = 0 + +//TODO: lung health affects lung function +/obj/item/organ/tongue/proc/adjustLungLoss(mob/living/carbon/M, damage_mod) + if (maxHealth == "plasma") + return + if(damage+damage_mod < 0) + damage = 0 + return + + damage += damage_mod + if ((damage / maxHealth) > 1) + to_chat(M, "You feel your lungs collapse within your chest as you gasp for air, unable to inflate them anymore!") + M.emote("cough") + qdel(src) + else if ((damage / maxHealth) > 0.75) + to_chat(M, "It's getting really hard to breathe!!") + M.emote("gasp") + H.Dizzy(3) + else if ((damage / maxHealth) > 0.5) + H.Dizzy(2) + to_chat(M, "Your chest is really starting to hurt.") + M.emote("cough") + H.Dizzy(1) + else if ((damage / maxHealth) > 0.2) + to_chat(M, "You feel an ache within your chest.") + M.emote("cough") + /obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) if((H.status_flags & GODMODE)) @@ -126,7 +156,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5) + H.adjustOxyLoss(-5*((damage/health)/2)) //More damaged lungs = slower oxy rate up to a factor of half gas_breathed = breath_gases[/datum/gas/oxygen][MOLES] H.clear_alert("not_enough_oxy") @@ -155,7 +185,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5) + H.adjustOxyLoss(-5*((damage/health)/2)) gas_breathed = breath_gases[/datum/gas/nitrogen][MOLES] H.clear_alert("nitro") @@ -192,7 +222,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5) + H.adjustOxyLoss(-5*((damage/health)/2)) gas_breathed = breath_gases[/datum/gas/carbon_dioxide][MOLES] H.clear_alert("not_enough_co2") @@ -222,7 +252,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5) + H.adjustOxyLoss(-5*((damage/health)/2)) gas_breathed = breath_gases[/datum/gas/plasma][MOLES] H.clear_alert("not_enough_tox") @@ -372,9 +402,12 @@ var/cold_modifier = H.dna.species.coldmod if(breath_temperature < cold_level_3_threshold) H.apply_damage_type(cold_level_3_damage*cold_modifier, cold_damage_type) + adjustLungLoss(cold_level_3_damage*cold_modifier) if(breath_temperature > cold_level_3_threshold && breath_temperature < cold_level_2_threshold) H.apply_damage_type(cold_level_2_damage*cold_modifier, cold_damage_type) + adjustLungLoss(cold_level_2_damage*cold_modifier) if(breath_temperature > cold_level_2_threshold && breath_temperature < cold_level_1_threshold) + adjustLungLoss(cold_level_1_damage*cold_modifier) H.apply_damage_type(cold_level_1_damage*cold_modifier, cold_damage_type) if(breath_temperature < cold_level_1_threshold) if(prob(20)) @@ -384,10 +417,13 @@ var/heat_modifier = H.dna.species.heatmod if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold) H.apply_damage_type(heat_level_1_damage*heat_modifier, heat_damage_type) + adjustLungLoss(cold_level_1_damage*heat_modifier) if(breath_temperature > heat_level_2_threshold && breath_temperature < heat_level_3_threshold) H.apply_damage_type(heat_level_2_damage*heat_modifier, heat_damage_type) + adjustLungLoss(cold_level_1_damage*heat_modifier) if(breath_temperature > heat_level_3_threshold) H.apply_damage_type(heat_level_3_damage*heat_modifier, heat_damage_type) + adjustLungLoss(cold_level_1_damage*heat_modifier) if(breath_temperature > heat_level_1_threshold) if(prob(20)) to_chat(H, "You feel [hot_message] in your [name]!") @@ -406,12 +442,14 @@ safe_oxygen_max = 0 // Like, at all. safe_toxins_min = 16 //We breath THIS! safe_toxins_max = 0 + health = "plasma"//I don't understand how plamamen work, so I'm not going to try t give them special lungs atm /obj/item/organ/lungs/cybernetic name = "cybernetic lungs" desc = "A cybernetic version of the lungs found in traditional humanoid entities. It functions the same as an organic lung and is merely meant as a replacement." icon_state = "lungs-c" synthetic = TRUE + health = 600 /obj/item/organ/lungs/cybernetic/emp_act() . = ..() @@ -431,6 +469,7 @@ cold_level_1_threshold = 200 cold_level_2_threshold = 140 cold_level_3_threshold = 100 + health = 750 /obj/item/organ/lungs/ashwalker name = "ash lungs" diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 86916217be..5dadd2a729 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -41,6 +41,9 @@ M.apply_damage(damage_mod, BURN, target) to_chat(M, "The drink burns your skull! Oof, your bones!") return + if(damage+damage_mod < 0) + damage = 0 + return damage += damage_mod if ((damage / maxHealth) > 1) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index fcfda529d8..52b086b9c3 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -22,7 +22,8 @@ //holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism //return ..() -/datum/reagent/fermi/proc/fermiCreate(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? +//Called when reaction stops. +/datum/reagent/fermi/proc/fermiFinish(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? return //This should process fermichems to find out how pure they are and what effect to do. @@ -584,7 +585,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse /datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M) - ..() + . = ..() var/mob/living/carbon/human/H = M var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") if(!B) @@ -1042,7 +1043,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y message_admins("name: [creatorName], ID: [creatorID], gender: [creatorGender], creator:[creator]") /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) - ..() + . = ..() if(!creatorID) CRASH("Something went wrong in enthral creation") else if(M.key == creatorID && creatorName == M.real_name) //same name AND same player - same instance of the player. (should work for clones?) @@ -1114,7 +1115,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/hatmium/on_mob_add(mob/living/carbon/human/M) - //var/mob/living/carbon/human/o = M + . = ..() var/items = M.get_contents() for(var/obj/item/W in items) if(W == M.head) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/FermiCalc.Py b/modular_citadel/code/modules/reagents/chemistry/recipes/FermiCalc.Py new file mode 100644 index 0000000000..d78b49ff30 --- /dev/null +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/FermiCalc.Py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri May 17 05:12:17 2019 + +@author: Fermi +""" + diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 425d54becf..bd17353382 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -1,6 +1,14 @@ //TO TWEAK: -/datum/chemical_reaction/eigenstate +//Called for every reaction step +/datum/chemical_reaction/fermi/proc/FermiCreate(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? + return + +//Called for every reaction step +/datum/chemical_reaction/fermi/proc/FermiExplode(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? + return + +/datum/chemical_reaction/fermi/eigenstate name = "Eigenstasium" id = "eigenstate" results = list("eigenstate" = 1) @@ -22,7 +30,7 @@ FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way -/datum/chemical_reaction/eigenstate/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/eigenstate/FermiCreate(datum/reagents/holder) var/location = get_turf(holder.my_atom) var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in holder.reagent_list E.location_created = location From cabf4901348f7eec6d721589c82b5079181b3d71 Mon Sep 17 00:00:00 2001 From: Fermi Date: Fri, 17 May 2019 16:57:42 +0100 Subject: [PATCH 119/608] Fixed compiling errors for Neko. --- code/modules/reagents/chemistry/holder.dm | 27 +++++++++++-------- code/modules/surgery/organs/lungs.dm | 25 +++++++++-------- .../chemistry/reagents/fermi_reagents.dm | 10 ++++--- .../reagents/chemistry/recipes/fermi.dm | 2 +- 4 files changed, 36 insertions(+), 28 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 85f1f0ad69..2b3e7e5389 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -543,6 +543,7 @@ im /datum/reagents/process() var/datum/chemical_reaction/C = fermiReactID + var/list/cached_required_reagents = C.required_reagents//update reagents list var/list/cached_results = C.results//resultant chemical list var/multiplier = INFINITY @@ -559,7 +560,8 @@ im targetVol = 0 handle_reactions() update_total() - C.fermiFinish(src, multiplier) + var/datum/reagent/fermi/Ferm = fermiReactID + Ferm.FermiFinish(src, multiplier) //C.on_reaction(src, multiplier, special_react_result) return for(var/P in cached_results) @@ -582,7 +584,8 @@ im targetVol = 0 handle_reactions() update_total() - C.fermiFinish(src, multiplier) + var/datum/reagent/fermi/Ferm = fermiReactID + Ferm.FermiFinish(src, multiplier) //C.on_reaction(src, multiplier, special_react_result) return else @@ -593,14 +596,15 @@ im targetVol = 0 handle_reactions() update_total() - C.fermiFinish(src, multiplier) + var/datum/reagent/fermi/Ferm = fermiReactID + Ferm.FermiFinish(src, multiplier) //C.on_reaction(src, multiplier, special_react_result) return //handle_reactions() /datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results) - var/datum/chemical_reaction/C = selected_reaction + var/datum/chemical_reaction/fermi/C = selected_reaction var/deltaT = 0 var/deltapH = 0 var/stepChemAmmount = 0 @@ -619,8 +623,8 @@ im C.FermiExplode(src, (reactedVol+targetVol), chem_temp, pH) if (pH > 14) - pH = 14 - else (pH < 0 || ) + pH = 14 + else if (pH < 0) pH = 0 //Create chemical sludge eventually(for now just destroy the beaker I guess?) //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) @@ -636,7 +640,7 @@ im deltapH = 0 return//If outside pH range, no reaction else - deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/((C.ReactpHLim**C.CurveSharppH)) + deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/((C.ReactpHLim**C.CurveSharppH))) //Upper range else if (pH > C.OptimalpHMin) if (pH > (C.OptimalpHMin + C.ReactpHLim)) @@ -817,11 +821,12 @@ im return FALSE if (D.id == "water") //Do like an otter, add acid to water. - (if pH <= 2) + if (pH <= 2) var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new - s.set_up(reagents, totalVol, pH*10, src) + s.set_up(, total_volume, pH*10, src) s.start() remove_any(amount/10) + return if(!pH) @@ -885,8 +890,8 @@ im R.data = data R.on_new(data) if(istype(D, /datum/reagent/fermi))//Is this a fermichem? - var/datum/reagent/fermi/FermiTime = D //It's Fermi time! - FermiTime.fermiCreate(R.holder) //Seriously what is "data" ???? + var/datum/reagent/fermi/Ferm = D.id //It's Fermi time! + Ferm.FermiNew(R.holder) //Seriously what is "data" ???? //This is how I keep myself sane. diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index b952c19d66..9ce2d3169d 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -55,11 +55,11 @@ var/crit_stabilizing_reagent = "epinephrine" //health - var/health = 500 + var/maxHealth = 500 var/damage = 0 //TODO: lung health affects lung function -/obj/item/organ/tongue/proc/adjustLungLoss(mob/living/carbon/M, damage_mod) +/obj/item/organ/lungs/proc/adjustLungLoss(mob/living/carbon/human/M, damage_mod) if (maxHealth == "plasma") return if(damage+damage_mod < 0) @@ -74,16 +74,15 @@ else if ((damage / maxHealth) > 0.75) to_chat(M, "It's getting really hard to breathe!!") M.emote("gasp") - H.Dizzy(3) + M.Dizzy(3) else if ((damage / maxHealth) > 0.5) - H.Dizzy(2) + M.Dizzy(2) to_chat(M, "Your chest is really starting to hurt.") M.emote("cough") - H.Dizzy(1) else if ((damage / maxHealth) > 0.2) to_chat(M, "You feel an ache within your chest.") M.emote("cough") - + M.Dizzy(1) /obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) if((H.status_flags & GODMODE)) @@ -156,7 +155,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5*((damage/health)/2)) //More damaged lungs = slower oxy rate up to a factor of half + H.adjustOxyLoss(-5*((damage/maxHealth)/2)) //More damaged lungs = slower oxy rate up to a factor of half gas_breathed = breath_gases[/datum/gas/oxygen][MOLES] H.clear_alert("not_enough_oxy") @@ -185,7 +184,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5*((damage/health)/2)) + H.adjustOxyLoss(-5*((damage/maxHealth)/2)) gas_breathed = breath_gases[/datum/gas/nitrogen][MOLES] H.clear_alert("nitro") @@ -222,7 +221,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5*((damage/health)/2)) + H.adjustOxyLoss(-5*((damage/maxHealth)/2)) gas_breathed = breath_gases[/datum/gas/carbon_dioxide][MOLES] H.clear_alert("not_enough_co2") @@ -252,7 +251,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5*((damage/health)/2)) + H.adjustOxyLoss(-5*((damage/maxHealth)/2)) gas_breathed = breath_gases[/datum/gas/plasma][MOLES] H.clear_alert("not_enough_tox") @@ -442,14 +441,14 @@ safe_oxygen_max = 0 // Like, at all. safe_toxins_min = 16 //We breath THIS! safe_toxins_max = 0 - health = "plasma"//I don't understand how plamamen work, so I'm not going to try t give them special lungs atm + maxHealth = "plasma"//I don't understand how plamamen work, so I'm not going to try t give them special lungs atm /obj/item/organ/lungs/cybernetic name = "cybernetic lungs" desc = "A cybernetic version of the lungs found in traditional humanoid entities. It functions the same as an organic lung and is merely meant as a replacement." icon_state = "lungs-c" synthetic = TRUE - health = 600 + maxHealth = 600 /obj/item/organ/lungs/cybernetic/emp_act() . = ..() @@ -469,7 +468,7 @@ cold_level_1_threshold = 200 cold_level_2_threshold = 140 cold_level_3_threshold = 100 - health = 750 + maxHealth = 750 /obj/item/organ/lungs/ashwalker name = "ash lungs" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 52b086b9c3..7cd851811b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -23,7 +23,11 @@ //return ..() //Called when reaction stops. -/datum/reagent/fermi/proc/fermiFinish(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? +/datum/reagent/fermi/proc/FermiFinish(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? + return + +//Called when added to a beaker without the reagent added. +/datum/reagent/fermi/proc/FermiNew(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? return //This should process fermichems to find out how pure they are and what effect to do. @@ -579,7 +583,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING color = "#E60584" // rgb: 96, 0, 255 taste_description = "a milky ice cream like flavour." overdose_threshold = 12 - metabolization_rate = 0.5qa + metabolization_rate = 0.5 ImpureChem = "BEsmaller" //If you make an inpure chem, it stalls growth InverseChemVal = 0.25 InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse @@ -1028,7 +1032,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y var/creatorName var/mob/living/creator -/datum/reagent/fermi/enthrall/fermiCreate() +/datum/reagent/fermi/enthrall/FermiFinish() message_admins("On new for enthral proc'd") var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list //var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index bd17353382..eaac0d6c33 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -30,7 +30,7 @@ FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way -/datum/chemical_reaction/eigenstate/FermiCreate(datum/reagents/holder) +/datum/chemical_reaction/fermi/eigenstate/FermiCreate(datum/reagents/holder) var/location = get_turf(holder.my_atom) var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in holder.reagent_list E.location_created = location From 2f75f861ce0d0a24c7a490ecdf75da9690c9dbba Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 18 May 2019 01:19:04 +0100 Subject: [PATCH 120/608] Explode proc set up --- code/modules/reagents/chemistry/holder.dm | 9 +- code/modules/reagents/chemistry/recipes.dm | 5 +- code/modules/surgery/organs/lungs.dm | 8 +- .../chemistry/reagents/fermi_reagents.dm | 141 +++++++++++++----- .../reagents/chemistry/recipes/fermi.dm | 39 ++++- 5 files changed, 155 insertions(+), 47 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 2b3e7e5389..6a946a5f54 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -547,7 +547,7 @@ im var/list/cached_required_reagents = C.required_reagents//update reagents list var/list/cached_results = C.results//resultant chemical list var/multiplier = INFINITY - var/special_react_result = C.check_special_react(src) + //var/special_react_result = C.check_special_react(src) Only add if I add in the fermi-izer chem message_admins("updating targetVol from [targetVol]") for(var/B in cached_required_reagents) // @@ -620,16 +620,19 @@ im if (chem_temp > C.ExplodeTemp) //go to explode proc message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") - C.FermiExplode(src, (reactedVol+targetVol), chem_temp, pH) + C.FermiExplode(src, my_atom, (reactedVol+targetVol), chem_temp, pH) if (pH > 14) pH = 14 + message_admins("pH is lover limit, cur pH: [pH]") else if (pH < 0) pH = 0 //Create chemical sludge eventually(for now just destroy the beaker I guess?) //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) message_admins("pH is lover limit, cur pH: [pH]") + if ((purity < C.PurityMin) && (!C.PurityMin == 0))//If purity is below the min, blow it up. + C.FermiExplode(src, (reactedVol+targetVol), chem_temp, pH, C) //For now, purity is handled elsewhere @@ -823,7 +826,7 @@ im if (D.id == "water") //Do like an otter, add acid to water. if (pH <= 2) var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new - s.set_up(, total_volume, pH*10, src) + s.set_up("fermiAcid", total_volume, pH*10, src) s.start() remove_any(amount/10) return diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 59f4b4576c..c0af043757 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -18,7 +18,6 @@ var/mix_sound = 'sound/effects/bubbles.ogg' //The sound played upon mixing, if applicable //FermiChem! - var/OptimalTempMin = 200 // Lower area of bell curve for determining heat based rate reactions var/OptimalTempMax = 800 var/ExplodeTemp = 900 //If any reaction is this hot, it explodes! @@ -34,9 +33,7 @@ var/RateUpLim = 10 var/FermiChem = FALSE //If the chemical uses the Fermichem reaction mechanics var/FermiExplode = FALSE //If the chemical explodes in a special way as a result of - var/ImpureChem = "toxin" //What chemical is produced with an inpure reaction - var/InverseChemVal = 0.3 - var/InverseChem = "toxin" + var/PurityMin = 0.15 //If purity is below 0.15, it explodes too. Set to 0 to disable this. /datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, specialreact) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 9ce2d3169d..c402ad5f09 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -1,3 +1,5 @@ +#define LUNGS_MAX_HEALTH 500 + /obj/item/organ/lungs name = "lungs" icon_state = "lungs" @@ -55,11 +57,11 @@ var/crit_stabilizing_reagent = "epinephrine" //health - var/maxHealth = 500 + var/maxHealth = LUNGS_MAX_HEALTH var/damage = 0 //TODO: lung health affects lung function -/obj/item/organ/lungs/proc/adjustLungLoss(mob/living/carbon/human/M, damage_mod) +/obj/item/organ/lungs/proc/adjustLungLoss(mob/living/carbon/M, damage_mod) if (maxHealth == "plasma") return if(damage+damage_mod < 0) @@ -69,7 +71,7 @@ damage += damage_mod if ((damage / maxHealth) > 1) to_chat(M, "You feel your lungs collapse within your chest as you gasp for air, unable to inflate them anymore!") - M.emote("cough") + M.emote("gasp") qdel(src) else if ((damage / maxHealth) > 0.75) to_chat(M, "It's getting really hard to breathe!!") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 7cd851811b..d03b07b8e1 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -16,41 +16,45 @@ var/ImpureChem = "toxin" // What chemical is metabolised with an inpure reaction var/InverseChemVal = 0 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising var/InverseChem = "Initropidril" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. + var/DoNotSplit = FALSE // If impurity is handled within the main chem itself ///datum/reagent/fermi/on_mob_life(mob/living/carbon/M) //current_cycle++ //holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism //return ..() -//Called when reaction stops. +//Called when reaction stops. #STOP_PROCESSING /datum/reagent/fermi/proc/FermiFinish(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? return -//Called when added to a beaker without the reagent added. +//Called when added to a beaker without any of the reagent present. #add_reagent /datum/reagent/fermi/proc/FermiNew(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? return //This should process fermichems to find out how pure they are and what effect to do. //TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE /datum/reagent/fermi/on_mob_add(mob/living/carbon/M) + message_admins("purity of chem is [src.purity]") if(src.purity < 0) CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") - if (src.purity == 1) + if (src.purity == 1 || src.DoNotSplit == TRUE) return else if (src.InverseChemVal > src.purity) - holder.remove_reagent(src.id, volume, FALSE) - holder.add_reagent(src.InverseChem, volume, FALSE) + M.reagents.remove_reagent(src.id, volume, FALSE) + M.reagents.add_reagent(src.InverseChem, volume, FALSE) + message_admins("all convered to []") return else var/pureVol = volume * purity var/impureVol = volume * (1 - pureVol) - holder.remove_reagent(src.id, (volume*impureVol), FALSE) - holder.add_reagent(src.ImpureChem, impureVol, FALSE) + M.reagents.remove_reagent(src.id, (volume*impureVol), FALSE) + M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE) return + ///datum/reagent/fermi/overdose_start(mob/living/carbon/M) //current_cycle++ @@ -1023,16 +1027,15 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." color = "#2C051A" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" - //metabolization_rate = 0.5 overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. - //addiction_threshold = 30 - //addiction_stage1_end = 9999//Should never end. + DoNotSplit = TRUE var/creatorID //ckey var/creatorGender var/creatorName var/mob/living/creator -/datum/reagent/fermi/enthrall/FermiFinish() + +/datum/reagent/fermi/enthrall/FermiNew() message_admins("On new for enthral proc'd") var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list //var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list @@ -1050,6 +1053,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y . = ..() if(!creatorID) CRASH("Something went wrong in enthral creation") + if(purity < 0.5)//Impure chems don't function as you expect + return else if(M.key == creatorID && creatorName == M.real_name) //same name AND same player - same instance of the player. (should work for clones?) var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet @@ -1067,12 +1072,26 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) + if(purity < 0.5)//Placeholder for now. I'd like to get this done. + if (M.key == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. + var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers + if(!seen) + return + M.reagents.remove_reagent(src.id, src.volume) + FallInLove(M, seen) + return + else // If someone else drinks it, the creator falls in love with them! + var/mob/living/carbon/C = get_mob_by_key(creatorID) + if(C in viewers(7, get_turf(M))) + M.reagents.remove_reagent(src.id, src.volume) + FallInLove(C, M) + return var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) E.enthrallTally += 1 M.adjustBrainLoss(0.1) ..() -/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M) +/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I have no idea what happens if you OD yourself honestly. . = ..() M.add_trait(TRAIT_PACIFISM, "MKUltra") var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) @@ -1092,6 +1111,18 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y M.adjustBrainLoss(0.2) ..() +/datum/reagent/fermi/enthrall/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love) + if(Lover.has_status_effect(STATUS_EFFECT_INLOVE)) + to_chat(Lover, "You are already fully devoted to your love!") + return + to_chat(Lover, "You develop feelings for [Love], and anyone they like.") + if(Lover.mind) + Lover.mind.store_memory("You are in love with [Love].") + Lover.faction |= "[REF(Love)]" + Lover.apply_status_effect(STATUS_EFFECT_INLOVE, Love) + forge_valentines_objective(Lover, Love) + return + //Requires player to be within vicinity of creator //bonuses to mood //gives creator a silver(velvet?) tongue @@ -1116,6 +1147,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y taste_description = "like jerky, whiskey and an off aftertaste of a crypt" overdose_threshold = 100 var/obj/item/clothing/head/hattip/hat + DoNotSplit = TRUE /datum/reagent/fermi/hatmium/on_mob_add(mob/living/carbon/human/M) @@ -1130,13 +1162,11 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/hatmium/on_mob_life(mob/living/carbon/human/M) //hat.armor = list("melee" = (1+(current_cycle/20)), "bullet" = (1+(current_cycle/20)), "laser" = (1+(current_cycle/20)), "energy" = (1+(current_cycle/20)), "bomb" = (1+(current_cycle/20)), "bio" = (1+(current_cycle/20)), "rad" = (1+(current_cycle/20)), "fire" = (1+(current_cycle/20)), "acid" = (1+(current_cycle/20))) - var/hatArmor = (1+(current_cycle/10)) + var/hatArmor = (1+(current_cycle/10))*purity if(!overdosed) - for (var/i in hat.armor) - hat.armor = list("melee" = hatArmor, "bullet" = hatArmor, "laser" = hatArmor, "energy" = hatArmor, "bomb" = hatArmor, "bio" = hatArmor, "rad" = hatArmor, "fire" = hatArmor) + hat.armor = list("melee" = hatArmor, "bullet" = hatArmor, "laser" = hatArmor, "energy" = hatArmor, "bomb" = hatArmor, "bio" = hatArmor, "rad" = hatArmor, "fire" = hatArmor) else - for (var/i in hat.armor) - hat.armor = list("melee" = -hatArmor, "bullet" = -hatArmor, "laser" = -hatArmor, "energy" = -hatArmor, "bomb" = -hatArmor, "bio" = -hatArmor, "rad" = -hatArmor, "fire" = -hatArmor) + hat.armor = list("melee" = -hatArmor, "bullet" = -hatArmor, "laser" = -hatArmor, "energy" = -hatArmor, "bomb" = -hatArmor, "bio" = -hatArmor, "rad" = -hatArmor, "fire" = -hatArmor) ..() //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1154,6 +1184,9 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y description = "OwO whats this?" color = "#H04044" // rgb: , 0, 255 taste_description = "dewicious degenyewacy" + InverseChemVal = 0 + var/obj/item/organ/tongue/nT + DoNotSplit = TRUE /datum/reagent/fermi/furranium/on_mob_life(mob/living/carbon/M) @@ -1188,38 +1221,78 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers //for(var/victim in seen) - to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") + if(seen) + to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") + nT.maxHealth += purity //I like to have some reason for purity..! ..() /////////////////////////////////////////////////////////////////////////////////////////////// -/* Needs to be fixed, I cannot get it to work and it's giving me compile errors aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +//Needs to be fixed, I cannot get it to work and it's giving me compile errors aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa //Nanite removal //Writen by Trilby!! +//Status: Done - needs bug test /datum/reagent/fermi/naninte_b_gone name = "Naninte bain" id = "naninte_b_gone" description = "A rather simple toxin to small nano machines that will kill them off at a rapid rate well in system." color = "#5a7267" // rgb: 90, 114, 103 - overdose_threshold = 25 - v/component/nanites/nan + overdose_threshold = 15 + ImpureChem = "naninte_b_goneTox" //If you make an inpure chem, it stalls growth + InverseChemVal = 0.25 + InverseChem = "naninte_b_goneTox" //At really impure vols, it just becomes 100% inverse /datum/reagent/fermi/naninte_b_gone/on_mob_life(mob/living/carbon/C) - var/component/nanites/nane = C.GetComponent(/component/nanites) - if(isnull(nane)) + //var/component/nanites/N = M.GetComponent(/datum/component/nanites) + GET_COMPONENT_FROM(N, /datum/component/nanites, C) + if(isnull(N)) return - nane.regen_rate = -5.0//This seems really high + N.regen_rate = -0.25//This seems really high + ..() /datum/reagent/fermi/naninte_b_gone/overdose_start(mob/living/carbon/C) - var/component/nanites/nane = C.GetComponent(/component/nanites) - if(isnull(nane)) + //var/component/nanites/N = M.GetComponent(/datum/component/nanites) + GET_COMPONENT_FROM(N, /datum/component/nanites, C) + if(isnull(N)) return - nane.regen_rate = -7.5//12.5 seems crazy high? -*/ + N.regen_rate = -1//12.5 seems crazy high? + if(prob(20)) + to_chat(C, "The residual voltage from the nanites causes you to seize up!") + C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) + if(prob(10)) + empulse((get_turf(C)), 3, 2)//So the nanites randomize + to_chat(C, "The nanintes short circuit within your system!") + ..() -/* - _________________________________________ -||Fermichem toxic / impure chems here. || -|| || -||_______________________________________|| -*/ +//Unobtainable, used if SDGF is impure but not too impure +/datum/reagent/fermi/naninte_b_goneTox + name = "Naninte bain" + id = "naninte_b_goneTox" + description = "Poorly made, and shocks you!" + metabolization_rate = 1 + +//Increases shock events. +/datum/reagent/fermi/naninte_b_goneTox/on_mob_life(mob/living/carbon/C)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good) + if(prob(20)) + to_chat(C, "The residual voltage in your system causes you to seize up!") + C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE) + if(prob(10)) + empulse((get_turf(C)), 2, 1, 1)//So the nanites randomize + to_chat(C, "You feel your hair stand on end as you glow brightly for a moment!") + ..() + + +/////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/reagent/fermi/fermiAcid + name = "Acid vapour" + id = "fermiAcid" + description = "Someone didn't do like an otter, and add acid to water." + +/datum/reagent/fermi/fermiAcid/on_mob_life(mob/living/carbon/C) + var/target = C.get_bodypart(BODY_ZONE_CHEST) + if(prob(20)) + to_chat(C, "You can feel your lungs burning!") + C.apply_damage(2, BURN, target) + var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) + L.adjustLungLoss(2) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index eaac0d6c33..6758c7311a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -4,8 +4,41 @@ /datum/chemical_reaction/fermi/proc/FermiCreate(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? return -//Called for every reaction step -/datum/chemical_reaction/fermi/proc/FermiExplode(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? +//Called when temperature is above a certain threshold +//....Is this too much? +/datum/chemical_reaction/fermi/proc/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? + var/Svol = volume + var/turf/T = get_turf(holder.my_atom) + if(temp>600)//if hot, start a fire + switch(temp) + if (601 to 800) + for(var/turf/turf in range(1,T)) + new /obj/effect/hotspot(turf) + volume /= 3 + if (801 to 1100) + for(var/turf/turf in range(2,T)) + new /obj/effect/hotspot(turf) + volume /= 4 + if (1101 to INFINITY) + for(var/turf/turf in range(3,T)) + new /obj/effect/hotspot(turf) + volume /= 5 + + var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new + if(pH < 2.5) + s.set_up("fermiAcid", (volume/3), pH*10, T) + volume /=3 + for (var/reagent in holder.reagent_list) + var/datum/reagent/R = reagent + s.set_up(R.id, R.volume/3, pH*10, T) + //R.on_reaction(T, volume/10) //Uneeded, I think (hope) + s.start() + + if (pH > 12) + var/datum/effect_system/reagents_explosion/e = new() + e.set_up(round(volume/Svol, 1), T, 0, 0) + e.start() + message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], containing [holder.reagent_list]") return /datum/chemical_reaction/fermi/eigenstate @@ -30,6 +63,7 @@ FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way + /datum/chemical_reaction/fermi/eigenstate/FermiCreate(datum/reagents/holder) var/location = get_turf(holder.my_atom) var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in holder.reagent_list @@ -99,7 +133,6 @@ RateUpLim = 5 FermiChem = TRUE FermiExplode = FALSE - ImpureChem = "carpotoxin" /datum/chemical_reaction/enthral name = "need a name" From 0700e0c0804503808c6097d5b7b5dffe2146a8e1 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 18 May 2019 03:02:14 +0100 Subject: [PATCH 121/608] Near completion - missing Neko's pH paper and reaction vars. --- code/modules/reagents/chemistry/recipes.dm | 31 ++- .../code/datums/mood_events/chem_events.dm | 8 + .../chemistry/reagents/fermi_reagents.dm | 47 +++- .../reagents/chemistry/recipes/FermiCalc.Py | 4 + .../reagents/chemistry/recipes/fermi.dm | 255 ++++++++++++++---- 5 files changed, 267 insertions(+), 78 deletions(-) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index c0af043757..32155c9b89 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -18,22 +18,21 @@ var/mix_sound = 'sound/effects/bubbles.ogg' //The sound played upon mixing, if applicable //FermiChem! - var/OptimalTempMin = 200 // Lower area of bell curve for determining heat based rate reactions - var/OptimalTempMax = 800 - var/ExplodeTemp = 900 //If any reaction is this hot, it explodes! - var/OptimalpHMin = 5 - var/OptimalpHMax = 10 - var/ReactpHLim = 3 - //var/CatalystFact = C.CatalystFact - var/CatalystFact = 0 - var/CurveSharpT = 2 - var/CurveSharppH = 2 - var/ThermicConstant = 1 - var/HIonRelease = 0.1 - var/RateUpLim = 10 - var/FermiChem = FALSE //If the chemical uses the Fermichem reaction mechanics - var/FermiExplode = FALSE //If the chemical explodes in a special way as a result of - var/PurityMin = 0.15 //If purity is below 0.15, it explodes too. Set to 0 to disable this. + var/OptimalTempMin = 200 // Lower area of bell curve for determining heat based rate reactions + var/OptimalTempMax = 800 // Upper end for above + var/ExplodeTemp = 900 // Temperature at which reaction explodes - If any reaction is this hot, it explodes! + var/OptimalpHMin = 5 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + var/OptimalpHMax = 10 // Higest value for above + var/ReactpHLim = 3 // How far out pH wil react, giving impurity place (Exponential phase) + var/CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst)//Not implemented yet + var/CurveSharpT = 2 // How sharp the temperature exponential curve is (to the power of value) + var/CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) + var/ThermicConstant = 1 // Temperature change per 1u produced + var/HIonRelease = 0.1 // pH change per 1u reaction + var/RateUpLim = 10 // Optimal/max rate possible if all conditions are perfect + var/FermiChem = FALSE // If the chemical uses the Fermichem reaction mechanics//If the chemical uses the Fermichem reaction mechanics + var/FermiExplode = FALSE // If the chemical explodes in a special way + var/PurityMin = 0.15 //If purity is below 0.15, it explodes too. Set to 0 to disable this. /datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, specialreact) diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index e0e4622495..79d8c115d5 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -31,3 +31,11 @@ /datum/mood_event/enthrallmissing4 mood_change = -25 description = "I'm all alone, It's so hard to continute without Master...\n" + +/datum/mood_event/InLove + mood_change = 10 + description = "I'm in love!!\n" + +/datum/mood_event/MissingLove + mood_change = -10 + description = "I can't keep my crush off my mind, I need to see them again!\n" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index d03b07b8e1..bf0aace161 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -582,7 +582,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //TODO - fail reaction explosion makes breasts and baps you with them. /datum/reagent/fermi/BElarger name = "Sucubus milk" - id = "BEenlager" + id = "BElarger" description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix." color = "#E60584" // rgb: 96, 0, 255 taste_description = "a milky ice cream like flavour." @@ -800,9 +800,9 @@ Buginess level: works as intended - except teleport makes sparks for some reason /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! M.alpha = 255//Reset addiction + antiGenetics = 255 switch(current_cycle) if(0)//Require a minimum - M.alpha = 255 origin = M if (G == null) G = new(get_turf(M.loc)) @@ -1023,7 +1023,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/enthrall name = "MKUltra" - id = "enthral" + id = "enthrall" description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." color = "#2C051A" // rgb: , 0, 255 taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" @@ -1111,11 +1111,46 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y M.adjustBrainLoss(0.2) ..() +//Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system. +/datum/reagent/fermi/enthrallExplo//Created in a gas cloud when it explodes + name = "MKUltra" + id = "enthrallExplo" + description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." + color = "#2C051A" // rgb: , 0, 255 + metabolization_rate = 0.1 + taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" + var/mob/living/carbon/love + +/datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system. + if(!M.has_status_effect(STATUS_EFFECT_INLOVE)) + var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers + if(!seen) + return + love = seen + M.apply_status_effect(STATUS_EFFECT_INLOVE, love) + to_chat(M, "You develop deep feelings for [love], your heart beginning to race as you look upon them with new eyes.") + else + if(get_dist(M, love) < 8) + //if(M.has_trait(TRAIT_NYMPHO)) //Add this back when merged/updated. + M.adjustArousalLoss(5) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") + else + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") + ..() + +/datum/reagent/fermi/enthrallExplo/on_mob_delete(mob/living/carbon/M) + M.remove_status_effect(STATUS_EFFECT_INLOVE) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") + ..() + /datum/reagent/fermi/enthrall/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love) if(Lover.has_status_effect(STATUS_EFFECT_INLOVE)) - to_chat(Lover, "You are already fully devoted to your love!") + to_chat(Lover, "You are already fully devoted to someone else!") return - to_chat(Lover, "You develop feelings for [Love], and anyone they like.") + to_chat(Lover, "You develop deep feelings for [Love], your heart beginning to race as you look upon them with new eyes.") if(Lover.mind) Lover.mind.store_memory("You are in love with [Love].") Lover.faction |= "[REF(Love)]" @@ -1282,6 +1317,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y ..() +/////////////////////////////////////////////////////////////////////////////////////////////// +// MISC FERMICHEM CHEMS FOR SPECIFIC INTERACTIONS ONLY /////////////////////////////////////////////////////////////////////////////////////////////// /datum/reagent/fermi/fermiAcid diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/FermiCalc.Py b/modular_citadel/code/modules/reagents/chemistry/recipes/FermiCalc.Py index d78b49ff30..9ffc057743 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/FermiCalc.Py +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/FermiCalc.Py @@ -5,3 +5,7 @@ Created on Fri May 17 05:12:17 2019 @author: Fermi """ +import numpy +import matplotlib as mpl +import matplotlib.pyplot as plt + diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 6758c7311a..1d7c4fbf11 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -70,7 +70,7 @@ E.location_created = location //serum -/datum/chemical_reaction/SDGF +/datum/chemical_reaction/fermi/SDGF name = "synthetic-derived growth factor" id = "SDGF" results = list("SDGF" = 3) @@ -91,74 +91,129 @@ RateUpLim = 5 // Optimal/max rate possible if all conditions are perfect FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics FermiExplode = TRUE // If the chemical explodes in a special way + PurityMin = 0.25 -/datum/chemical_reaction/BElarger - name = "" - id = "e" +/datum/chemical_reaction/fermi/SDGF/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies + var/turf/T = get_turf(holder.my_atom) + var/mob/living/simple_animal/slime/S = new(T,"grey")//should work, in theory + S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)//I dunno how slimes work cause fire is burny + S.name = "Living teratoma" + S.real_name = "Living teratoma"//horrifying!! + S.rabid = 1//Make them an angery boi, grr grr + to_chat("The cells clump up into a horrifying tumour!") + +/datum/chemical_reaction/fermi/BElarger + name = "Sucubus milk" + id = "BElarger" results = list("Eigenstasium" = 6) required_reagents = list("salglu_solution" = 1, "milk" = 5, "synthflesh" = 2, "silicon" = 2, "aphro" = 2) //FermiChem vars: - OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions - OptimalTempMax = 500 // Upper end for above - ExplodeTemp = 550 //Temperature at which reaction explodes - OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) - OptimalpHMax = 9.5 // Higest value for above - ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) - CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharpT = 4 // How sharp the exponential curve is (to the power of value) - ThermicConstant = -2.5 //Temperature change per 1u produced - HIonRelease = 0.01 //pH change per 1u reaction - RateUpLim = 50 //Optimal/max rate possible if all conditions are perfect - FermiChem = TRUE + OptimalTempMin = 200 + OptimalTempMax = 800 + ExplodeTemp = 900 + OptimalpHMin = 5 + OptimalpHMax = 10 + ReactpHLim = 3 + CatalystFact = 0 + CurveSharpT = 2 + CurveSharppH = 2 + ThermicConstant = 1 + HIonRelease = 0.1 + RateUpLim = 10 + FermiChem = FALSE + FermiExplode = TRUE + PurityMin = 0.1 -//Nano-b-gone -/datum/chemical_reaction/naninte_b_gone - name = "Naninte bain" - id = "naninte_b_gone" - results = list("naninte_b_gone" = 5) - required_reagents = list("synthflesh" = 5, "blood" = 3, "uranium" = 1, "salglu_solution" = 3) - mix_message = "the blood and sugar mixes catalysting a hard coating around the synth flesh" - //FermiChem vars: - OptimalTempMin = 450 - OptimalTempMax = 600 - ExplodeTemp = 700 - OptimalpHMin = 6 - OptimalpHMax = 8 - ReactpHLim = 1 - CatalystFact = 0 //To do 1 - CurveSharpT = 4 - CurveSharppH = 2 - ThermicConstant = -2.5 - HIonRelease = 0.01 - RateUpLim = 5 - FermiChem = TRUE - FermiExplode = FALSE +/datum/chemical_reaction/fermi/BElarger/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) + //var/obj/item/organ/genital/breasts/B = + new /obj/item/organ/genital/breasts(holder.my_atom) + var/list/seen = viewers(5, get_turf(holder.my_atom)) + for(var/mob/M in seen) + to_chat(M, "The reaction suddenly condenses, creating a pair of breasts!")//OwO + ..() -/datum/chemical_reaction/enthral - name = "need a name" - id = "enthral" - results = list("enthral" = 3) +/datum/chemical_reaction/fermi/PElarger //Vars needed + name = "Incubus draft" + id = "PElarger" + results = list("PElarger" = 3) required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) required_catalysts = list("blood" = 1) //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: - OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions - OptimalTempMax = 500 // Upper end for above - ExplodeTemp = 550 // Temperature at which reaction explodes - OptimalpHMin = 4 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) - OptimalpHMax = 9.5 // Higest value for above - ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase) - CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst) - CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) - CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) - ThermicConstant = 20 // Temperature change per 1u produced - HIonRelease = 0.01 // pH change per 1u reaction - RateUpLim = 5 // Optimal/max rate possible if all conditions are perfect - FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics - FermiExplode = FALSE // If the chemical explodes in a special way + OptimalTempMin = 200 + OptimalTempMax = 800 + ExplodeTemp = 900 + OptimalpHMin = 5 + OptimalpHMax = 10 + ReactpHLim = 3 + CatalystFact = 0 + CurveSharpT = 2 + CurveSharppH = 2 + ThermicConstant = 1 + HIonRelease = 0.1 + RateUpLim = 10 + FermiChem = FALSE + FermiExplode = TRUE + PurityMin = 0.1 + +/datum/chemical_reaction/fermi/PElarger/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) + //var/obj/item/organ/genital/penis/nP = + new /obj/item/organ/genital/penis(holder.my_atom) + var/list/seen = viewers(5, get_turf(holder.my_atom)) + for(var/mob/M in seen) + to_chat(M, "The reaction suddenly condenses, creating a penis!")//OwO + ..() + +/datum/chemical_reaction/fermi/astral //Vars needed + name = "Astrogen" + id = "astral" + results = list("astral" = 3) + required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) + required_catalysts = list("blood" = 1) + //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) + //FermiChem vars: + OptimalTempMin = 200 + OptimalTempMax = 800 + ExplodeTemp = 900 + OptimalpHMin = 5 + OptimalpHMax = 10 + ReactpHLim = 3 + CatalystFact = 0 + CurveSharpT = 2 + CurveSharppH = 2 + ThermicConstant = 1 + HIonRelease = 0.1 + RateUpLim = 10 + FermiChem = FALSE + FermiExplode = TRUE + PurityMin = 0.25 -/datum/chemical_reaction/enthral/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/fermi/enthrall //Vars needed + name = "need a name" + id = "enthrall" + results = list("enthrall" = 3) + required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) + required_catalysts = list("blood" = 1) + //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) + //FermiChem vars: + OptimalTempMin = 200 + OptimalTempMax = 800 + ExplodeTemp = 900 + OptimalpHMin = 5 + OptimalpHMax = 10 + ReactpHLim = 3 + CatalystFact = 0 + CurveSharpT = 2 + CurveSharppH = 2 + ThermicConstant = 1 + HIonRelease = 0.1 + RateUpLim = 10 + FermiChem = FALSE + FermiExplode = TRUE + PurityMin = 0.15 + +/datum/chemical_reaction/fermi/enthrall/on_reaction(datum/reagents/holder) message_admins("On reaction for enthral proc'd") var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list @@ -170,4 +225,90 @@ E.creatorID = B.["ckey"] var/mob/living/creator = holder E.creator = creator + ..() //var/enthrallID = B.get_blood_data() + +/datum/chemical_reaction/fermi/enthrall/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) + var/turf/T = get_turf(holder.my_atom) + var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new + s.set_up("enthrallExplo", volume, pH*10, T) + s.start() + ..() + +/datum/chemical_reaction/fermi/hatmium + name = "Hat growth serium" + id = "hatmium" + results = list("hatmium" = 5) + //required_reagents = list("synthflesh" = 5, "blood" = 3, "uranium" = 1, "iron" = 1, "salglu_solution" = 3) + //mix_message = "" + //FermiChem vars: + OptimalTempMin = 450 + OptimalTempMax = 600 + ExplodeTemp = 700 + OptimalpHMin = 6 + OptimalpHMax = 8 + ReactpHLim = 1 + //CatalystFact = 0 //To do 1 + CurveSharpT = 4 + CurveSharppH = 2 + ThermicConstant = -2.5 + HIonRelease = 0.01 + RateUpLim = 5 + FermiChem = TRUE + //FermiExplode = FALSE + //PurityMin = 0.15 + +/datum/chemical_reaction/fermi/hatmium/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) + var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(holder.my_atom)) + hat.animate_atom_living() + var/list/seen = viewers(5, get_turf(holder.my_atom)) + for(var/mob/M in seen) + to_chat(M, "The makes an off sounding pop, as a hat suddenly climbs out of the beaker!") + ..() + +/datum/chemical_reaction/fermi/furranium //low temp and medium pH + name = "Furranium" + id = "furranium" + results = list("furranium" = 5) + //required_reagents = list("synthflesh" = 5, "blood" = 3, "uranium" = 1, "iron" = 1, "salglu_solution" = 3) + //mix_message = "" + //FermiChem vars: + OptimalTempMin = 450 + OptimalTempMax = 600 + ExplodeTemp = 700 + OptimalpHMin = 6 + OptimalpHMax = 8 + ReactpHLim = 1 + //CatalystFact = 0 //To do 1 + CurveSharpT = 4 + CurveSharppH = 2 + ThermicConstant = -2.5 + HIonRelease = 0.01 + RateUpLim = 5 + FermiChem = TRUE + //FermiExplode = FALSE + //PurityMin = 0.15 + +//Nano-b-gone +/datum/chemical_reaction/fermi/naninte_b_gone + name = "Naninte bain" + id = "naninte_b_gone" + results = list("naninte_b_gone" = 5) + required_reagents = list("synthflesh" = 5, "blood" = 3, "uranium" = 1, "iron" = 1, "salglu_solution" = 3) + mix_message = "the blood and sugar nucleates a hard coating of synth flesh inside the beaker." + //FermiChem vars: + OptimalTempMin = 450 + OptimalTempMax = 600 + ExplodeTemp = 700 + OptimalpHMin = 6 + OptimalpHMax = 8 + ReactpHLim = 1 + //CatalystFact = 0 //To do 1 + CurveSharpT = 4 + CurveSharppH = 2 + ThermicConstant = -2.5 + HIonRelease = 0.01 + RateUpLim = 5 + FermiChem = TRUE + //FermiExplode = FALSE + //PurityMin = 0.15 From 4ef1355933ae98ebe11947ff0bd60ad5828f3885 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 18 May 2019 03:32:58 +0100 Subject: [PATCH 122/608] Made "heyo" a phase 2 --- code/modules/surgery/organs/vocal_cords.dm | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 02b76341ae..a88eb82aa4 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -805,8 +805,8 @@ var/static/regex/resist_words = regex("resist|snap out of it|fight")//useful if two enthrallers are fighting var/static/regex/forget_words = regex("forget|muddled|awake and forget") var/static/regex/attract_words = regex("come here|come to me|get over here|attract") - var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //lewd //phase 2 + var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //wah, lewd var/static/regex/awoo_words = regex("howl|awoo|bark") var/static/regex/nya_words = regex("nya|meow|mewl") var/static/regex/sleep_words = regex("sleep|slumber|rest") @@ -965,6 +965,24 @@ //teir 2 + //ORGASM + else if((findtext(message, orgasm_words))) + for(var/V in listeners) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) + if(E.phase > 1) + if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure + H.mob_climax(forced_climax=TRUE) + H.setArousalLoss(H.min_arousal) + E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). + E.enthrallTally += power_multiplier + else + E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). + E.enthrallTally += power_multiplier*1.1 + to_chat(H, "Your Masters command whites out your mind in bliss!") + E.cooldown += 6 + + //awoo else if((findtext(message, awoo_words))) for(var/V in listeners) From 0b564e7e8778908966dd563772ecfec823d9e729 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 18 May 2019 04:09:33 +0100 Subject: [PATCH 123/608] Fix --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index bf0aace161..fd78daee7c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1239,7 +1239,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers //for(var/victim in seen) - to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") + if(seen) + to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") if(21) var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/OwO @@ -1263,7 +1264,6 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /////////////////////////////////////////////////////////////////////////////////////////////// -//Needs to be fixed, I cannot get it to work and it's giving me compile errors aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa //Nanite removal //Writen by Trilby!! //Status: Done - needs bug test From 9f2b91b2e911fecafd9eded7d3284f5c6c9e4e34 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 18 May 2019 12:24:40 -0400 Subject: [PATCH 124/608] Apply suggestions from code review Co-Authored-By: deathride58 --- code/modules/cargo/bounties/engineering.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm index 70aaae5b81..08d971d2f9 100644 --- a/code/modules/cargo/bounties/engineering.dm +++ b/code/modules/cargo/bounties/engineering.dm @@ -39,7 +39,7 @@ /datum/bounty/item/engineering/microwave name = "Microwaves" - description = "Are cooks are unable to keep up with order do to a lack of microwaves, please send us some." + description = "Due to a shortage of microwaves, our chefs are incapable of keeping up with our sheer volume of orders. We need at least three microwaves to keep up with our crew's dietary habits." reward = 2000 required_count = 3 wanted_types = list(/obj/machinery/microwave) @@ -53,14 +53,14 @@ /datum/bounty/item/engineering/rcd name = "Spare RCD" - description = "Construction and repairs to are shuttles are going slowly, turns out we are sort of RCDs, can you send us a few?" + description = "Construction and repairs to are shuttles are going slowly. As it turns out, we're a little short on RCDs, can you send us a few?" reward = 2500 required_count = 3 wanted_types = list(/obj/item/construction/rcd) /datum/bounty/item/engineering/rpd name = "Spare RPD" - description = "Are atmos techs are sick and tired of running back and forth to get more pipes when making new parts or repairing shuttles. Can you send us a few?" + description = "Our Atmospheric Technicians are still living in the past, relying on stationary pipe dispensers to produce the pipes necessary to accomplish their strenuous tasks. They could use an upgrade. Could you send us some Rapid Pipe Dispensers?" reward = 3000 required_count = 3 wanted_types = list(/obj/item/pipe_dispenser) From a837eda98bf79e491378668939d2d72fe121dcd0 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 18 May 2019 22:50:20 +0100 Subject: [PATCH 125/608] More fixes. --- code/modules/reagents/chemistry/holder.dm | 12 +- .../chemistry/machinery/reagentgrinder.dm | 7 ++ .../chemistry/reagents/medicine_reagents.dm | 13 ++ .../reagents/reagent_containers/pill.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 113 ++++++++++++------ .../reagents/chemistry/recipes/fermi.dm | 78 ++++++------ 6 files changed, 146 insertions(+), 79 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6a946a5f54..241a1dcab7 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -650,7 +650,7 @@ im deltapH = 0 return //If outside pH range, no reaction else - deltapH = (((pH - (C.OptimalpHMax + C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH)) + deltapH = (((- pH + (C.OptimalpHMax + C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH))//Reverse - to + to prevent math operation failures. //Within mid range else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) deltapH = 1 @@ -870,15 +870,19 @@ im R.volume += amount //Maybe make a pH for reagents, not sure. it's hard to imagine where the H+ ions would go. I'm okay with this solution for now. //R.purity = (our_pure_moles + their_pure_moles) / (R.volume) + message_admins("Purity before addition: [R.purity], vol:[R.volume]. Adding [other_purity], vol: [amount]") R.purity = ((R.purity * R.volume) + (other_purity * amount)) /((R.volume + amount)) //This should add the purity to the product - //// + message_admins("Purity after [R.purity]") update_total() if(my_atom) my_atom.on_reagent_change(ADD_REAGENT) + //if(R.FermiChem == TRUE) + // R.on_mob_add(my_atom) R.on_merge(data, amount) if(!no_react) handle_reactions() + return TRUE @@ -893,8 +897,8 @@ im R.data = data R.on_new(data) if(istype(D, /datum/reagent/fermi))//Is this a fermichem? - var/datum/reagent/fermi/Ferm = D.id //It's Fermi time! - Ferm.FermiNew(R.holder) //Seriously what is "data" ???? + var/datum/reagent/fermi/Ferm = D //It's Fermi time! + Ferm.FermiNew(src) //Seriously what is "data" ???? //This is how I keep myself sane. diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 5c39cd9db2..63327e1d85 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -319,3 +319,10 @@ beaker.reagents.remove_reagent("sugar", amount) beaker.reagents.remove_reagent("moonshine", amount) beaker.reagents.add_reagent("moonsugar", amount*2) + /*Add later + if(beaker.reagents.has_reagent("synthflesh") && + var/amount = min(beaker.reagents.get_reagent_amount("synthflesh"), beaker.reagents.get_reagent_amount("whiskey")) + beaker.reagents.remove_reagent("sugar", amount) + beaker.reagents.remove_reagent("moonshine", amount) + beaker.reagents.add_reagent("meat", amount*2) + */ diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 66a5a629f8..13668dc1b7 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -876,6 +876,19 @@ C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) ..() +/datum/reagent/medicine/neurine + name = "Neurine" + id = "neurine" + description = "Reacts with neural tissue, helping reform damaged connections. Can cure minor traumas." + color = "#EEFF8F" + +/datum/reagent/medicine/neurine/on_mob_life(mob/living/carbon/C) + if(holder.has_reagent("neurotoxin")) + holder.remove_reagent("neurotoxin", 5) + if(prob(15)) + C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) + ..() + /datum/reagent/medicine/mutadone name = "Mutadone" id = "mutadone" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 303c3a091a..211a9f3047 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -253,4 +253,4 @@ /obj/item/reagent_containers/pill/breast_enlargement name = "breast enlargement pill" - list_reagents = list("BEenlager" = 10) + list_reagents = list("BElarger" = 10) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index fd78daee7c..cc6b4ca0b7 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -20,7 +20,7 @@ ///datum/reagent/fermi/on_mob_life(mob/living/carbon/M) //current_cycle++ - //holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism + //M.reagents.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism //return ..() //Called when reaction stops. #STOP_PROCESSING @@ -34,24 +34,41 @@ //This should process fermichems to find out how pure they are and what effect to do. //TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE /datum/reagent/fermi/on_mob_add(mob/living/carbon/M) - message_admins("purity of chem is [src.purity]") + message_admins("purity of chem is [purity]") if(src.purity < 0) CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") if (src.purity == 1 || src.DoNotSplit == TRUE) return else if (src.InverseChemVal > src.purity) M.reagents.remove_reagent(src.id, volume, FALSE) - M.reagents.add_reagent(src.InverseChem, volume, FALSE) - message_admins("all convered to []") + M.reagents.add_reagent(src.InverseChem, volume, FALSE, other_purity = 1) + message_admins("all convered to [src.InverseChem]") return else - var/pureVol = volume * purity - var/impureVol = volume * (1 - pureVol) + //var/pureVol = volume * purity + var/impureVol = volume * (1 - (volume * purity)) M.reagents.remove_reagent(src.id, (volume*impureVol), FALSE) - M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE) + M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) return + ..() - +/datum/reagent/fermi/on_merge(mob/living/carbon/M, amount, other_purity) + if(other_purity < 0) + CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") + if (other_purity == 1 || src.DoNotSplit == TRUE) + return + else if (src.InverseChemVal > other_purity) + M.reagents.remove_reagent(src.id, amount, FALSE) + M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1) + message_admins("all convered to [src.InverseChem]") + return + else + //var/pureVol = + var/impureVol = amount * (1 - (amount * other_purity)) + M.reagents.remove_reagent(src.id, impureVol, FALSE) + M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) + return + ..() @@ -138,7 +155,7 @@ do_sparks(5,FALSE,src) do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,src) - holder.remove_reagent(src.id, 0.5)//So you're not stuck for 10 minutes teleporting + M.reagents.remove_reagent(src.id, 0.5)//So you're not stuck for 10 minutes teleporting ..() //loop function //Addiction @@ -360,7 +377,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //Really hacky way to deal with this stupid problem I have SM.reagents.add_reagent("SDGFheal", volume) //holder.add_reagent("SDGFheal", volume) - holder.remove_reagent(src.id, 999) + M.reagents.remove_reagent(src.id, 999) //SMR = locate(/datum/reagents in SM) //holder.trans_to(SMR, volume) @@ -421,7 +438,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") M.apply_status_effect(/datum/status_effect/chem/SGDF) if(87 to INFINITY) - holder.remove_reagent(src.id, 1000)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. + M.reagents.remove_reagent(src.id, 1000)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. message_admins("Purging SGDF [volume]") message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") @@ -523,7 +540,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(75 to 85) M.adjustToxLoss(1, 0)// the warning! if(86) - if (!holder.has_reagent("pen_acid"))//Counterplay is pent.) + if (!M.reagents.has_reagent("pen_acid"))//Counterplay is pent.) message_admins("Zombie spawned at [M.loc]") M.nutrition = startHunger - 500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE M.next_move_modifier = 1 @@ -538,7 +555,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ZI.desc = "[M]'s clone, gone horribly wrong." ZI.zombiejob = null //ZI.updateappearance(mutcolor_update=1) - holder.remove_reagent(src.id, 20) + M.reagents.remove_reagent(src.id, 20) else//easier to deal with to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour!") M.nutrition = startHunger - 500 @@ -548,7 +565,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING S.real_name = "Living teratoma"//horrifying!! S.rabid = 1//Make them an angery boi //S.updateappearance(mutcolor_update=1) - holder.remove_reagent(src.id, 20) + M.reagents.remove_reagent(src.id, 20) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. TODO: turn tumour slime into real variant. M.adjustToxLoss(1, 0) @@ -621,7 +638,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING nB.cached_size = 0 nB.prev_size = 0 to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.") - holder.remove_reagent(src.id, 5) + M.reagents.remove_reagent(src.id, 5) B = nB //If they have them, increase size. If size is comically big, limit movement and rip clothes. //message_admins("Breast size: [B.size], [B.cached_size], [holder]") @@ -712,7 +729,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.")//OwO nP.cached_length = 0.1 nP.prev_size = 0.1 - holder.remove_reagent(src.id, 5) + M.reagents.remove_reagent(src.id, 5) P = nP P.cached_length = P.cached_length + 0.1 @@ -750,7 +767,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING T = nT ..() -/datum/reagent/fermi/PElarger // Due to cozmo's request...! +/datum/reagent/fermi/PEsmaller // Due to cozmo's request...! name = "Incubus draft" id = "PEsmaller" description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? dumb @@ -824,7 +841,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason if(prob(50)) to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") do_teleport(G, M.loc) - holder.remove_reagent(src.id, current_cycle, FALSE) + M.reagents.remove_reagent(src.id, current_cycle, FALSE) ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) @@ -1035,8 +1052,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y var/mob/living/creator -/datum/reagent/fermi/enthrall/FermiNew() - message_admins("On new for enthral proc'd") +/datum/reagent/fermi/enthrall/FermiNew(holder) + message_admins("FermiNew for enthral proc'd") var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list //var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list if (B.["gender"] == "female") @@ -1087,6 +1104,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y FallInLove(C, M) return var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + if(!E) + CRASH("No enthrall status found in [M]!") E.enthrallTally += 1 M.adjustBrainLoss(0.1) ..() @@ -1230,15 +1249,17 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(prob(20)) to_chat(M, "Your tongue feels... fluffy") if(10 to 20) - if(prob(20)) + if(prob(10)) to_chat(M, "You find yourself unable to supress the desire to meow!") M.emote("nya") - if(prob(20)) + if(prob(10)) to_chat(M, "You find yourself unable to supress the desire to howl!") M.emote("awoo") - if(prob(20)) + if(prob(10)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers - //for(var/victim in seen) + for(var/victim in seen) + if((victim != /mob/living/simple_animal/pet/) || (victim == M)) + seen = seen - victim if(seen) to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") if(21) @@ -1248,18 +1269,19 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y nT.Insert(M) qdel(T) if(22 to INFINITY) - if(prob(20)) + if(prob(10)) to_chat(M, "You find yourself unable to supress the desire to meow!") M.emote("nya") - if(prob(20)) + if(prob(10)) to_chat(M, "You find yourself unable to supress the desire to howl!") M.emote("awoo") - if(prob(20)) + if(prob(10)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers - //for(var/victim in seen) + for(var/victim in seen) + if((victim != /mob/living/simple_animal/pet/) || (victim == M)) + seen = seen - victim if(seen) to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") - nT.maxHealth += purity //I like to have some reason for purity..! ..() /////////////////////////////////////////////////////////////////////////////////////////////// @@ -1326,10 +1348,31 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y id = "fermiAcid" description = "Someone didn't do like an otter, and add acid to water." -/datum/reagent/fermi/fermiAcid/on_mob_life(mob/living/carbon/C) +/datum/reagent/fermi/fermiAcid/on_mob_life(mob/living/carbon/C, method) var/target = C.get_bodypart(BODY_ZONE_CHEST) - if(prob(20)) - to_chat(C, "You can feel your lungs burning!") - C.apply_damage(2, BURN, target) - var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) - L.adjustLungLoss(2) + C.adjustFireLoss(1, 0) + if(method==VAPOR) + if(prob(20)) + to_chat(C, "You can feel your lungs burning!") + var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) + L.adjustLungLoss(2) + C.apply_damage(1, BURN, target) + var/acidstr = (5-C.reagents.pH) + C.acid_act(acidstr, volume) + ..() + +/datum/reagent/fermi/fermiAcid/reaction_obj(obj/O, reac_volume) + if(ismob(O.loc)) //handled in human acid_act() + return + reac_volume = round(volume,0.1) + var/acidstr = (5-holder.pH) + O.acid_act(acidstr, volume) + ..() + +/datum/reagent/fermi/fermiAcid/reaction_turf(turf/T, reac_volume) + if (!istype(T)) + return + reac_volume = round(volume,0.1) + var/acidstr = (5-holder.pH) + T.acid_act(acidstr, volume) + ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 1d7c4fbf11..031f34c6bf 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -71,7 +71,7 @@ //serum /datum/chemical_reaction/fermi/SDGF - name = "synthetic-derived growth factor" + name = "Synthetic-derived growth factor" id = "SDGF" results = list("SDGF" = 3) required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) @@ -105,7 +105,7 @@ /datum/chemical_reaction/fermi/BElarger name = "Sucubus milk" id = "BElarger" - results = list("Eigenstasium" = 6) + results = list("BElarger" = 6) required_reagents = list("salglu_solution" = 1, "milk" = 5, "synthflesh" = 2, "silicon" = 2, "aphro" = 2) //FermiChem vars: OptimalTempMin = 200 @@ -120,7 +120,7 @@ ThermicConstant = 1 HIonRelease = 0.1 RateUpLim = 10 - FermiChem = FALSE + FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.1 @@ -152,7 +152,7 @@ ThermicConstant = 1 HIonRelease = 0.1 RateUpLim = 10 - FermiChem = FALSE + FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.1 @@ -168,8 +168,7 @@ name = "Astrogen" id = "astral" results = list("astral" = 3) - required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) - required_catalysts = list("blood" = 1) + required_reagents = list("eigenstasium" = 1, "plasma" = 1, "synaptizine" = 1, "aluminium" = 5) //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: OptimalTempMin = 200 @@ -184,32 +183,33 @@ ThermicConstant = 1 HIonRelease = 0.1 RateUpLim = 10 - FermiChem = FALSE + FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.25 /datum/chemical_reaction/fermi/enthrall //Vars needed - name = "need a name" + name = "MKUltra" id = "enthrall" results = list("enthrall" = 3) - required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) + required_reagents = list("iron" = 1, "iodine" = 1) + //required_reagents = list("cocoa" = 1, "astral" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1) required_catalysts = list("blood" = 1) //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: - OptimalTempMin = 200 + OptimalTempMin = 780 OptimalTempMax = 800 - ExplodeTemp = 900 - OptimalpHMin = 5 - OptimalpHMax = 10 - ReactpHLim = 3 - CatalystFact = 0 - CurveSharpT = 2 - CurveSharppH = 2 - ThermicConstant = 1 + ExplodeTemp = 820 + OptimalpHMin = 1 + OptimalpHMax = 2 + ReactpHLim = 2 + //CatalystFact = 0 + CurveSharpT = 0.5 + CurveSharppH = 4 + ThermicConstant = 20 HIonRelease = 0.1 - RateUpLim = 10 - FermiChem = FALSE + RateUpLim = 5 + FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.15 @@ -236,21 +236,21 @@ ..() /datum/chemical_reaction/fermi/hatmium - name = "Hat growth serium" + name = "Hat growth serum" id = "hatmium" results = list("hatmium" = 5) - //required_reagents = list("synthflesh" = 5, "blood" = 3, "uranium" = 1, "iron" = 1, "salglu_solution" = 3) + required_reagents = list("whiskey" = 1, "nutriment" = 3, "cooking_oil" = 2, "iron" = 1, "blackpepper" = 3) //mix_message = "" //FermiChem vars: - OptimalTempMin = 450 - OptimalTempMax = 600 - ExplodeTemp = 700 - OptimalpHMin = 6 - OptimalpHMax = 8 + OptimalTempMin = 500 + OptimalTempMax = 650 + ExplodeTemp = 750 + OptimalpHMin = 10 + OptimalpHMax = 14 ReactpHLim = 1 //CatalystFact = 0 //To do 1 CurveSharpT = 4 - CurveSharppH = 2 + CurveSharppH = 0.5 ThermicConstant = -2.5 HIonRelease = 0.01 RateUpLim = 5 @@ -270,21 +270,21 @@ name = "Furranium" id = "furranium" results = list("furranium" = 5) - //required_reagents = list("synthflesh" = 5, "blood" = 3, "uranium" = 1, "iron" = 1, "salglu_solution" = 3) + required_reagents = list("aphro" = 1, "moonsugar" = 1, "silver" = 1, "salglu_solution" = 1) //mix_message = "" //FermiChem vars: - OptimalTempMin = 450 + OptimalTempMin = 350 OptimalTempMax = 600 ExplodeTemp = 700 - OptimalpHMin = 6 - OptimalpHMax = 8 + OptimalpHMin = 8 + OptimalpHMax = 10 ReactpHLim = 1 //CatalystFact = 0 //To do 1 - CurveSharpT = 4 - CurveSharppH = 2 - ThermicConstant = -2.5 - HIonRelease = 0.01 - RateUpLim = 5 + CurveSharpT = 2 + CurveSharppH = 0.5 + ThermicConstant = -2 + HIonRelease = -0.1 + RateUpLim = 10 FermiChem = TRUE //FermiExplode = FALSE //PurityMin = 0.15 @@ -294,8 +294,8 @@ name = "Naninte bain" id = "naninte_b_gone" results = list("naninte_b_gone" = 5) - required_reagents = list("synthflesh" = 5, "blood" = 3, "uranium" = 1, "iron" = 1, "salglu_solution" = 3) - mix_message = "the blood and sugar nucleates a hard coating of synth flesh inside the beaker." + required_reagents = list("synthflesh" = 5, "uranium" = 1, "iron" = 1, "salglu_solution" = 3) + mix_message = "the reaction gurgles, encapsulating the reagents in flesh." //FermiChem vars: OptimalTempMin = 450 OptimalTempMax = 600 From 791d021d505ceb2e0ce38ae76951b56a655f97dc Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 19 May 2019 01:37:20 +0100 Subject: [PATCH 126/608] Even more fixes. --- code/modules/reagents/chemistry/holder.dm | 29 ++++++----- .../chemistry/reagents/fermi_reagents.dm | 50 ++++++++++--------- .../reagents/chemistry/recipes/fermi.dm | 7 ++- .../code/modules/reagents/objects/items.dm | 39 +++++++++++++++ 4 files changed, 85 insertions(+), 40 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 241a1dcab7..6aa7563d2d 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -190,7 +190,7 @@ im trans_data = copy_data(T) //fermichem Added ph TODO: add T.purity - R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. + R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, T.purity, pH, no_react = TRUE) //we only handle reaction after every reagent has been transfered. //R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, pH, T.purity, no_react = TRUE) //we only handle reaction after every reagent has been transfered. remove_reagent(T.id, transfer_amount) @@ -251,7 +251,7 @@ im if(current_reagent.id == reagent) if(preserve_data) trans_data = current_reagent.data - R.add_reagent(current_reagent.id, amount, trans_data, src.chem_temp, pH, no_react = TRUE) //Fermichem edit TODO: add purity + R.add_reagent(current_reagent.id, amount, trans_data, chem_temp, T.purity, pH, no_react = TRUE) //Fermichem edit TODO: add purity //R.add_reagent(current_reagent.id, amount, trans_data, src.chem_temp, pH, current_reagent.purity, no_react = TRUE) //Fermichem edit remove_reagent(current_reagent.id, amount, 1) break @@ -560,7 +560,7 @@ im targetVol = 0 handle_reactions() update_total() - var/datum/reagent/fermi/Ferm = fermiReactID + var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[fermiReactID] Ferm.FermiFinish(src, multiplier) //C.on_reaction(src, multiplier, special_react_result) return @@ -571,10 +571,11 @@ im if (fermiIsReacting == FALSE) message_admins("THIS SHOULD NEVER APPEAR!") + CRASH("Fermi has refused to stop reacting even though we asked her nicely.") if (chem_temp > C.OptimalTempMin && fermiIsReacting == TRUE)//To prevent pointless reactions if (reactedVol < targetVol) - reactedVol = FermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results) + reactedVol = FermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) message_admins("FermiChem tick activated started, Reacted vol: [reactedVol] of [targetVol]") else STOP_PROCESSING(SSprocessing, src) @@ -584,7 +585,7 @@ im targetVol = 0 handle_reactions() update_total() - var/datum/reagent/fermi/Ferm = fermiReactID + var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[fermiReactID] Ferm.FermiFinish(src, multiplier) //C.on_reaction(src, multiplier, special_react_result) return @@ -596,14 +597,14 @@ im targetVol = 0 handle_reactions() update_total() - var/datum/reagent/fermi/Ferm = fermiReactID + var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[fermiReactID] Ferm.FermiFinish(src, multiplier) //C.on_reaction(src, multiplier, special_react_result) return //handle_reactions() -/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results) +/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) var/datum/chemical_reaction/fermi/C = selected_reaction var/deltaT = 0 var/deltapH = 0 @@ -616,6 +617,8 @@ im message_admins("Loop beginning") //Begin Parse + + //Check extremes first if (chem_temp > C.ExplodeTemp) //go to explode proc @@ -652,7 +655,7 @@ im else deltapH = (((- pH + (C.OptimalpHMax + C.ReactpHLim))**C.CurveSharppH)/(C.ReactpHLim**C.CurveSharppH))//Reverse - to + to prevent math operation failures. //Within mid range - else if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) + if (pH >= C.OptimalpHMin && pH <= C.OptimalpHMax) deltapH = 1 //This should never proc: else @@ -671,12 +674,12 @@ im message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") - stepChemAmmount = targetVol * deltaT + stepChemAmmount = multiplier * deltaT if (stepChemAmmount > C.RateUpLim) stepChemAmmount = C.RateUpLim else if (stepChemAmmount <= 0.01) message_admins("stepChem underflow [stepChemAmmount]") - stepChemAmmount = 0.02 + stepChemAmmount = 0.01 if ((reactedVol + stepChemAmmount) > targetVol) stepChemAmmount = targetVol - reactedVol @@ -709,7 +712,7 @@ im message_admins("purity: [purity], purity of beaker") message_admins("Temp before change: [chem_temp], pH after change: [pH]") //Apply pH changes and thermal output of reaction to beaker - chem_temp += (C.ThermicConstant * stepChemAmmount) + chem_temp = round(chem_temp + (C.ThermicConstant * stepChemAmmount)) //Why won't you update!!! pH += (C.HIonRelease * stepChemAmmount) message_admins("Temp after change: [chem_temp], pH after change: [pH]") @@ -826,7 +829,7 @@ im if (D.id == "water") //Do like an otter, add acid to water. if (pH <= 2) var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new - s.set_up("fermiAcid", total_volume, pH*10, src) + s.set_up(/datum/reagent/fermi/fermiAcid, total_volume, pH*10, src) s.start() remove_any(amount/10) return @@ -898,7 +901,7 @@ im R.on_new(data) if(istype(D, /datum/reagent/fermi))//Is this a fermichem? var/datum/reagent/fermi/Ferm = D //It's Fermi time! - Ferm.FermiNew(src) //Seriously what is "data" ???? + Ferm.FermiNew(my_atom) //Seriously what is "data" ???? //This is how I keep myself sane. diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index cc6b4ca0b7..d7d7fc45a9 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -233,8 +233,8 @@ to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) - for (var/datum/mood_event/i in M) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, i) //Why does this not work? + for(var/datum/mood_event/Me in M) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, Me) //Why does this not work? SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate) @@ -816,8 +816,8 @@ Buginess level: works as intended - except teleport makes sparks for some reason //var/Svol = volume /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! - M.alpha = 255//Reset addiction - antiGenetics = 255 + //M.alpha = 255//Reset addiction + //antiGenetics = 255// DOesn't work for some reason? switch(current_cycle) if(0)//Require a minimum origin = M @@ -854,7 +854,10 @@ Buginess level: works as intended - except teleport makes sparks for some reason //Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. /datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) - if(prob(65)) + if(M.reagents.has_reagent("astral") + antiGenetics = 255//Doesn't reset when you take more, which is weird for me, it should. + M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them. + if(prob(60)) M.alpha-- antiGenetics-- switch(antiGenetics) @@ -867,7 +870,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason M.alpha-- antiGenetics-- if(180) - to_chat(M, "You're starting to get scared as more and more of your body and consciousness begins to fade.") + to_chat(M, "You feel fear build up in yourself as more and more of your body and consciousness begins to fade.") M.alpha-- antiGenetics-- if(120) @@ -880,7 +883,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason antiGenetics-- M.add_trait(TRAIT_NOCLONE) //So you can't scan yourself, then die, to metacomm. You can only use your memories if you come back as something else. if(80) - to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates the forthcoming oblivion.") + to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates your forthcoming oblivion.") M.alpha-- antiGenetics-- if(45) @@ -890,9 +893,9 @@ Buginess level: works as intended - except teleport makes sparks for some reason if(0 to 30) to_chat(M, "Your body disperses from existence, as you become one with the universe.") to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life and afterlife remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only. + deadchat_broadcast("[M] has become one with the universe, meaning that their IC conciousness is continuous throughout death. If they find a way back to life, they are allowed to remember what was said in deadchat and their previous life. Be careful what you say. If they don't act IC while dead, bwoink the FUCK outta them.") M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.") - deadchat_broadcast("[M] has become one with the universe, meaning that their IC conciousness is continuous throughout death. If they find a way back to life, they are allowed to remember what was said in deadchat and their previous life. Be careful what you say. If they don't act IC while dead, bwoink the FUCK otta them.") - message_admins("[M] has become one with the universe, and have continuous memories thoughout death should they find a way to come back to life (such as an inteligence potion, midround antag). They MUST stay within characer while dead.") + message_admins("[M] (ckey: [M.ckey]) has become one with the universe, and have continuous memories thoughout death should they find a way to come back to life (such as an inteligence potion, midround antag, ghost role). They MUST stay within characer while dead.") qdel(M) //Approx 60minutes till death from initial addiction ..() @@ -1052,18 +1055,16 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y var/mob/living/creator -/datum/reagent/fermi/enthrall/FermiNew(holder) +/datum/reagent/fermi/enthrall/FermiNew(var/atom/my_atom) message_admins("FermiNew for enthral proc'd") - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list //var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list - if (B.["gender"] == "female") - creatorGender = "Mistress" + if (B.data.["gender"] == "female") + creatorGender = "Mistress"d else creatorGender = "Master" - creatorName = B.["real_name"] - creatorID = B.["ckey"] - var/mob/living/creatore = holder - creator = creatore + creatorName = B.data.["real_name"] + creatorID = B.data.["ckey"] message_admins("name: [creatorName], ID: [creatorID], gender: [creatorGender], creator:[creator]") /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) @@ -1199,7 +1200,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y description = "A strange substance that draws in a hat from the hat dimention, " color = "#A080H4" // rgb: , 0, 255 taste_description = "like jerky, whiskey and an off aftertaste of a crypt" - overdose_threshold = 100 + overdose_threshold = 25 var/obj/item/clothing/head/hattip/hat DoNotSplit = TRUE @@ -1209,14 +1210,17 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y var/items = M.get_contents() for(var/obj/item/W in items) if(W == M.head) - M.dropItemToGround(W, TRUE) + if(W = /obj/item/clothing/head/hattip) + qdel(W) + else + M.dropItemToGround(W, TRUE) hat = new /obj/item/clothing/head/hattip() M.equip_to_slot(hat, SLOT_HEAD, 1, 1) /datum/reagent/fermi/hatmium/on_mob_life(mob/living/carbon/human/M) //hat.armor = list("melee" = (1+(current_cycle/20)), "bullet" = (1+(current_cycle/20)), "laser" = (1+(current_cycle/20)), "energy" = (1+(current_cycle/20)), "bomb" = (1+(current_cycle/20)), "bio" = (1+(current_cycle/20)), "rad" = (1+(current_cycle/20)), "fire" = (1+(current_cycle/20)), "acid" = (1+(current_cycle/20))) - var/hatArmor = (1+(current_cycle/10))*purity + var/hatArmor = (1+(current_cycle/100))*purity if(!overdosed) hat.armor = list("melee" = hatArmor, "bullet" = hatArmor, "laser" = hatArmor, "energy" = hatArmor, "bomb" = hatArmor, "bio" = hatArmor, "rad" = hatArmor, "fire" = hatArmor) else @@ -1255,7 +1259,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(prob(10)) to_chat(M, "You find yourself unable to supress the desire to howl!") M.emote("awoo") - if(prob(10)) + if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers for(var/victim in seen) if((victim != /mob/living/simple_animal/pet/) || (victim == M)) @@ -1275,10 +1279,10 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(prob(10)) to_chat(M, "You find yourself unable to supress the desire to howl!") M.emote("awoo") - if(prob(10)) + if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers for(var/victim in seen) - if((victim != /mob/living/simple_animal/pet/) || (victim == M)) + if((victim = /mob/living/simple_animal/pet/) || (victim == M)) seen = seen - victim if(seen) to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 031f34c6bf..6074cbf70c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -26,11 +26,11 @@ var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new if(pH < 2.5) - s.set_up("fermiAcid", (volume/3), pH*10, T) + s.set_up(/datum/reagent/fermi/fermiAcid, (volume/3), pH*10, T) volume /=3 for (var/reagent in holder.reagent_list) var/datum/reagent/R = reagent - s.set_up(R.id, R.volume/3, pH*10, T) + s.set_up(R, R.volume/3, pH*10, T) //R.on_reaction(T, volume/10) //Uneeded, I think (hope) s.start() @@ -223,8 +223,7 @@ E.creatorGender = "Master" E.creatorName = B.["real_name"] E.creatorID = B.["ckey"] - var/mob/living/creator = holder - E.creator = creator + message_admins("name: [creatorName], ID: [creatorID], gender: [creatorGender], creator:[creator]") ..() //var/enthrallID = B.get_blood_data() diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 40372bd6b4..4334c5d846 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -42,3 +42,42 @@ resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_TINY //set flammable somehow + +/obj/item/pHpaper/afterattack(obj/item/reagent_containers/glass/glass, mob/user, proximity) + if(!istype(glass)) + return + if(used == TRUE) + to_chat(user, "[user] has already been used!") + return + switch(glass.reagents.pH) + if(14 to INFINITY) + color = "#462c83" + if(13 to 14) + color = "#63459b" + if(12 to 13) + color = "#5a51a2" + if(11 to 12) + color = "#3853a4" + if(10 to 11) + color = "#3f93cf" + if(9 to 10) + color = "#0bb9b7" + if(8 to 9) + color = "#23b36e" + if(7 to 8) + color = "#3aa651" + if(6 to 7) + color = "#4cb849" + if(5 to 6) + color = "#b5d335" + if(4 to 5) + color = "#b5d333" + if(3 to 4) + color = "#f7ec1e" + if(2 to 3) + color = "#fbc314" + if(1 to 2) + color = "#f26724" + if(-INFINITY to 1) + color = "#ef1d26" + used = TRUE From 8130a10d3a26b854e19ef1754d62c14a54b42ece Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 19 May 2019 03:39:26 +0100 Subject: [PATCH 127/608] Gosh darn fixes --- code/modules/reagents/chemistry/holder.dm | 13 +++--- .../chemistry/reagents/fermi_reagents.dm | 40 +++++++++++++------ .../reagents/chemistry/recipes/fermi.dm | 24 +++++------ 3 files changed, 46 insertions(+), 31 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6aa7563d2d..8db054a139 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -251,7 +251,7 @@ im if(current_reagent.id == reagent) if(preserve_data) trans_data = current_reagent.data - R.add_reagent(current_reagent.id, amount, trans_data, chem_temp, T.purity, pH, no_react = TRUE) //Fermichem edit TODO: add purity + R.add_reagent(current_reagent.id, amount, trans_data, chem_temp, current_reagent.purity, pH, no_react = TRUE) //Fermichem edit TODO: add purity //R.add_reagent(current_reagent.id, amount, trans_data, src.chem_temp, pH, current_reagent.purity, no_react = TRUE) //Fermichem edit remove_reagent(current_reagent.id, amount, 1) break @@ -560,7 +560,7 @@ im targetVol = 0 handle_reactions() update_total() - var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[fermiReactID] + var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C] Ferm.FermiFinish(src, multiplier) //C.on_reaction(src, multiplier, special_react_result) return @@ -585,7 +585,7 @@ im targetVol = 0 handle_reactions() update_total() - var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[fermiReactID] + var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C] Ferm.FermiFinish(src, multiplier) //C.on_reaction(src, multiplier, special_react_result) return @@ -597,7 +597,7 @@ im targetVol = 0 handle_reactions() update_total() - var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[fermiReactID] + var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C] Ferm.FermiFinish(src, multiplier) //C.on_reaction(src, multiplier, special_react_result) return @@ -712,7 +712,8 @@ im message_admins("purity: [purity], purity of beaker") message_admins("Temp before change: [chem_temp], pH after change: [pH]") //Apply pH changes and thermal output of reaction to beaker - chem_temp = round(chem_temp + (C.ThermicConstant * stepChemAmmount)) //Why won't you update!!! + //chem_temp = round(chem_temp + (C.ThermicConstant * stepChemAmmount)) //Why won't you update!!! + adjust_thermal_energy((C.ThermicConstant * stepChemAmmount), 0, 1500) //(J, min_temp = 2.7, max_temp = 1000) pH += (C.HIonRelease * stepChemAmmount) message_admins("Temp after change: [chem_temp], pH after change: [pH]") @@ -812,7 +813,7 @@ im /datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) var/S = specific_heat() - chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), 2.7, 1000) + chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), min_temp, max_temp) /datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, other_purity = 1, other_pH, no_react = 0)//EDIT HERE TOO ~FERMICHEM~ if(!isnum(amount) || !amount) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index d7d7fc45a9..cfa6b24321 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -40,14 +40,14 @@ if (src.purity == 1 || src.DoNotSplit == TRUE) return else if (src.InverseChemVal > src.purity) - M.reagents.remove_reagent(src.id, volume, FALSE) + M.reagents.remove_reagent(src, volume, FALSE) M.reagents.add_reagent(src.InverseChem, volume, FALSE, other_purity = 1) message_admins("all convered to [src.InverseChem]") return else //var/pureVol = volume * purity var/impureVol = volume * (1 - (volume * purity)) - M.reagents.remove_reagent(src.id, (volume*impureVol), FALSE) + M.reagents.remove_reagent(src, (volume*impureVol), FALSE) M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) return ..() @@ -58,14 +58,14 @@ if (other_purity == 1 || src.DoNotSplit == TRUE) return else if (src.InverseChemVal > other_purity) - M.reagents.remove_reagent(src.id, amount, FALSE) + M.reagents.remove_reagent(src, amount, FALSE) M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1) message_admins("all convered to [src.InverseChem]") return else //var/pureVol = var/impureVol = amount * (1 - (amount * other_purity)) - M.reagents.remove_reagent(src.id, impureVol, FALSE) + M.reagents.remove_reagent(src, impureVol, FALSE) M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) return ..() @@ -854,7 +854,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason //Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this. /datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) - if(M.reagents.has_reagent("astral") + if(M.reagents.has_reagent("astral")) antiGenetics = 255//Doesn't reset when you take more, which is weird for me, it should. M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them. if(prob(60)) @@ -1049,6 +1049,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. DoNotSplit = TRUE + //data = ("creatorID" = null, "creatorGender" = null, "creatorName" = null) var/creatorID //ckey var/creatorGender var/creatorName @@ -1057,15 +1058,21 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/enthrall/FermiNew(var/atom/my_atom) message_admins("FermiNew for enthral proc'd") + creatorID = data.["creatorID"] + creatorGender = data.["creatorGender"] + creatorName = data.["creatorName"] + message_admins("name: [creatorName], ID: [creatorID], gender: [creatorGender]") + /* var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list //var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list if (B.data.["gender"] == "female") - creatorGender = "Mistress"d + creatorGender = "Mistress" else creatorGender = "Master" creatorName = B.data.["real_name"] creatorID = B.data.["ckey"] - message_admins("name: [creatorName], ID: [creatorID], gender: [creatorGender], creator:[creator]") + */ + /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) . = ..() @@ -1084,19 +1091,23 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y else M.apply_status_effect(/datum/status_effect/chem/enthrall) var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) - E.enthrallID = creatorID - E.enthrallGender = creatorGender - E.master = creator + if(creator) + E.enthrallID = creatorID + E.enthrallGender = creatorGender + E.master = creator /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) if(purity < 0.5)//Placeholder for now. I'd like to get this done. if (M.key == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers + for(var/victim in seen) + if((victim == /mob/living/simple_animal/pet/) || (victim == M)) + seen = seen - victim if(!seen) return M.reagents.remove_reagent(src.id, src.volume) - FallInLove(M, seen) + FallInLove(M, pick(seen)) return else // If someone else drinks it, the creator falls in love with them! var/mob/living/carbon/C = get_mob_by_key(creatorID) @@ -1144,6 +1155,9 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system. if(!M.has_status_effect(STATUS_EFFECT_INLOVE)) var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers + for(var/victim in seen) + if((victim == /mob/living/simple_animal/pet/) || (victim == M)) + seen = seen - victim if(!seen) return love = seen @@ -1210,7 +1224,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y var/items = M.get_contents() for(var/obj/item/W in items) if(W == M.head) - if(W = /obj/item/clothing/head/hattip) + if(W == /obj/item/clothing/head/hattip) qdel(W) else M.dropItemToGround(W, TRUE) @@ -1262,7 +1276,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(prob(20)) var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers for(var/victim in seen) - if((victim != /mob/living/simple_animal/pet/) || (victim == M)) + if((victim == /mob/living/simple_animal/pet/) || (victim == M)) seen = seen - victim if(seen) to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 6074cbf70c..269b833226 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -213,24 +213,24 @@ FermiExplode = TRUE PurityMin = 0.15 -/datum/chemical_reaction/fermi/enthrall/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/fermi/enthrall/on_reaction(var/atom/my_atom) message_admins("On reaction for enthral proc'd") - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list - if (B.["gender"] == "female") - E.creatorGender = "Mistress" + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list + var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list + if (B.data.["gender"] == "female") + E.data.["creatorGender"] = "Mistress" else - E.creatorGender = "Master" - E.creatorName = B.["real_name"] - E.creatorID = B.["ckey"] - message_admins("name: [creatorName], ID: [creatorID], gender: [creatorGender], creator:[creator]") + E.data.["creatorGender"] = "Master" + E.data["creatorName"] = B.data.["real_name"] + E.data.["creatorID"] = B.data.["ckey"] + message_admins("name: [E.creatorName], ID: [E.creatorID], gender: [E.creatorGender]") ..() //var/enthrallID = B.get_blood_data() -/datum/chemical_reaction/fermi/enthrall/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) - var/turf/T = get_turf(holder.my_atom) +/datum/chemical_reaction/fermi/enthrall/FermiExplode(src, var/atom/my_atom, volume, temp, pH, Reaction) + var/turf/T = get_turf(my_atom) var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new - s.set_up("enthrallExplo", volume, pH*10, T) + s.set_up(/datum/reagent/fermi/enthrallExplo, volume, pH*10, T) s.start() ..() From 072a4ce6a62b0905bb046b1c21188d9cda6c2893 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 19 May 2019 04:20:34 +0100 Subject: [PATCH 128/608] Sleepy fixes --- code/modules/reagents/chemistry/holder.dm | 4 +- .../chemistry/reagents/fermi_reagents.dm | 4 +- .../reagents/chemistry/recipes/fermi.dm | 13 ++++--- .../modules/reagents/objects/fermiclothes.dm | 1 + .../code/modules/reagents/objects/items.dm | 39 ++++++++++--------- 5 files changed, 32 insertions(+), 29 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 8db054a139..263fbdde2a 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -674,7 +674,7 @@ im message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") - stepChemAmmount = multiplier * deltaT + stepChemAmmount = deltaT //used to have multipler, now it doesn't if (stepChemAmmount > C.RateUpLim) stepChemAmmount = C.RateUpLim else if (stepChemAmmount <= 0.01) @@ -713,7 +713,7 @@ im message_admins("Temp before change: [chem_temp], pH after change: [pH]") //Apply pH changes and thermal output of reaction to beaker //chem_temp = round(chem_temp + (C.ThermicConstant * stepChemAmmount)) //Why won't you update!!! - adjust_thermal_energy((C.ThermicConstant * stepChemAmmount), 0, 1500) //(J, min_temp = 2.7, max_temp = 1000) + adjust_thermal_energy((chem_temp*(C.ThermicConstant * stepChemAmmount *100)), 0, 1500) //(J, min_temp = 2.7, max_temp = 1000) pH += (C.HIonRelease * stepChemAmmount) message_admins("Temp after change: [chem_temp], pH after change: [pH]") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index cfa6b24321..2f8936c9ed 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1049,14 +1049,14 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. DoNotSplit = TRUE - //data = ("creatorID" = null, "creatorGender" = null, "creatorName" = null) + data = list("creatorID" = null, "creatorGender" = null, "creatorName" = null) var/creatorID //ckey var/creatorGender var/creatorName var/mob/living/creator -/datum/reagent/fermi/enthrall/FermiNew(var/atom/my_atom) +/datum/reagent/fermi/enthrall/nn_new(list/data) message_admins("FermiNew for enthral proc'd") creatorID = data.["creatorID"] creatorGender = data.["creatorGender"] diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 269b833226..798e416e98 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -6,9 +6,9 @@ //Called when temperature is above a certain threshold //....Is this too much? -/datum/chemical_reaction/fermi/proc/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? +/datum/chemical_reaction/fermi/proc/FermiExplode(src, my_atom, volume, temp, pH, Reaction) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? var/Svol = volume - var/turf/T = get_turf(holder.my_atom) + var/turf/T = get_turf(my_atom) if(temp>600)//if hot, start a fire switch(temp) if (601 to 800) @@ -68,6 +68,7 @@ var/location = get_turf(holder.my_atom) var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in holder.reagent_list E.location_created = location + //add on_new() handling of vars //serum /datum/chemical_reaction/fermi/SDGF @@ -126,7 +127,7 @@ /datum/chemical_reaction/fermi/BElarger/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) //var/obj/item/organ/genital/breasts/B = - new /obj/item/organ/genital/breasts(holder.my_atom) + new /obj/item/organ/genital/breasts(holder.my_atom.loc) var/list/seen = viewers(5, get_turf(holder.my_atom)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a pair of breasts!")//OwO @@ -158,7 +159,7 @@ /datum/chemical_reaction/fermi/PElarger/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) //var/obj/item/organ/genital/penis/nP = - new /obj/item/organ/genital/penis(holder.my_atom) + new /obj/item/organ/genital/penis(holder.my_atom.loc) var/list/seen = viewers(5, get_turf(holder.my_atom)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a penis!")//OwO @@ -215,8 +216,8 @@ /datum/chemical_reaction/fermi/enthrall/on_reaction(var/atom/my_atom) message_admins("On reaction for enthral proc'd") - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list - var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagent_list + var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagent_list if (B.data.["gender"] == "female") E.data.["creatorGender"] = "Mistress" else diff --git a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm b/modular_citadel/code/modules/reagents/objects/fermiclothes.dm index 38e3a14740..3cd5c8e90c 100644 --- a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm +++ b/modular_citadel/code/modules/reagents/objects/fermiclothes.dm @@ -20,6 +20,7 @@ return ..() /obj/item/clothing/head/hattip/speechModification(message) + ..() if(prob(0.01)) message += "\" and tips their hat. \"Spy's sappin' my Sentry!" return message diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 4334c5d846..113d0783d9 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -10,7 +10,6 @@ //set flammable somehow /obj/item/pHbooklet/attack_hand(mob/user) - ..() if(user.get_held_index_of_item(src)) if(numberOfPages >= 1) var/obj/item/pHpaper/P = new /obj/item/pHpaper @@ -26,6 +25,7 @@ to_chat(user, "[src] is empty!") add_fingerprint(user) return + ..() var/I = user.get_active_held_item() if(!I) user.put_in_active_hand(src) @@ -43,41 +43,42 @@ w_class = WEIGHT_CLASS_TINY //set flammable somehow -/obj/item/pHpaper/afterattack(obj/item/reagent_containers/glass/glass, mob/user, proximity) - if(!istype(glass)) +/obj/item/pHpaper/afterattack(obj/item/reagent_containers/cont, mob/user, proximity) + if(!istype(cont)) return if(used == TRUE) to_chat(user, "[user] has already been used!") return - switch(glass.reagents.pH) - if(14 to INFINITY) + switch(cont.reagents.pH) + if(13.5 to INFINITY) color = "#462c83" - if(13 to 14) + if(12.5 to 13.5) color = "#63459b" - if(12 to 13) + if(11.5 to 12.5) color = "#5a51a2" - if(11 to 12) + if(10.5 to 11.5) color = "#3853a4" - if(10 to 11) + if(9.5 to 10.5) color = "#3f93cf" - if(9 to 10) + if(8.5 to 9.5) color = "#0bb9b7" - if(8 to 9) + if(7.5 to 8.5) color = "#23b36e" - if(7 to 8) + if(6.5 to 7.5) color = "#3aa651" - if(6 to 7) + if(5.5 to 6.5) color = "#4cb849" - if(5 to 6) + if(4.5 to 5.5) color = "#b5d335" - if(4 to 5) + if(3.5 to 4.5) color = "#b5d333" - if(3 to 4) + if(2.5 to 3.5) color = "#f7ec1e" - if(2 to 3) + if(1.5 to 2.5) color = "#fbc314" - if(1 to 2) + if(0.5 to 1.5) color = "#f26724" - if(-INFINITY to 1) + if(-INFINITY to 0.5) color = "#ef1d26" + description += " The paper looks to be around [round(glass.reagents.pH)]" used = TRUE From a6ede9fecc75902152d278d0198e8730900cff8c Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 19 May 2019 23:32:30 +0100 Subject: [PATCH 129/608] Endless fixes --- code/modules/reagents/chemistry/holder.dm | 37 ++++---- .../code/datums/mood_events/chem_events.dm | 6 +- .../code/datums/status_effects/chems.dm | 41 +++++---- .../chemistry/reagents/fermi_reagents.dm | 38 +++++++-- .../reagents/chemistry/recipes/fermi.dm | 85 ++++++++++++------- .../code/modules/reagents/objects/items.dm | 34 ++++---- 6 files changed, 147 insertions(+), 94 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 263fbdde2a..409d584502 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -478,15 +478,16 @@ im targetVol = cached_results[P]*multiplier message_admins("FermiChem target volume: [targetVol]") - if (chem_temp > C.OptimalTempMin)//To prevent pointless reactions + if ((chem_temp > C.OptimalTempMin) && (pH > (C.OptimalpHMin - C.ReactpHLim)) && (pH < (C.OptimalpHMax + C.ReactpHLim)))//To prevent pointless reactions //if (reactedVol < targetVol) if (fermiIsReacting == TRUE) return 0 else //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) - selected_reaction.on_reaction(src, multiplier) + //selected_reaction.on_reaction(src, my_atom, multiplier) START_PROCESSING(SSprocessing, src) message_admins("FermiChem processing started") + selected_reaction.on_reaction(src, my_atom, multiplier) fermiIsReacting = TRUE fermiReactID = selected_reaction reaction_occurred = 1 @@ -560,7 +561,7 @@ im targetVol = 0 handle_reactions() update_total() - var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C] + var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] Ferm.FermiFinish(src, multiplier) //C.on_reaction(src, multiplier, special_react_result) return @@ -585,7 +586,7 @@ im targetVol = 0 handle_reactions() update_total() - var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C] + var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] Ferm.FermiFinish(src, multiplier) //C.on_reaction(src, multiplier, special_react_result) return @@ -597,14 +598,14 @@ im targetVol = 0 handle_reactions() update_total() - var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C] + var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] Ferm.FermiFinish(src, multiplier) //C.on_reaction(src, multiplier, special_react_result) return //handle_reactions() -/datum/reagents/proc/FermiReact(selected_reaction, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) +/datum/reagents/proc/FermiReact(selected_reaction, cached_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) var/datum/chemical_reaction/fermi/C = selected_reaction var/deltaT = 0 var/deltapH = 0 @@ -620,10 +621,10 @@ im //Check extremes first - if (chem_temp > C.ExplodeTemp) + if (cached_temp > C.ExplodeTemp) //go to explode proc - message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]") - C.FermiExplode(src, my_atom, (reactedVol+targetVol), chem_temp, pH) + message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [cached_temp]") + C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) if (pH > 14) pH = 14 @@ -635,7 +636,7 @@ im message_admins("pH is lover limit, cur pH: [pH]") if ((purity < C.PurityMin) && (!C.PurityMin == 0))//If purity is below the min, blow it up. - C.FermiExplode(src, (reactedVol+targetVol), chem_temp, pH, C) + C.FermiExplode(src, (reactedVol+targetVol), cached_temp, pH, C) //For now, purity is handled elsewhere @@ -648,8 +649,8 @@ im else deltapH = (((pH - (C.OptimalpHMin - C.ReactpHLim))**C.CurveSharppH)/((C.ReactpHLim**C.CurveSharppH))) //Upper range - else if (pH > C.OptimalpHMin) - if (pH > (C.OptimalpHMin + C.ReactpHLim)) + else if (pH > C.OptimalpHMax) + if (pH > (C.OptimalpHMax + C.ReactpHLim)) deltapH = 0 return //If outside pH range, no reaction else @@ -665,9 +666,9 @@ im message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") //Calculate DeltaT (Deviation of T from optimal) - if (chem_temp < C.OptimalTempMax && chem_temp >= C.OptimalTempMin) - deltaT = (((chem_temp - C.OptimalTempMin)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) - else if (chem_temp >= C.OptimalTempMax) + if (cached_temp < C.OptimalTempMax && cached_temp >= C.OptimalTempMin) + deltaT = (((cached_temp - C.OptimalTempMin)**C.CurveSharpT)/((C.OptimalTempMax - C.OptimalTempMin)**C.CurveSharpT)) + else if (cached_temp >= C.OptimalTempMax) deltaT = 1 else deltaT = 0 @@ -706,14 +707,14 @@ im for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? //reactedVol = max(reactedVol, 1) //this shouldnt happen ... SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, chem_temp, purity)//add reagent function!! I THINK I can do this: + add_reagent(P, cached_results[P]*stepChemAmmount, null, cached_temp, purity)//add reagent function!! I THINK I can do this: C.FermiCreate(src) message_admins("purity: [purity], purity of beaker") message_admins("Temp before change: [chem_temp], pH after change: [pH]") //Apply pH changes and thermal output of reaction to beaker - //chem_temp = round(chem_temp + (C.ThermicConstant * stepChemAmmount)) //Why won't you update!!! - adjust_thermal_energy((chem_temp*(C.ThermicConstant * stepChemAmmount *100)), 0, 1500) //(J, min_temp = 2.7, max_temp = 1000) + chem_temp = round(cached_temp + (C.ThermicConstant * stepChemAmmount)) //Why won't you update!!! + //adjust_thermal_energy((cached_temp*(C.ThermicConstant * stepChemAmmount *100)), 0, 1500) //(J, min_temp = 2.7, max_temp = 1000) pH += (C.HIonRelease * stepChemAmmount) message_admins("Temp after change: [chem_temp], pH after change: [pH]") diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index 79d8c115d5..933128f031 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -4,11 +4,11 @@ /datum/mood_event/enthrall mood_change = 5 - description = "I am a good pet for Master.\n" + description = "I am a good pet for Master.\n" /datum/mood_event/enthrallpraise mood_change = 12 - description = "I feel so happy! I'm a good pet who Master loves!\n" + description = "I feel so happy! I'm a good pet who Master loves!\n" timeout = 600 /datum/mood_event/enthrallscold @@ -34,7 +34,7 @@ /datum/mood_event/InLove mood_change = 10 - description = "I'm in love!!\n" + description = "I'm in love!!\n" /datum/mood_event/MissingLove mood_change = -10 diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 5a704e6784..95dee449bd 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -76,27 +76,19 @@ o.dropItemToGround(W, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) to_chat(owner, "Your enormous breasts are way too large to fit anything over them!") - //message_admins("BElarge tick!") - /* - var/items = o.get_contents() - for(var/obj/item/W in items) - if(W == o.w_uniform || W == o.wear_suit) - o.dropItemToGround(W) - //items |= owner.get_equipped_items(TRUE) - - //owner.dropItemToGround(owner.wear_suit) - //owner.dropItemToGround(owner.w_uniform) - */ switch(round(B.cached_size)) if(9) if (!(B.breast_sizes[B.prev_size] == B.size)) + to_chat(o, "Your expansive chest has become a more managable size, liberating your movements.") o.remove_movespeed_modifier("megamilk") o.next_move_modifier = 1 if(10 to INFINITY) if (!(B.breast_sizes[B.prev_size] == B.size)) to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!") - o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (round(B.cached_size) - 8)) - o.next_move_modifier = (round(B.cached_size) - 8) + o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = ((round(B.cached_size) - 8))/3) + o.next_move_modifier = (round(B.cached_size) - 8)/3 + if(prob(5)) + to_chat(H, "Your back is feeling a little sore.") ..() /datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) @@ -139,18 +131,21 @@ playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) to_chat(owner, "Your enormous package is way to large to fit anything over!") switch(round(P.cached_length)) - if(11) + if(21) if (!(P.prev_size == P.size)) - to_chat(o, "Your rascally willy has become a more managable size, liberating your movements.") + to_chat(o, "Your rascally willy has become a more managable size, liberating your movements.") o.remove_movespeed_modifier("hugedick") o.next_move_modifier = 1 - if(12 to INFINITY) + if(22 to INFINITY) if (!(P.prev_size == P.size)) to_chat(o, "Your indulgent johnson is so substantial, it's affecting your movements!") - o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 11.1)) - o.next_move_modifier = (round(P.length) - 11) + o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 21.1)) + o.next_move_modifier = (round(P.length) - 21) ..() +/datum/status_effect/chem/PElarger/on_remove(mob/living/carbon/M) + owner.remove_movespeed_modifier("hugedick") + owner.next_move_modifier = 1 /*////////////////////////////////////////// Mind control functions @@ -185,6 +180,14 @@ var/cooldown = 0 /datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) + var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list + enthrallID = E.creatorID + enthrallGender = E.creatorGender + master = E.creator + if(!E) + message_admins("WARNING: No chem found in thrall!!!!") + if(!master) + message_admins("WARNING: No master! found in thrall!!!!") if(M.key == enthrallID) owner.remove_status_effect(src)//This shouldn't happen, but just in case redirect_component1 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# @@ -195,6 +198,7 @@ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall) /datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) + message_admins("Enthrall processing for [M]: ") //chem calculations if (owner.reagents.has_reagent("MKUltra")) @@ -398,6 +402,7 @@ cooldown -= (1 + (mental_capacity/1000 )) else to_chat(master, "Your pet [owner.name] appears to have finished internalising your last command.") + ..() //Check for proximity of master DONE //Place triggerreacts here - create a dictionary of triggerword and effect. diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 2f8936c9ed..050d1edeaf 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -24,7 +24,7 @@ //return ..() //Called when reaction stops. #STOP_PROCESSING -/datum/reagent/fermi/proc/FermiFinish(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? +/datum/reagent/fermi/proc/FermiFinish(datum/reagents/holder, multipler) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? return //Called when added to a beaker without any of the reagent present. #add_reagent @@ -34,6 +34,8 @@ //This should process fermichems to find out how pure they are and what effect to do. //TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE /datum/reagent/fermi/on_mob_add(mob/living/carbon/M) + if(!M) + return ..() message_admins("purity of chem is [purity]") if(src.purity < 0) CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") @@ -53,6 +55,8 @@ ..() /datum/reagent/fermi/on_merge(mob/living/carbon/M, amount, other_purity) + if(!M) + return ..() if(other_purity < 0) CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") if (other_purity == 1 || src.DoNotSplit == TRUE) @@ -364,7 +368,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING //reaction_mob(SM, )I forget what this is for //Damage the clone SM.blood_volume = BLOOD_VOLUME_NORMAL/2 - SM.adjustCloneLoss(80, 0) + SM.adjustCloneLoss(60, 0) SM.setBrainLoss(40) SM.nutrition = startHunger/2 //var/datum/reagents/SMR = SM @@ -1049,14 +1053,14 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. DoNotSplit = TRUE - data = list("creatorID" = null, "creatorGender" = null, "creatorName" = null) + data// = list("creatorID" = null, "creatorGender" = null, "creatorName" = null) var/creatorID //ckey var/creatorGender var/creatorName var/mob/living/creator -/datum/reagent/fermi/enthrall/nn_new(list/data) +/datum/reagent/fermi/enthrall/on_new(list/data) message_admins("FermiNew for enthral proc'd") creatorID = data.["creatorID"] creatorGender = data.["creatorGender"] @@ -1073,11 +1077,23 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y creatorID = B.data.["ckey"] */ +/datum/reagent/fermi/enthrall/FermiFinish(datum/reagents/holder) + message_admins("On finish for enthral proc'd") + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list + if (B.data.["gender"] == "female") + E.data.["creatorGender"] = "Mistress" + else + E.data.["creatorGender"] = "Master" + E.data["creatorName"] = B.data.["real_name"] + E.data.["creatorID"] = B.data.["ckey"] + message_admins("name: [E.creatorName], ID: [E.creatorID], gender: [E.creatorGender]") /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) . = ..() if(!creatorID) CRASH("Something went wrong in enthral creation") + message_admins("key: [M.key] vs [creatorID], ") if(purity < 0.5)//Impure chems don't function as you expect return else if(M.key == creatorID && creatorName == M.real_name) //same name AND same player - same instance of the player. (should work for clones?) @@ -1090,16 +1106,20 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y creator = M else M.apply_status_effect(/datum/status_effect/chem/enthrall) - var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + //var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + /* if(creator) E.enthrallID = creatorID E.enthrallGender = creatorGender E.master = creator + */ /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) if(purity < 0.5)//Placeholder for now. I'd like to get this done. if (M.key == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. + if(M.has_status_effect(STATUS_EFFECT_INLOVE)) + return var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers for(var/victim in seen) if((victim == /mob/living/simple_animal/pet/) || (victim == M)) @@ -1111,6 +1131,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y return else // If someone else drinks it, the creator falls in love with them! var/mob/living/carbon/C = get_mob_by_key(creatorID) + if(C.has_status_effect(STATUS_EFFECT_INLOVE)) + return if(C in viewers(7, get_turf(M))) M.reagents.remove_reagent(src.id, src.volume) FallInLove(C, M) @@ -1158,9 +1180,11 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y for(var/victim in seen) if((victim == /mob/living/simple_animal/pet/) || (victim == M)) seen = seen - victim - if(!seen) + if(seen.len == 0) + return + love = pick(seen) + if(!love) return - love = seen M.apply_status_effect(STATUS_EFFECT_INLOVE, love) to_chat(M, "You develop deep feelings for [love], your heart beginning to race as you look upon them with new eyes.") else diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 798e416e98..95229f9745 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -6,39 +6,56 @@ //Called when temperature is above a certain threshold //....Is this too much? -/datum/chemical_reaction/fermi/proc/FermiExplode(src, my_atom, volume, temp, pH, Reaction) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? - var/Svol = volume +/datum/chemical_reaction/fermi/proc/FermiExplode(src, var/atom/my_atom, datum/reagents/holder, volume, temp, pH, Reaction, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? + //var/Svol = volume + if (Exploding == TRUE) + return + var/ImpureTot = 0 + var/pHmod = 1 var/turf/T = get_turf(my_atom) if(temp>600)//if hot, start a fire switch(temp) if (601 to 800) for(var/turf/turf in range(1,T)) new /obj/effect/hotspot(turf) - volume /= 3 + //volume /= 3 if (801 to 1100) for(var/turf/turf in range(2,T)) new /obj/effect/hotspot(turf) - volume /= 4 - if (1101 to INFINITY) + //volume /= 4 + if (1101 to INFINITY) //If you're crafty for(var/turf/turf in range(3,T)) new /obj/effect/hotspot(turf) - volume /= 5 + //volume /= 5 - var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new - if(pH < 2.5) - s.set_up(/datum/reagent/fermi/fermiAcid, (volume/3), pH*10, T) - volume /=3 - for (var/reagent in holder.reagent_list) - var/datum/reagent/R = reagent - s.set_up(R, R.volume/3, pH*10, T) - //R.on_reaction(T, volume/10) //Uneeded, I think (hope) - s.start() - - if (pH > 12) + //var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new + var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case. + var/datum/effect_system/smoke_spread/chem/s = new() + if(pH < 4) + //s.set_up(/datum/reagent/fermi/fermiAcid, (volume/3), pH*10, T) + R.add_reagent("fermiAcid", ((volume/3)/pH)) + pHmod = 2 + if (pH > 10) var/datum/effect_system/reagents_explosion/e = new() - e.set_up(round(volume/Svol, 1), T, 0, 0) + e.set_up(round((volume/30)*(pH-9)), T, 0, 0) e.start() - message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], containing [holder.reagent_list]") + pHmod = 1.5 + for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) + if (istype(reagent, /datum/reagent/fermi)) + var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id] + Ferm.FermiExplode(src, my_atom, holder, volume, temp, pH, Exploding = TRUE) + continue //Don't allow fermichems into the mix (fermi explosions are handled elsewhere and it's a huge pain) + R.add_reagent(reagent, reagent.volume) + if (reagent.purity < 0.6) + ImpureTot = (ImpureTot + (1-reagent.purity)) / 2 + if(R.reagent_list) + s.set_up(R, (volume/10)*pHmod, T) + s.start() + if(!ImpureTot == 0) + ImpureTot *= volume + empulse(T, volume/10, ImpureTot/10, 1) + message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot], containing [my_atom.reagents.reagent_list]") + my_atom.reagents.clear_reagents() return /datum/chemical_reaction/fermi/eigenstate @@ -95,7 +112,7 @@ PurityMin = 0.25 /datum/chemical_reaction/fermi/SDGF/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies - var/turf/T = get_turf(holder.my_atom) + var/turf/T = get_turf(holder) var/mob/living/simple_animal/slime/S = new(T,"grey")//should work, in theory S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)//I dunno how slimes work cause fire is burny S.name = "Living teratoma" @@ -127,8 +144,8 @@ /datum/chemical_reaction/fermi/BElarger/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) //var/obj/item/organ/genital/breasts/B = - new /obj/item/organ/genital/breasts(holder.my_atom.loc) - var/list/seen = viewers(5, get_turf(holder.my_atom)) + new /obj/item/organ/genital/breasts(get_turf(holder)) + var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a pair of breasts!")//OwO ..() @@ -138,7 +155,6 @@ id = "PElarger" results = list("PElarger" = 3) required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) - required_catalysts = list("blood" = 1) //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: OptimalTempMin = 200 @@ -159,8 +175,8 @@ /datum/chemical_reaction/fermi/PElarger/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) //var/obj/item/organ/genital/penis/nP = - new /obj/item/organ/genital/penis(holder.my_atom.loc) - var/list/seen = viewers(5, get_turf(holder.my_atom)) + new /obj/item/organ/genital/penis(get_turf(holder)) + var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a penis!")//OwO ..() @@ -214,10 +230,12 @@ FermiExplode = TRUE PurityMin = 0.15 -/datum/chemical_reaction/fermi/enthrall/on_reaction(var/atom/my_atom) +//Apprently works..?Negative +/* +/datum/chemical_reaction/fermi/enthrall/on_reaction(datum/reagents/holder) message_admins("On reaction for enthral proc'd") - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagent_list - var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagent_list + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list if (B.data.["gender"] == "female") E.data.["creatorGender"] = "Mistress" else @@ -226,14 +244,19 @@ E.data.["creatorID"] = B.data.["ckey"] message_admins("name: [E.creatorName], ID: [E.creatorID], gender: [E.creatorGender]") ..() + //var/enthrallID = B.get_blood_data() +*/ /datum/chemical_reaction/fermi/enthrall/FermiExplode(src, var/atom/my_atom, volume, temp, pH, Reaction) var/turf/T = get_turf(my_atom) - var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new - s.set_up(/datum/reagent/fermi/enthrallExplo, volume, pH*10, T) + var/datum/reagents/R = new/datum/reagents(350) + var/datum/effect_system/smoke_spread/chem/s = new() + R.add_reagent("enthrallExplo", volume) + s.set_up(R, volume, T) s.start() - ..() + my_atom.reagents.clear_reagents() + //..() //Please don't kill everyone too. /datum/chemical_reaction/fermi/hatmium name = "Hat growth serum" diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 113d0783d9..1319048bc8 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -50,35 +50,35 @@ to_chat(user, "[user] has already been used!") return switch(cont.reagents.pH) - if(13.5 to INFINITY) + if(14 to INFINITY) color = "#462c83" - if(12.5 to 13.5) + if(13 to 14) color = "#63459b" - if(11.5 to 12.5) + if(12 to 13) color = "#5a51a2" - if(10.5 to 11.5) + if(11 to 12) color = "#3853a4" - if(9.5 to 10.5) + if(10 to 11) color = "#3f93cf" - if(8.5 to 9.5) + if(9 to 10) color = "#0bb9b7" - if(7.5 to 8.5) + if(8 to 9) color = "#23b36e" - if(6.5 to 7.5) + if(7 to 8) color = "#3aa651" - if(5.5 to 6.5) + if(6 to 7) color = "#4cb849" - if(4.5 to 5.5) + if(5 to 6) color = "#b5d335" - if(3.5 to 4.5) - color = "#b5d333" - if(2.5 to 3.5) + if(4 to 5) color = "#f7ec1e" - if(1.5 to 2.5) + if(3 to 4) color = "#fbc314" - if(0.5 to 1.5) + if(2 to 3) color = "#f26724" - if(-INFINITY to 0.5) + if(1 to 2) color = "#ef1d26" - description += " The paper looks to be around [round(glass.reagents.pH)]" + if(-INFINITY to 1) + color = "#c6040c" + desc += " The paper looks to be around a pH of [round(cont.reagents.pH)]" used = TRUE From bb4aecbd5f3d1f4af7f6d3ccca9add4111f41d8f Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 20 May 2019 07:44:39 +0100 Subject: [PATCH 130/608] Progressional fixes --- code/datums/components/mood.dm | 2 +- code/modules/mob/living/carbon/say.dm | 8 +- code/modules/reagents/chemistry/holder.dm | 18 +- code/modules/surgery/organs/vocal_cords.dm | 103 ++++----- .../code/datums/mood_events/chem_events.dm | 2 +- .../code/datums/status_effects/chems.dm | 208 ++++++++++-------- .../chemistry/reagents/fermi_reagents.dm | 103 ++++++--- .../reagents/chemistry/recipes/fermi.dm | 36 ++- 8 files changed, 301 insertions(+), 179 deletions(-) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 3f993bdd73..b94147c277 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -255,7 +255,7 @@ if(the_event.timeout) addtimer(CALLBACK(src, .proc/clear_event, null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE) return 0 //Don't have to update the event. - the_event = new type(src, param)//This causes a runtime for some reason, was this me? + the_event = new type(src, param)//This causes a runtime for some reason, was this me? No - there's an event floating around missing a definition. mood_events[category] = the_event update_mood() diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index f6e43f487f..b966535a8f 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -2,6 +2,12 @@ for(var/datum/brain_trauma/trauma in get_traumas()) message = trauma.on_say(message) message = ..(message) + + var/obj/item/organ/vocal_cords/Vc = getorganslot(ORGAN_SLOT_VOICE) + if(Vc) + if(Vc.name == "velvet chords" ) + velvetspeech(message, src) + var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) if(!T) //hoooooouaah! var/regex/tongueless_lower = new("\[gdntke]+", "g") @@ -45,4 +51,4 @@ return for(var/T in get_traumas()) var/datum/brain_trauma/trauma = T - message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq) \ No newline at end of file + message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 409d584502..521c27a838 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -494,6 +494,10 @@ im //else // fermiIsReacting = FALSE // STOP_PROCESSING(SSfastprocess, src) + else if (chem_temp > C.ExplodeTemp) + var/datum/chemical_reaction/fermi/Ferm = selected_reaction + Ferm.FermiExplode(src, my_atom, total_volume, chem_temp, pH) + return 0 else return 0 @@ -543,7 +547,7 @@ im return 0//end! /datum/reagents/process() - var/datum/chemical_reaction/C = fermiReactID + var/datum/chemical_reaction/fermi/C = fermiReactID var/list/cached_required_reagents = C.required_reagents//update reagents list var/list/cached_results = C.results//resultant chemical list @@ -561,8 +565,8 @@ im targetVol = 0 handle_reactions() update_total() - var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] - Ferm.FermiFinish(src, multiplier) + //var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] + C.FermiFinish(src, my_atom, multiplier) //C.on_reaction(src, multiplier, special_react_result) return for(var/P in cached_results) @@ -586,8 +590,8 @@ im targetVol = 0 handle_reactions() update_total() - var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] - Ferm.FermiFinish(src, multiplier) + //var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] + C.FermiFinish(src, my_atom, multiplier) //C.on_reaction(src, multiplier, special_react_result) return else @@ -598,8 +602,8 @@ im targetVol = 0 handle_reactions() update_total() - var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] - Ferm.FermiFinish(src, multiplier) + //var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] + C.FermiFinish(src, my_atom, multiplier) //C.on_reaction(src, multiplier, special_react_result) return diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index a88eb82aa4..037df6ee33 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -616,35 +616,26 @@ /obj/item/organ/vocal_cords/velvet name = "velvet chords" desc = "The voice spoken from these just make you want to drift off, sleep and obey." - icon_state = "voice_of_god" - actions_types = list(/datum/action/item_action/organ_action/colossus) + icon_state = "in_love" + //actions_types = list(/datum/action/item_action/organ_action/velvet) var/next_command = 0 var/cooldown_mod = 1 var/base_multiplier = 1 spans = list("say","yell") /* -/datum/action/item_action/organ_action/colossus - name = "Voice of God" - var/obj/item/organ/vocal_cords/colossus/cords = null +/datum/action/item_action/organ_action/velvet + name = "Velvet voice" + var/obj/item/organ/vocal_cords/velvet/cords = null -/datum/action/item_action/organ_action/colossus/New() +/datum/action/item_action/organ_action/velvet/New() ..() cords = target -/datum/action/item_action/organ_action/colossus/IsAvailable() - if(world.time < cords.next_command) - return FALSE - if(!owner) - return FALSE - if(!owner.can_speak()) - return FALSE - if(check_flags & AB_CHECK_CONSCIOUS) - if(owner.stat) - return FALSE +/datum/action/item_action/organ_action/velvet/IsAvailable() return TRUE -/datum/action/item_action/organ_action/colossus/Trigger() +/datum/action/item_action/organ_action/velvet/Trigger() . = ..() if(!IsAvailable()) if(world.time < cords.next_command) @@ -658,16 +649,12 @@ owner.say(".x[command]") /obj/item/organ/vocal_cords/colossus/can_speak_with() - if(world.time < next_command) - to_chat(owner, "You must wait [DisplayTimeText(next_command - world.time)] before Speaking again.") - return FALSE if(!owner) return FALSE if(!owner.can_speak()) to_chat(owner, "You are unable to speak!") return FALSE return TRUE -*/ /obj/item/organ/vocal_cords/velvet/handle_speech(message) velvetspeech(message, owner, spans, base_multiplier) @@ -678,18 +665,20 @@ /obj/item/organ/vocal_cords/velvet/speak_with(message) velvetspeech(message, owner, spans, base_multiplier) //next_command = world.time + (cooldown * cooldown_mod) - +*/ ////////////////////////////////////// ///////////FermiChem////////////////// ////////////////////////////////////// - -/proc/velvetspeech(message, mob/living/user, list/span_list, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE) +//Removed span_list from input arguments. //mob/living/user +/proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE, debug = TRUE) + message_admins("Velvet speech proc'd on [user]") var/cooldown = 0 if(!user || !user.can_speak() || user.stat) return 0 //no cooldown var/log_message = message + /* if(!span_list || !span_list.len) //Not too sure what this does, I think it changes your output message depending if you're a cultist or not? I.e. font if(iscultist(user)) span_list = list("narsiesmall") @@ -697,8 +686,8 @@ span_list = list("ratvar") else span_list = list() - - user.say(message, sanitize = TRUE)//Removed spans = span_list, It should just augment normal speech + */ + //user.say(message, sanitize = TRUE)//Removed spans = span_list, It should just augment normal speech//DO NOT ENABLE, RECURSION HELL //FIND THRALLS @@ -714,12 +703,15 @@ if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) continue var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)//Check to see if pet is on cooldown from last command - if (E.cooldown != 0)//If they're on cooldown you can't give them more commands. + if (E.cooldown >= 0)//If they're on cooldown you can't give them more commands. continue listeners += L + if(debug == TRUE) + for(var/L in listeners) + to_chat(world, "[user] choses, and [L] obeys.") if(!listeners.len) - cooldown = COOLDOWN_NONE + cooldown = 0 return cooldown //POWER CALCULATIONS @@ -785,6 +777,9 @@ if (T.name == "fluffy tongue") //If you sound hillarious, it's hard to take you seriously. This is a way for other players to combat/reduce their effectiveness. power_multiplier *= 0.75 + if(debug == TRUE) + to_chat(world, "[user]'s power is [power_multiplier].") + /* CHECK THIS STUFF IN THE CHEM STATUS INSTEAD. if(istype(H.neck, /obj/item/clothing/neck/petcollar)) power_multiplier *= 1.5 //Collaring players makes them more docile and accepting of their place as a pet @@ -793,14 +788,14 @@ */ //Mixables - var/static/regex/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara") //enthral_words - var/static/regex/reward_words = regex("good boy|good girl|good pet") //reward_words - var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") ////punish_words + var/static/regex/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara") //enthral_words works + var/static/regex/reward_words = regex("good boy|good girl|good pet") //reward_words works + var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") ////punish_words works //phase 0 - var/static/regex/saymyname_words = regex("say my name|who am i|whoami") - var/static/regex/wakeup_words = regex("revert|awaken|snap") + var/static/regex/saymyname_words = regex("say my name|who am i|whoami") //works I think + var/static/regex/wakeup_words = regex("revert|awaken|snap") //works //phase1 - var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") + var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") //works var/static/regex/antiresist_words = regex("unable to resist|give in")//useful if you think your target is resisting a lot var/static/regex/resist_words = regex("resist|snap out of it|fight")//useful if two enthrallers are fighting var/static/regex/forget_words = regex("forget|muddled|awake and forget") @@ -825,11 +820,10 @@ var/static/regex/hot_words = regex("heat|hot|hell") var/static/regex/cold_words = regex("cold|cool down|chill|freeze") var/static/regex/getup_words = regex("get up") - var/static/regex/pacify_words = regex("More and more docile|complaisant|friendly|pacifist") + var/static/regex/pacify_words = regex("more and more docile|complaisant|friendly|pacifist") var/static/regex/charge_words = regex("charge|oorah|attack") - var/distancelist = list(1.5,1.5,1.3,1.2,1.1,1,0.8,0.6,0.5,0.25) - + var/distancelist = list(2,2,1.5,1.3,1.15,1,0.8,0.6,0.5,0.25) //enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words @@ -881,20 +875,23 @@ //SAY MY NAME if((findtext(message, saymyname_words))) for(var/V in listeners) - var/mob/living/L = V - addtimer(CALLBACK(L, /atom/movable/proc/say, "Master"), 5)//When I figure out how to do genedered names put them here + var/mob/living/carbon/C = V + C.remove_trait(TRAIT_MUTE, TRAUMA_TRAIT) + addtimer(CALLBACK(C, /atom/movable/proc/say, "Master"), 5)//When I figure out how to do genedered names put them here //WAKE UP else if((findtext(message, wakeup_words))) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) + L.SetSleeping(0)//Can you hear while asleep? switch(E.phase) if(0) E.phase = 3 E.status = null - to_chat(L, "The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve.") - L.SetSleeping(0)//Can you hear while asleep? + addtimer(CALLBACK(L, /atom/movable/proc/to_chat, "The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve."), 5) + //to_chat(L, ) + //tier 1 //SILENCE @@ -908,6 +905,13 @@ C.silent += ((10 * power_multiplier) * E.phase) E.cooldown += 3 + //SPEAK + else if((findtext(message, silence_words))) + for(var/mob/living/carbon/C in listeners) + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) + C.remove_trait(TRAIT_MUTE, TRAUMA_TRAIT) + E.cooldown += 3 + //Antiresist else if((findtext(message, antiresist_words))) for(var/V in listeners) @@ -929,7 +933,7 @@ else if((findtext(message, forget_words))) for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) - C.Sleeping(40) + C.Sleeping(50) to_chat(C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!") switch(E.phase) if(1 to 2) @@ -965,6 +969,7 @@ //teir 2 + //ORGASM else if((findtext(message, orgasm_words))) for(var/V in listeners) @@ -1001,8 +1006,8 @@ switch(E.phase) if(2 to INFINITY) var/mob/living/M = V - playsound(get_turf(M), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/merowr.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) - H.emote("me","lets out a nya!") + playsound(get_turf(M), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) + H.emote(H,"lets out a nya!") E.cooldown += 1 //SLEEP @@ -1028,7 +1033,7 @@ to_chat(H, "Before you can even think about it, you quickly remove your clothes in response to your Master's command.") E.cooldown += 10 - //WALK + //WALK doesn't work? else if((findtext(message, walk_words))) for(var/V in listeners) var/mob/living/L = V @@ -1039,7 +1044,7 @@ L.toggle_move_intent() E.cooldown += 1 - //RUN + //RUN doesn't work? else if((findtext(message, run_words))) for(var/V in listeners) var/mob/living/L = V @@ -1057,7 +1062,7 @@ var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 2 only - L.Knockdown(20 * power_multiplier * E.phase) + L.Knockdown(30 * power_multiplier * E.phase) E.cooldown += 8 //tier3 @@ -1086,7 +1091,7 @@ if (E.mental_capacity >= 10) var/trigger = stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN) var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) - if ((findtext(trigger, custom_words_words))) + if ((findtext(trigger2, custom_words_words))) if (trigger2 == "speak" || trigger2 == "echo") var/trigger3 = stripped_input(user, "Enter the phrase spoken.", MAX_MESSAGE_LEN) E.customTriggers[trigger] = list(trigger2, trigger3) @@ -1108,7 +1113,7 @@ to_chat(H, "You need to be next to your pet to give them a new objective!") return else - user.emote("me", "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") + user.emote(user, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") if (E.mental_capacity >= 150 || message == "objective") var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", MAX_MESSAGE_LEN) if(!LAZYLEN(objective)) diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index 933128f031..c194605e9f 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -37,5 +37,5 @@ description = "I'm in love!!\n" /datum/mood_event/MissingLove - mood_change = -10 + mood_change = -20 description = "I can't keep my crush off my mind, I need to see them again!\n" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 95dee449bd..01f09dda15 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -171,42 +171,46 @@ var/mental_capacity //Higher it is, lower the cooldown on commands, capacity reduces with resistance. //var/mental_cost //Current cost of custom triggers //var/mindbroken = FALSE //Not sure I use this, replaced with phase 4 - var/datum/weakref/redirect_component1 //resistance + var/datum/weakref/redirect_component //resistance var/datum/weakref/redirect_component2 //say - var/distancelist = list(4,3,2,1.5,1,0.8,0.6,0.4,0.2) //Distance multipliers + var/distancelist = list(2,1.5,1,0.8,0.6,0.5,0.4,0.3,0.2) //Distance multipliers var/withdrawal = FALSE //withdrawl var/withdrawalTick = 0 //counts how long withdrawl is going on for var/list/customTriggers = list() //the list of custom triggers (maybe have to split into two) var/cooldown = 0 + var/cooldownMsg = TRUE -/datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M) +/datum/status_effect/chem/enthrall/on_apply() + var/mob/living/carbon/M = owner var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list enthrallID = E.creatorID enthrallGender = E.creatorGender - master = E.creator + master = get_mob_by_key(enthrallID) if(!E) message_admins("WARNING: No chem found in thrall!!!!") if(!master) message_admins("WARNING: No master! found in thrall!!!!") - if(M.key == enthrallID) + if(M.ckey == enthrallID) owner.remove_status_effect(src)//This shouldn't happen, but just in case - redirect_component1 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# + redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# //redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed //Might need to add redirect component for listening too. var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! mental_capacity = 500 - B.get_brain_damage() SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall) + return ..() -/datum/status_effect/chem/enthrall/tick(mob/living/carbon/M) - message_admins("Enthrall processing for [M]: ") +/datum/status_effect/chem/enthrall/tick() + //. = ..() //loop Please + var/mob/living/carbon/M = owner //chem calculations - if (owner.reagents.has_reagent("MKUltra")) + if (owner.reagents.has_reagent("enthrall")) if (phase >= 2) enthrallTally += phase else - if (phase < 3) - deltaResist += 5//If you've no chem, then you break out quickly + if (phase < 3 && phase != 0) + deltaResist += 2//If you've no chem, then you break out quickly if(prob(20)) to_chat(owner, "Your mind starts to restore some of it's clarity as you feel the effects of the drug wain.") if (mental_capacity <= 500 || phase == 4) @@ -216,9 +220,9 @@ mental_capacity += 10 //mindshield check - if(M.has_trait(TRAIT_MINDSHIELD)) - resistanceTally += 5 - if(prob(20)) + if(M.has_trait(TRAIT_MINDSHIELD))//If you manage to enrapture a head, wow, GJ. + resistanceTally += 2 + if(prob(10)) to_chat(owner, "You feel lucidity returning to your mind as the mindshield buzzes, attempting to return your brain to normal function.") //phase specific events @@ -226,42 +230,46 @@ if(-1)//fully removed SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall") owner.remove_status_effect(src) - else if(0)// sleeper agent + if(0)// sleeper agent return - else if(1)//Initial enthrallment + if(1)//Initial enthrallment if (enthrallTally > 100) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 - to_chat(owner, "Your conciousness slips, as you sink deeper into trance.") + to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") else if (resistanceTally > 100) enthrallTally *= 0.5 phase = -1 resistanceTally = 0 - to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") + to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) - to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so sexy and dominant, it feels right to obey them.")].") - else if (2) //partially enthralled + to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") + if (2) //partially enthralled if (enthrallTally > 150) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") - to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are much less likely to resort to violence, unless it is to defend your [enthrallGender]. Equally you are unable to commit suicide, even if ordered to, as you cannot server your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. + to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are much less likely to resort to violence, unless it is to defend your [enthrallGender]. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. else if (resistanceTally > 150) enthrallTally *= 0.5 phase -= 1 resistanceTally = 0 to_chat(owner, "You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [master].") //owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment, - else if (3)//fully entranced + if(prob(10)) + to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") + if (3)//fully entranced if (resistanceTally >= 250 && withdrawalTick >= 150) enthrallTally = 0 phase -= 1 resistanceTally = 0 to_chat(owner, "The separation from you [enthrallGender] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") - else if (4) //mindbroken + if(prob(2)) + to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] known's whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") + if (4) //mindbroken if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !owner.reagents.has_reagent("MKUltra")) phase = 2 mental_capacity = 500 @@ -283,6 +291,10 @@ M.hallucination = max(0, M.hallucination - 2) M.stuttering = max(0, M.stuttering - 2) M.jitteriness = max(0, M.jitteriness - 2) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") if(9 to INFINITY)//If withdrawal = TRUE @@ -290,37 +302,38 @@ if (withdrawal == TRUE)//Your minions are really REALLY needy. switch(withdrawalTick)//denial if(20 to 40)//Gives wiggle room, so you're not SUPER needy - if(prob(10)) + if(prob(5)) to_chat(owner, "You're starting to miss your [enthrallGender].") - if(prob(10)) + if(prob(5)) owner.adjustBrainLoss(0.5) - to_chat(owner, "They'll surely be back soon") //denial + to_chat(owner, "Master will surely be back soon") //denial if(41) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1) if(42 to 65)//barganing - if(prob(10)) + if(prob(5)) to_chat(owner, "They are coming back, right...?") owner.adjustBrainLoss(1) - if(prob(20)) + if(prob(5)) to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.") - owner.adjustBrainLoss(-2) + owner.adjustBrainLoss(-1) if(66) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") //Why does this not work? SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2) owner.stuttering += 20 owner.jitteriness += 20 if(67 to 90) //anger - if(prob(30)) + if(prob(10)) addtimer(CALLBACK(M, /mob/verb/a_intent_change, INTENT_HARM), 2) addtimer(CALLBACK(M, /mob/proc/click_random_mob), 2) to_chat(owner, "You suddenly lash out at the station in anger for it keeping you away from your [enthrallGender].") + owner.adjustBrainLoss(1) if(90) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") //Why does this not work? SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing3", /datum/mood_event/enthrallmissing3) to_chat(owner, "You need to find your [enthrallGender] at all costs, you can't hold yourself back anymore.") if(91 to 120)//depression if(prob(20)) - owner.adjustBrainLoss(1) + owner.adjustBrainLoss(2.5) owner.stuttering += 2 owner.jitteriness += 2 if(prob(25)) @@ -330,65 +343,64 @@ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4) to_chat(owner, "You can hardly find the strength to continue without your [enthrallGender].") if(120 to 140) //depression - if(prob(25)) - owner.SetStun(20, 0) + if(prob(15)) + owner.Stun(50) owner.emote("cry")//does this exist? to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.") - owner.adjustBrainLoss(2) + owner.adjustBrainLoss(5) owner.stuttering += 2 owner.jitteriness += 2 - if(prob(10)) + if(prob(5)) deltaResist += 5 if(140 to INFINITY) //acceptance - if(prob(20)) + if(prob(15)) deltaResist += 5 if(prob(20)) to_chat(owner, "Maybe you'll be okay without your [enthrallGender].") if(prob(10)) - owner.adjustBrainLoss(1) + owner.adjustBrainLoss(2) M.hallucination += 5 - withdrawalTick++ + withdrawalTick += 0.5 //Status subproc - statuses given to you from your Master //currently 3 statuses; antiresist -if you press resist, increases your enthrallment instead, HEAL - which slowly heals the pet, CHARGE - which breifly increases speed, PACIFY - makes pet a pacifist. if (!status == null) - switch(status) - if("Antiresist") - if (statusStrength == 0) - status = null - to_chat(owner, "You feel able to resist oncemore.") - else - statusStrength -= 1 - - else if("heal") - if (statusStrength == 0) - status = null - to_chat(owner, "You finish licking your wounds.") - else - statusStrength -= 1 - owner.heal_overall_damage(1, 1, 0, FALSE, FALSE) - cooldown += 1 //Cooldown doesn't process till status is done - - else if("charge") - owner.add_trait(TRAIT_GOTTAGOFAST, "MKUltra") - status = "charged" - to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") - - else if ("charged") - if (statusStrength == 0) - status = null - owner.remove_trait(TRAIT_GOTTAGOFAST, "MKUltra") - owner.Knockdown(30) - to_chat(owner, "Your body gives out as the adrenaline in your system runs out.") - else - statusStrength -= 1 - cooldown += 1 //Cooldown doesn't process till status is done - - else if ("pacify") - owner.add_trait(TRAIT_PACIFISM, "MKUltra") + if(status = "Antiresist") + if (statusStrength == 0) status = null + to_chat(owner, "You feel able to resist oncemore.") + else + statusStrength -= 1 + + else if(status = "heal") + if (statusStrength == 0) + status = null + to_chat(owner, "You finish licking your wounds.") + else + statusStrength -= 1 + owner.heal_overall_damage(1, 1, 0, FALSE, FALSE) + cooldown += 1 //Cooldown doesn't process till status is done + + else if(status = "charge") + owner.add_trait(TRAIT_GOTTAGOFAST, "MKUltra") + status = "charged" + to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") + + else if (status = "charged") + if (statusStrength == 0) + status = null + owner.remove_trait(TRAIT_GOTTAGOFAST, "MKUltra") + owner.Knockdown(30) + to_chat(owner, "Your body gives out as the adrenaline in your system runs out.") + else + statusStrength -= 1 + cooldown += 1 //Cooldown doesn't process till status is done + + else if (status = "pacify") + owner.add_trait(TRAIT_PACIFISM, "MKUltra") + status = null //Truth serum? //adrenals? @@ -400,17 +412,24 @@ deltaResist = 0 if (cooldown > 0) cooldown -= (1 + (mental_capacity/1000 )) - else - to_chat(master, "Your pet [owner.name] appears to have finished internalising your last command.") - ..() + cooldownMsg = FALSE + else if (cooldownMsg == FALSE) + to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") + cooldownMsg = TRUE + cooldown = 0 + //..() -//Check for proximity of master DONE -//Place triggerreacts here - create a dictionary of triggerword and effect. -//message enthrallID "name appears to have mentally processed their last command." - -/datum/status_effect/chem/enthrall/on_remove(mob/living/carbon/M) - qdel(redirect_component1.resolve()) - redirect_component1 = null +/datum/status_effect/chem/enthrall/on_remove() + var/mob/living/carbon/M = owner + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrallpraise") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrallscold") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") + qdel(redirect_component.resolve()) + redirect_component = null //qdel(redirect_component2.resolve()) //redirect_component2 = null @@ -421,15 +440,17 @@ else . = ..() */ - +//Doesn't work /datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) var/mob/living/carbon/C = owner + message_admins("[C] heard something!") for (var/trigger in customTriggers) if (trigger == message)//if trigger1 is the message + message_admins("[C] has been triggered with [trigger]!") //Speak (Forces player to talk) if (customTriggers[trigger][1] == "speak")//trigger2 - C.visible_message("Your mouth moves on it's own, before you can even catch it. Though you find yourself fully believing in the validity of what you just said and don't think to question it.") + C.visible_message("Your mouth moves on it's own, before you can even catch it. You find yourself fully believing in the validity of what you just said and don't think to question it.") (C.say(customTriggers[trigger][2]))//trigger3 @@ -477,13 +498,16 @@ /datum/status_effect/chem/enthrall/proc/owner_withdrawal(mob/living/carbon/M) //3 stages, each getting worse */ -/datum/status_effect/chem/enthrall/proc/owner_resist(mob/living/carbon/M) +/datum/status_effect/chem/enthrall/proc/owner_resist() + var/mob/living/carbon/M = owner + message_admins("Enthrall processing for [M]: enthrallTally: [enthrallTally], resistanceTally: [resistanceTally]") + message_admins("[M] is trying to resist!") if (status == "Sleeper" || phase == 0) return else if (phase == 4) to_chat(owner, "Your mind is too far gone to even entertain the thought of resisting.") return - else if (phase == 3 || withdrawal == FALSE) + else if (phase == 3 && withdrawal == FALSE) to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance.") return else if (status == "Antiresist")//If ordered to not resist; resisting while ordered to not makes it last longer, and increases the rate in which you are enthralled. @@ -497,15 +521,18 @@ if (deltaResist != 0)//So you can't spam it, you get one deltaResistance per tick. deltaResist += 0.1 //Though I commend your spamming efforts. return + else + deltaResist = 1 - if(prob(10)) + if(prob(5)) M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes + deltaResist *= 1.5 to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") //base resistance if (M.canbearoused) deltaResist*= ((100 - M.arousalloss/100)/100)//more aroused you are, the weaker resistance you can give else - deltaResist *= 0.2 + deltaResist *= 0.5 //chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist. if (owner.reagents.has_reagent("mannitol")) deltaResist *= 1.25 @@ -555,16 +582,21 @@ //If master gives you a collar, you get a sense of pride if(istype(M.wear_neck, /obj/item/clothing/neck/petcollar)) deltaResist *= 0.5 + if(M.has_trait(TRAIT_MINDSHIELD)) + deltaResist += 1 if(owner.has_trait(TRAIT_CROCRIN_IMMUNE) || !owner.canbearoused) deltaResist *= 0.75//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. if (deltaResist>0)//just in case deltaResist /= phase//later phases require more resistance + message_admins("[M] is trying to resist with a delta of [deltaResist]!") + return /datum/status_effect/chem/enthrall/proc/owner_say(message) //I can only hope this works //var/datum/status_effect/chem/enthrall/E = owner.has_status_effect(/datum/status_effect/chem/enthrall) //var/mob/living/master = E.master + message_admins("[owner] said something") var/static/regex/owner_words = regex("[master]") if(findtext(message, owner_words)) message = replacetext(lowertext(message), lowertext(master), "[enthrallGender]") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 050d1edeaf..ccb55e7f2f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -24,9 +24,10 @@ //return ..() //Called when reaction stops. #STOP_PROCESSING +/* /datum/reagent/fermi/proc/FermiFinish(datum/reagents/holder, multipler) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? return - +*/ //Called when added to a beaker without any of the reagent present. #add_reagent /datum/reagent/fermi/proc/FermiNew(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? return @@ -34,8 +35,9 @@ //This should process fermichems to find out how pure they are and what effect to do. //TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE /datum/reagent/fermi/on_mob_add(mob/living/carbon/M) + . = ..() if(!M) - return ..() + return message_admins("purity of chem is [purity]") if(src.purity < 0) CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") @@ -49,14 +51,16 @@ else //var/pureVol = volume * purity var/impureVol = volume * (1 - (volume * purity)) + message_admins("splitting [src] [volume] into [src.ImpureChem] [impureVol]") M.reagents.remove_reagent(src, (volume*impureVol), FALSE) M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) return - ..() /datum/reagent/fermi/on_merge(mob/living/carbon/M, amount, other_purity) + . = ..() if(!M) - return ..() + return + message_admins("purity of chem is [purity]") if(other_purity < 0) CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") if (other_purity == 1 || src.DoNotSplit == TRUE) @@ -69,10 +73,10 @@ else //var/pureVol = var/impureVol = amount * (1 - (amount * other_purity)) + message_admins("splitting [src] [volume] into [src.ImpureChem] [impureVol]") M.reagents.remove_reagent(src, impureVol, FALSE) M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) return - ..() @@ -1053,18 +1057,37 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses" overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please. DoNotSplit = TRUE - data// = list("creatorID" = null, "creatorGender" = null, "creatorName" = null) + data = list("creatorID" = null, "creatorGender" = null, "creatorName" = null) var/creatorID //ckey var/creatorGender var/creatorName var/mob/living/creator +/datum/reagent/fermi/enthrall/test + name = "MKUltraTest" + id = "enthrallTest" + description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it." + color = "#2C051A" // rgb: , 0, 255 + //ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth + //InverseChemVal = 0.25 + //InverseChem = "enthrall" //At really impure vols, it just becomes 100% inverse + data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Isabelle Foster") + creatorID = "honkatonkbramblesnatch"//ckey + creatorGender = "Mistress" + creatorName = "Isabelle Foster" + purity = 1 + +/datum/reagent/fermi/enthrall/test/on_new() + id = "enthrall" + ..() + creator = get_mob_by_key(creatorID) /datum/reagent/fermi/enthrall/on_new(list/data) message_admins("FermiNew for enthral proc'd") creatorID = data.["creatorID"] creatorGender = data.["creatorGender"] creatorName = data.["creatorName"] + creator = get_mob_by_key(creatorID) message_admins("name: [creatorName], ID: [creatorID], gender: [creatorGender]") /* var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list @@ -1077,33 +1100,21 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y creatorID = B.data.["ckey"] */ -/datum/reagent/fermi/enthrall/FermiFinish(datum/reagents/holder) - message_admins("On finish for enthral proc'd") - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list - if (B.data.["gender"] == "female") - E.data.["creatorGender"] = "Mistress" - else - E.data.["creatorGender"] = "Master" - E.data["creatorName"] = B.data.["real_name"] - E.data.["creatorID"] = B.data.["ckey"] - message_admins("name: [E.creatorName], ID: [E.creatorID], gender: [E.creatorGender]") - /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) . = ..() if(!creatorID) CRASH("Something went wrong in enthral creation") - message_admins("key: [M.key] vs [creatorID], ") + message_admins("key: [M.ckey] vs [creatorID], ") if(purity < 0.5)//Impure chems don't function as you expect return - else if(M.key == creatorID && creatorName == M.real_name) //same name AND same player - same instance of the player. (should work for clones?) + if((M.ckey == creatorID) && (creatorName == M.real_name)) //same name AND same player - same instance of the player. (should work for clones?) var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet - Vc.Remove(M) + if(Vc) + Vc.Remove(M) nVc.Insert(M) qdel(Vc) to_chat(M, "You feel your vocal chords tingle as your voice comes out in a more sultry tone.") - creator = M else M.apply_status_effect(/datum/status_effect/chem/enthrall) //var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) @@ -1116,8 +1127,10 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) + if (M.ckey == creatorID && creatorName == M.real_name) + return if(purity < 0.5)//Placeholder for now. I'd like to get this done. - if (M.key == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. + if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. if(M.has_status_effect(STATUS_EFFECT_INLOVE)) return var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers @@ -1139,6 +1152,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y return var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) if(!E) + M.reagents.remove_reagent(src.id, 10) + M.apply_status_effect(/datum/status_effect/chem/enthrall) CRASH("No enthrall status found in [M]!") E.enthrallTally += 1 M.adjustBrainLoss(0.1) @@ -1147,12 +1162,15 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I have no idea what happens if you OD yourself honestly. . = ..() M.add_trait(TRAIT_PACIFISM, "MKUltra") - var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + var/datum/status_effect/chem/enthrall/E if (!M.has_status_effect(/datum/status_effect/chem/enthrall)) + E = M.has_status_effect(/datum/status_effect/chem/enthrall) M.apply_status_effect(/datum/status_effect/chem/enthrall) E.enthrallID = creatorID E.enthrallGender = creatorGender E.master = creator + else + E = M.has_status_effect(/datum/status_effect/chem/enthrall) to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName].") M.slurring = 100 M.confused = 100 @@ -1392,14 +1410,14 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/fermiAcid/on_mob_life(mob/living/carbon/C, method) var/target = C.get_bodypart(BODY_ZONE_CHEST) - C.adjustFireLoss(1, 0) + var/acidstr = (5-C.reagents.pH) + C.adjustFireLoss(acidstr, 0) if(method==VAPOR) if(prob(20)) to_chat(C, "You can feel your lungs burning!") var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS) - L.adjustLungLoss(2) - C.apply_damage(1, BURN, target) - var/acidstr = (5-C.reagents.pH) + L.adjustLungLoss(acidstr) + C.apply_damage(acidstr/2, BURN, target) C.acid_act(acidstr, volume) ..() @@ -1418,3 +1436,32 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y var/acidstr = (5-holder.pH) T.acid_act(acidstr, volume) ..() + +/datum/reagent/fermi/fermiTest + name = "Fermis Test Reagent" + id = "fermiTest" + description = "You should be really careful with this...! Also, how did you get this?" + data = "Big bang" + +/datum/reagent/fermi/fermiTest/on_new() + var/location = get_turf(holder.my_atom) + if(purity < 0.34 || purity == 1) + var/datum/effect_system/foam_spread/s = new() + s.set_up(volume*2, location, holder) + s.start() + if((purity < 0.67 && purity >= 0.34)|| purity == 1) + var/datum/effect_system/smoke_spread/chem/s = new() + s.set_up(holder, volume*2, location) + s.start() + if(purity >= 0.67) + for (var/datum/reagent/reagent in holder.reagent_list) + if (istype(reagent, /datum/reagent/fermi)) + var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id] + Ferm.FermiExplode(src, holder.my_atom, holder, holder.total_volume, holder.chem_temp, holder.pH) + else + var/datum/chemical_reaction/Ferm = GLOB.chemical_reagents_list[reagent.id] + Ferm.on_reaction(holder, reagent.volume) + for(var/mob/M in viewers(8, location)) + to_chat(M, "The solution reacts dramatically, with a meow!") + playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) + holder.clear_reagents() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 95229f9745..7015087fc6 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -4,12 +4,18 @@ /datum/chemical_reaction/fermi/proc/FermiCreate(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? return +//Called when reaction STOP_PROCESSING +/datum/chemical_reaction/fermi/proc/FermiFinish(datum/reagents/holder, multipler) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? + return + //Called when temperature is above a certain threshold //....Is this too much? /datum/chemical_reaction/fermi/proc/FermiExplode(src, var/atom/my_atom, datum/reagents/holder, volume, temp, pH, Reaction, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? //var/Svol = volume if (Exploding == TRUE) return + if(!pH)//Dunno how things got here without a pH. + pH = 7 var/ImpureTot = 0 var/pHmod = 1 var/turf/T = get_turf(my_atom) @@ -119,6 +125,7 @@ S.real_name = "Living teratoma"//horrifying!! S.rabid = 1//Make them an angery boi, grr grr to_chat("The cells clump up into a horrifying tumour!") + holder.clear_reagents() /datum/chemical_reaction/fermi/BElarger name = "Sucubus milk" @@ -148,6 +155,7 @@ var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a pair of breasts!")//OwO + holder.clear_reagents() ..() /datum/chemical_reaction/fermi/PElarger //Vars needed @@ -179,6 +187,7 @@ var/list/seen = viewers(5, get_turf(holder)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a penis!")//OwO + holder.clear_reagents() ..() /datum/chemical_reaction/fermi/astral //Vars needed @@ -230,6 +239,24 @@ FermiExplode = TRUE PurityMin = 0.15 + + +/datum/chemical_reaction/fermi/enthrall/FermiFinish(datum/reagents/holder, var/atom/my_atom) + message_admins("On finish for enthral proc'd") + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list + var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list + if (B.data.["gender"] == "female") + E.data.["creatorGender"] = "Mistress" + E.creatorGender = "Mistress" + else + E.data.["creatorGender"] = "Master" + E.creatorGender = "Master" + E.data["creatorName"] = B.data.["real_name"] + E.creatorName = B.data.["real_name"] + E.data.["creatorID"] = B.data.["ckey"] + E.creatorID = B.data.["ckey"] + message_admins("name: [E.creatorName], ID: [E.creatorID], gender: [E.creatorGender]") + //Apprently works..?Negative /* /datum/chemical_reaction/fermi/enthrall/on_reaction(datum/reagents/holder) @@ -248,14 +275,14 @@ //var/enthrallID = B.get_blood_data() */ -/datum/chemical_reaction/fermi/enthrall/FermiExplode(src, var/atom/my_atom, volume, temp, pH, Reaction) - var/turf/T = get_turf(my_atom) - var/datum/reagents/R = new/datum/reagents(350) +/datum/chemical_reaction/fermi/enthrall/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) + var/turf/T = get_turf(holder) + var/datum/reagents/R = new/datum/reagents(1000) var/datum/effect_system/smoke_spread/chem/s = new() R.add_reagent("enthrallExplo", volume) s.set_up(R, volume, T) s.start() - my_atom.reagents.clear_reagents() + holder.clear_reagents() //..() //Please don't kill everyone too. /datum/chemical_reaction/fermi/hatmium @@ -287,6 +314,7 @@ var/list/seen = viewers(5, get_turf(holder.my_atom)) for(var/mob/M in seen) to_chat(M, "The makes an off sounding pop, as a hat suddenly climbs out of the beaker!") + holder.clear_reagents() ..() /datum/chemical_reaction/fermi/furranium //low temp and medium pH From 773431bb8d69f577a2506b8fb80a63171c44a495 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 20 May 2019 07:46:31 +0100 Subject: [PATCH 131/608] So close..! --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index ccb55e7f2f..8010179007 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1214,6 +1214,11 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y else SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") + if(prob(10)) + owner.Stun(10) + owner.emote("whimper")//does this exist? + to_chat(owner, "You're overcome with a desire to see [love].") + owner.adjustBrainLoss(5) ..() /datum/reagent/fermi/enthrallExplo/on_mob_delete(mob/living/carbon/M) From a9bc75fc0eb56f7313e99d9c1065d505e52f679d Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 21 May 2019 02:53:17 +0100 Subject: [PATCH 132/608] why do I even bother --- code/__DEFINES/components.dm | 7 +- code/datums/brain_damage/hypnosis.dm | 53 +++++++ code/datums/brain_damage/severe.dm | 18 ++- code/datums/status_effects/debuffs.dm | 54 ++++++++ .../browserassets/css/browserOutput.css | 16 +++ code/modules/mob/living/carbon/carbon.dm | 14 ++ code/modules/mob/living/carbon/say.dm | 1 + code/modules/mob/living/say.dm | 6 + code/modules/reagents/chemistry/holder.dm | 98 ++++++------- code/modules/spells/spell_types/shapeshift.dm | 5 +- code/modules/surgery/organs/lungs.dm | 9 +- code/modules/surgery/organs/vocal_cords.dm | 52 +++---- goon/browserassets/css/browserOutput.css | 18 ++- interface/stylesheet.dm | 15 ++ .../code/datums/status_effects/chems.dm | 131 ++++++++++-------- .../code/modules/arousal/organs/genitals.dm | 2 +- .../code/modules/arousal/organs/penis.dm | 16 ++- .../chemistry/reagents/fermi_reagents.dm | 70 +++++++--- .../reagents/chemistry/recipes/fermi.dm | 113 ++++++++------- .../modules/reagents/objects/fermiclothes.dm | 20 ++- tgstation.dme | 1 + 21 files changed, 483 insertions(+), 236 deletions(-) create mode 100644 code/datums/brain_damage/hypnosis.dm diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 8bcccbb02a..3d9e81e6c1 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -24,7 +24,7 @@ // start global signals with "!", this used to be necessary but now it's just a formatting choice #define COMSIG_GLOB_NEW_Z "!new_z" //from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args) #define COMSIG_GLOB_VAR_EDIT "!var_edit" //called after a successful var edit somewhere in the world: (list/args) - +#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special" //global living say plug - use sparingly: (mob/speaker , message) ////////////////////////////////////////////////////////////////// // /datum signals @@ -137,8 +137,9 @@ #define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) #define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage) #define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () -#define COMSIG_LIVING_SAY "say" //mob/living/say() - return COMSIG_I_FORGET_WHAT_TO_CALL_IT to interrupt before message sent. - #define COMPONENT_NO_SAY 1 // Here I am pretending to know what I'm doing. +//#define COMSIG_LIVING_SAY "say" //mob/living/say() - return COMSIG_I_FORGET_WHAT_TO_CALL_IT to interrupt before message sent. +// #define COMPONENT_NO_SAY 1 // Here I am pretending to know what I'm doing. +//#define // /mob/living/carbon signals diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm new file mode 100644 index 0000000000..d3ce57ca67 --- /dev/null +++ b/code/datums/brain_damage/hypnosis.dm @@ -0,0 +1,53 @@ +/datum/brain_trauma/hypnosis + name = "Hypnosis" + desc = "Patient's unconscious is completely enthralled by a word or sentence, focusing their thoughts and actions on it." + scan_desc = "looping thought pattern" + gain_text = "" + lose_text = "" + resilience = TRAUMA_RESILIENCE_SURGERY + + var/hypnotic_phrase = "" + var/regex/target_phrase + +/datum/brain_trauma/hypnosis/New(phrase) + if(!phrase) + qdel(src) + hypnotic_phrase = phrase + try + target_phrase = new("(\\b[hypnotic_phrase]\\b)","ig") + catch(var/exception/e) + stack_trace("[e] on [e.file]:[e.line]") + qdel(src) + ..() + +/datum/brain_trauma/hypnosis/on_gain() + message_admins("[ADMIN_LOOKUPFLW(owner)] was hypnotized with the phrase '[hypnotic_phrase]'.") + log_game("[key_name(owner)] was hypnotized with the phrase '[hypnotic_phrase]'.") + to_chat(owner, "[hypnotic_phrase]") + to_chat(owner, "[pick("You feel your thoughts focusing on this phrase... you can't seem to get it out of your head.",\ + "Your head hurts, but this is all you can think of. It must be vitally important.",\ + "You feel a part of your mind repeating this over and over. You need to follow these words.",\ + "Something about this sounds... right, for some reason. You feel like you should follow these words.",\ + "These words keep echoing in your mind. You find yourself completely fascinated by them.")]") + to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\ + as long as you act like the words are your highest priority.") + ..() + +/datum/brain_trauma/hypnosis/on_lose() + message_admins("[ADMIN_LOOKUPFLW(owner)] is no longer hypnotized with the phrase '[hypnotic_phrase]'.") + log_game("[key_name(owner)] is no longer hypnotized with the phrase '[hypnotic_phrase]'.") + to_chat(owner, "You suddenly snap out of your hypnosis. The phrase '[hypnotic_phrase]' no longer feels important to you.") + ..() + +/datum/brain_trauma/hypnosis/on_life() + ..() + if(prob(2)) + switch(rand(1,2)) + if(1) + to_chat(owner, "...[lowertext(hypnotic_phrase)]...") + if(2) + new /datum/hallucination/chat(owner, TRUE, FALSE, "[hypnotic_phrase]") + +/datum/brain_trauma/hypnosis/on_hear(message, speaker, message_language, raw_message, radio_freq) + message = target_phrase.Replace(message, "$1") + return message diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index a8adbfbce8..ebc6091d31 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -203,4 +203,20 @@ /datum/brain_trauma/severe/pacifism/on_lose() owner.remove_trait(TRAIT_PACIFISM, TRAUMA_TRAIT) - ..() \ No newline at end of file + ..() + +/datum/brain_trauma/severe/hypnotic_stupor + name = "Hypnotic Stupor" + desc = "Patient is prone to episodes of extreme stupor that leaves them extremely suggestible." + scan_desc = "oneiric feedback loop" + gain_text = "You feel somewhat dazed." + lose_text = "You feel like a fog was lifted from your mind." + +/datum/brain_trauma/severe/hypnotic_stupor/on_lose() //hypnosis must be cleared separately, but brain surgery should get rid of both anyway + ..() + owner.remove_status_effect(/datum/status_effect/trance) + +/datum/brain_trauma/severe/hypnotic_stupor/on_life() + ..() + if(prob(1) && !owner.has_status_effect(/datum/status_effect/trance)) + owner.apply_status_effect(/datum/status_effect/trance, rand(100,300), FALSE) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 1c77520108..ec8093b782 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -507,3 +507,57 @@ desc = "Your body is covered in blue ichor! You can't be revived by vitality matrices." icon_state = "ichorial_stain" alerttooltipstyle = "clockcult" + +/datum/status_effect/trance + id = "trance" + status_type = STATUS_EFFECT_UNIQUE + duration = 300 + tick_interval = 10 + examine_text = "SUBJECTPRONOUN seems slow and unfocused." + var/stun = TRUE + alert_type = /obj/screen/alert/status_effect/trance + +/obj/screen/alert/status_effect/trance + name = "Trance" + desc = "Everything feels so distant, and you can feel your thoughts forming loops inside your head..." + icon_state = "high" + +/datum/status_effect/trance/tick() + if(stun) + owner.Stun(60, TRUE, TRUE) + owner.dizziness = 20 + +/datum/status_effect/trance/on_apply() + if(!iscarbon(owner)) + return FALSE + RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize) + owner.add_trait(TRAIT_MUTE, "trance") + if(!owner.has_quirk(/datum/quirk/monochromatic)) + owner.add_client_colour(/datum/client_colour/monochrome) + owner.visible_message("[stun ? "[owner] stands still as [owner.p_their()] eyes seem to focus on a distant point." : ""]", \ + "[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")]") + return TRUE + +/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE) + duration = _duration + stun = _stun + return ..() + +/datum/status_effect/trance/on_remove() + UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) + owner.remove_trait(TRAIT_MUTE, "trance") + owner.dizziness = 0 + if(!owner.has_quirk(/datum/quirk/monochromatic)) + owner.remove_client_colour(/datum/client_colour/monochrome) + to_chat(owner, "You snap out of your trance!") + +/datum/status_effect/trance/proc/hypnotize(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + if(!owner.can_hear()) + return + if(speaker == owner) + return + var/mob/living/carbon/C = owner + C.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) //clear previous hypnosis + addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10) + addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it + qdel(src) diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 6466a47e42..edf8fca32d 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -393,6 +393,22 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 24px;} .clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;} +@keyframes hypnocolor { + 0% { color: #202020; } + 25% { color: #4b02ac; } + 50% { color: #9f41f1; } + 75% { color: #541c9c; } + 100% { color: #7adbf3; } +} + +.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;} +@keyframes phobia { + 0% { color: #f75a5a; } + 50% { color: #dd0000; } + 100% { color: #f75a5a; } +} + .icon {height: 1em; width: auto;} diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6ea876feac..1ce3420155 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -910,3 +910,17 @@ /mob/living/carbon/can_resist() return bodyparts.len > 2 && ..() + +/mob/living/carbon/proc/hypnosis_vulnerable()//unused atm, but added in case + if(src.has_trait(TRAIT_MINDSHIELD)) + return FALSE + if(hallucinating()) + return TRUE + if(IsSleeping()) + return TRUE + if(src.has_trait(TRAIT_DUMB)) + return TRUE + GET_COMPONENT_FROM(mood, /datum/component/mood, src) + if(mood) + if(mood.sanity < SANITY_UNSTABLE) + return TRUE diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index b966535a8f..42fdb36933 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -6,6 +6,7 @@ var/obj/item/organ/vocal_cords/Vc = getorganslot(ORGAN_SLOT_VOICE) if(Vc) if(Vc.name == "velvet chords" ) + ..() velvetspeech(message, src) var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 871e33349a..161544578d 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -205,6 +205,11 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(pressure < ONE_ATMOSPHERE*0.4) //Thin air, let's italicise the message spans |= SPAN_ITALICS + //global say component + //SEND_GLOBAL_SIGNAL(COMSIG_LIVING_SAY, src, message) + //if(SEND_SIGNAL(COMSIG_LIVING_SAY,src,message) == COMPONENT_NO_SAY) + // return + send_speech(message, message_range, src, bubble_type, spans, language, message_mode) if(succumbed) @@ -273,6 +278,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( AM.Hear(eavesrendered, src, message_language, eavesdropping, , spans, message_mode) else AM.Hear(rendered, src, message_language, message, , spans, message_mode) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message) //speech bubble var/list/speech_bubble_recipients = list() diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 521c27a838..8a101f5873 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -49,6 +49,7 @@ im var/atom/my_atom = null var/chem_temp = 150 var/pH = REAGENT_NORMAL_PH//This is definately 7, right? + var/overallPurity = 1 var/last_tick = 1 var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() @@ -355,17 +356,6 @@ im var/reaction_occurred = 0 // checks if reaction, binary variable var/continue_reacting = FALSE //Helps keep track what kind of reaction is occuring; standard or fermi. - //if(fermiIsReacting == TRUE) - /* if (reactedVol >= targetVol && targetVol != 0) - STOP_PROCESSING(SSprocessing, src) - fermiIsReacting = FALSE - message_admins("FermiChem processing stopped in reaction handler") - reaction_occurred = 1 - return - else - message_admins("FermiChem processing passed in reaction handler") - return - */ do //What does do do in byond? It sounds very redundant? is it a while loop? @@ -429,9 +419,6 @@ im if (chem_temp > C.ExplodeTemp)//Check to see if reaction is too hot! if (C.FermiExplode == TRUE) //To be added! - else - FermiExplode() - //explode function!! TODO: make plastic beakers melt at 447 kalvin, all others at ~850 and meta-material never break. */ @@ -472,11 +459,11 @@ im var/datum/chemical_reaction/C = selected_reaction if (C.FermiChem == TRUE && !continue_reacting) - message_admins("FermiChem Proc'd") + //message_admins("FermiChem Proc'd") for(var/P in selected_reaction.results) targetVol = cached_results[P]*multiplier - message_admins("FermiChem target volume: [targetVol]") + //message_admins("FermiChem target volume: [targetVol]") if ((chem_temp > C.OptimalTempMin) && (pH > (C.OptimalpHMin - C.ReactpHLim)) && (pH < (C.OptimalpHMax + C.ReactpHLim)))//To prevent pointless reactions //if (reactedVol < targetVol) @@ -486,7 +473,7 @@ im //reactedVol = FermiReact(selected_reaction, chem_temp, pH, multiplier, reactedVol, targetVol, cached_required_reagents, cached_results) //selected_reaction.on_reaction(src, my_atom, multiplier) START_PROCESSING(SSprocessing, src) - message_admins("FermiChem processing started") + //message_admins("FermiChem processing started") selected_reaction.on_reaction(src, my_atom, multiplier) fermiIsReacting = TRUE fermiReactID = selected_reaction @@ -496,7 +483,7 @@ im // STOP_PROCESSING(SSfastprocess, src) else if (chem_temp > C.ExplodeTemp) var/datum/chemical_reaction/fermi/Ferm = selected_reaction - Ferm.FermiExplode(src, my_atom, total_volume, chem_temp, pH) + Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH) return 0 else return 0 @@ -554,13 +541,13 @@ im var/multiplier = INFINITY //var/special_react_result = C.check_special_react(src) Only add if I add in the fermi-izer chem - message_admins("updating targetVol from [targetVol]") + //message_admins("updating targetVol from [targetVol]") for(var/B in cached_required_reagents) // multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) if (multiplier == 0) STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE - message_admins("FermiChem STOPPED due to reactant removal! Reacted vol: [reactedVol] of [targetVol]") + //message_admins("FermiChem STOPPED due to reactant removal! Reacted vol: [reactedVol] of [targetVol]") reactedVol = 0 targetVol = 0 handle_reactions() @@ -572,20 +559,20 @@ im for(var/P in cached_results) targetVol = cached_results[P]*multiplier - message_admins("to [targetVol]") + //message_admins("to [targetVol]") if (fermiIsReacting == FALSE) - message_admins("THIS SHOULD NEVER APPEAR!") + //message_admins("THIS SHOULD NEVER APPEAR!") CRASH("Fermi has refused to stop reacting even though we asked her nicely.") if (chem_temp > C.OptimalTempMin && fermiIsReacting == TRUE)//To prevent pointless reactions if (reactedVol < targetVol) reactedVol = FermiReact(fermiReactID, chem_temp, pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) - message_admins("FermiChem tick activated started, Reacted vol: [reactedVol] of [targetVol]") + //message_admins("FermiChem tick activated started, Reacted vol: [reactedVol] of [targetVol]") else STOP_PROCESSING(SSprocessing, src) fermiIsReacting = FALSE - message_admins("FermiChem STOPPED due to volume reached! Reacted vol: [reactedVol] of [targetVol]") + //message_admins("FermiChem STOPPED due to volume reached! Reacted vol: [reactedVol] of [targetVol]") reactedVol = 0 targetVol = 0 handle_reactions() @@ -596,7 +583,7 @@ im return else STOP_PROCESSING(SSprocessing, src) - message_admins("FermiChem STOPPED due to temperature! Reacted vol: [reactedVol] of [targetVol]") + //message_admins("FermiChem STOPPED due to temperature! Reacted vol: [reactedVol] of [targetVol]") fermiIsReacting = FALSE reactedVol = 0 targetVol = 0 @@ -619,28 +606,28 @@ im var/purity = 1 //var/tempVol = totalVol - message_admins("Loop beginning") + //message_admins("Loop beginning") //Begin Parse - + //update_holder_purity(C)//updates holder's purity //Check extremes first if (cached_temp > C.ExplodeTemp) //go to explode proc - message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [cached_temp]") + //message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [cached_temp]") C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) if (pH > 14) pH = 14 - message_admins("pH is lover limit, cur pH: [pH]") + //message_admins("pH is lover limit, cur pH: [pH]") else if (pH < 0) pH = 0 //Create chemical sludge eventually(for now just destroy the beaker I guess?) //TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions) - message_admins("pH is lover limit, cur pH: [pH]") + //message_admins("pH is lover limit, cur pH: [pH]") if ((purity < C.PurityMin) && (!C.PurityMin == 0))//If purity is below the min, blow it up. - C.FermiExplode(src, (reactedVol+targetVol), cached_temp, pH, C) + C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) //For now, purity is handled elsewhere @@ -664,10 +651,10 @@ im deltapH = 1 //This should never proc: else - message_admins("Fermichem's pH broke!! Please let Fermis know!!") + //message_admins("Fermichem's pH broke!! Please let Fermis know!!") WARNING("[my_atom] attempted to determine FermiChem pH for '[C.id]' which broke for some reason! ([usr])") //TODO Add CatalystFact - message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") + //message_admins("calculating pH factor(purity), pH: [pH], min: [C.OptimalpHMin]-[C.ReactpHLim], max: [C.OptimalpHMax]+[C.ReactpHLim], deltapH: [deltapH]") //Calculate DeltaT (Deviation of T from optimal) if (cached_temp < C.OptimalTempMax && cached_temp >= C.OptimalTempMin) @@ -676,61 +663,71 @@ im deltaT = 1 else deltaT = 0 - message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") + //message_admins("calculating temperature factor, min: [C.OptimalTempMin], max: [C.OptimalTempMax], Exponential: [C.CurveSharpT], deltaT: [deltaT]") stepChemAmmount = deltaT //used to have multipler, now it doesn't if (stepChemAmmount > C.RateUpLim) stepChemAmmount = C.RateUpLim else if (stepChemAmmount <= 0.01) - message_admins("stepChem underflow [stepChemAmmount]") + //message_admins("stepChem underflow [stepChemAmmount]") stepChemAmmount = 0.01 if ((reactedVol + stepChemAmmount) > targetVol) stepChemAmmount = targetVol - reactedVol - message_admins("target volume reached. Reaction should stop after this loop. stepChemAmmount: [stepChemAmmount] + reactedVol: [reactedVol] = targetVol [targetVol]") + //message_admins("target volume reached. Reaction should stop after this loop. stepChemAmmount: [stepChemAmmount] + reactedVol: [reactedVol] = targetVol [targetVol]") //if (reactedVol > 0) // purity = ((purity * reactedVol) + (deltapH * stepChemAmmount)) /((reactedVol+ stepChemAmmount)) //This should add the purity to the product //else - purity = deltapH//set purity equal to pH offset + purity = (deltapH)//set purity equal to pH offset + + //TODO: Check overall beaker purity with proc + //Then adjust purity of result AND yeild ammount with said purity. // End. /* for(var/B in cached_required_reagents) // tempVol = min(reactedVol, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) */ - message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]") + //message_admins("cached_results: [cached_results], reactedVol: [reactedVol], stepChemAmmount [stepChemAmmount]") for(var/B in cached_required_reagents) - message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]") + //message_admins("cached_required_reagents(B): [cached_required_reagents[B]], reactedVol: [reactedVol], base stepChemAmmount [stepChemAmmount]") remove_reagent(B, (stepChemAmmount * cached_required_reagents[B]), safety = 1)//safety? removes reagents from beaker using remove function. for(var/P in cached_results)//Not sure how this works, what is selected_reaction.results? //reactedVol = max(reactedVol, 1) //this shouldnt happen ... SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*stepChemAmmount, P)//log - add_reagent(P, cached_results[P]*stepChemAmmount, null, cached_temp, purity)//add reagent function!! I THINK I can do this: + add_reagent(P, cached_results[P]*(stepChemAmmount), null, cached_temp, purity)//add reagent function!! I THINK I can do this: + //Above should reduce yeild based on holder purity. C.FermiCreate(src) - message_admins("purity: [purity], purity of beaker") - message_admins("Temp before change: [chem_temp], pH after change: [pH]") + //message_admins("purity: [purity], purity of beaker") + //message_admins("Temp before change: [chem_temp], pH after change: [pH]") //Apply pH changes and thermal output of reaction to beaker chem_temp = round(cached_temp + (C.ThermicConstant * stepChemAmmount)) //Why won't you update!!! //adjust_thermal_energy((cached_temp*(C.ThermicConstant * stepChemAmmount *100)), 0, 1500) //(J, min_temp = 2.7, max_temp = 1000) pH += (C.HIonRelease * stepChemAmmount) - message_admins("Temp after change: [chem_temp], pH after change: [pH]") + //message_admins("Temp after change: [chem_temp], pH after change: [pH]") reactedVol = reactedVol + stepChemAmmount return (reactedVol) -/* MOVED TO REAGENTS.DM -/datum/reagents/proc/FermiExplode() - return -*/ + +/datum/reagents/proc/update_holder_purity(var/datum/chemical_reaction/fermi/C) + var/list/cached_reagents = reagent_list + var/i + var/cachedPurity + //var/fermiChem + for(var/reagent in C.required_reagents) + cachedPurity += cached_reagents[reagent].purity + i++ + overallPurity = cachedPurity/i /datum/reagents/proc/isolate_reagent(reagent) var/list/cached_reagents = reagent_list @@ -877,11 +874,8 @@ im //WIP_TAG //check my maths for purity calculations //Add amount and equalize purity R.volume += amount - //Maybe make a pH for reagents, not sure. it's hard to imagine where the H+ ions would go. I'm okay with this solution for now. - //R.purity = (our_pure_moles + their_pure_moles) / (R.volume) - message_admins("Purity before addition: [R.purity], vol:[R.volume]. Adding [other_purity], vol: [amount]") R.purity = ((R.purity * R.volume) + (other_purity * amount)) /((R.volume + amount)) //This should add the purity to the product - message_admins("Purity after [R.purity]") + update_total() if(my_atom) @@ -918,7 +912,7 @@ im if(!no_react) handle_reactions() if(isliving(my_atom)) - R.on_mob_add(my_atom) + R.on_mob_add(my_atom, amount) return TRUE diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index 88c6ce175f..14ff377523 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -16,8 +16,9 @@ var/convert_damage = FALSE //If you want to convert the caster's health to the shift, and vice versa. var/convert_damage_type = BRUTE //Since simplemobs don't have advanced damagetypes, what to convert damage back into. - var/shapeshift_type + var/shapeshift_type //Incase I ever get lucky enough to be a wizard. Also why can you be a dog but not a cat!! Racist var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\ + /mob/living/simple_animal/pet/cat,\ /mob/living/simple_animal/pet/dog/corgi,\ /mob/living/simple_animal/hostile/carp/ranged/chaos,\ /mob/living/simple_animal/bot/ed209,\ @@ -167,4 +168,4 @@ /datum/soullink/shapeshift/sharerDies(gibbed, mob/living/sharer) if(source) - source.shapeDeath(gibbed) \ No newline at end of file + source.shapeDeath(gibbed) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index c402ad5f09..cc33188a26 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -87,6 +87,7 @@ M.Dizzy(1) /obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) +//TODO: add lung damage = less oxygen gains if((H.status_flags & GODMODE)) return if(H.has_trait(TRAIT_NOBREATH)) @@ -157,7 +158,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5*((damage/maxHealth)/2)) //More damaged lungs = slower oxy rate up to a factor of half + H.adjustOxyLoss(-5) //More damaged lungs = slower oxy rate up to a factor of half gas_breathed = breath_gases[/datum/gas/oxygen][MOLES] H.clear_alert("not_enough_oxy") @@ -186,7 +187,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5*((damage/maxHealth)/2)) + H.adjustOxyLoss(-5) gas_breathed = breath_gases[/datum/gas/nitrogen][MOLES] H.clear_alert("nitro") @@ -223,7 +224,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5*((damage/maxHealth)/2)) + H.adjustOxyLoss(-5) gas_breathed = breath_gases[/datum/gas/carbon_dioxide][MOLES] H.clear_alert("not_enough_co2") @@ -253,7 +254,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5*((damage/maxHealth)/2)) + H.adjustOxyLoss(-5) gas_breathed = breath_gases[/datum/gas/plasma][MOLES] H.clear_alert("not_enough_tox") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 037df6ee33..1fca8123c2 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -670,7 +670,7 @@ ///////////FermiChem////////////////// ////////////////////////////////////// //Removed span_list from input arguments. //mob/living/user -/proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE, debug = TRUE) +/proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE, debug = FALSE) message_admins("Velvet speech proc'd on [user]") var/cooldown = 0 @@ -703,7 +703,7 @@ if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) continue var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)//Check to see if pet is on cooldown from last command - if (E.cooldown >= 0)//If they're on cooldown you can't give them more commands. + if (E.cooldown > 0)//If they're on cooldown you can't give them more commands. continue listeners += L if(debug == TRUE) @@ -812,7 +812,7 @@ //phase 3 var/static/regex/statecustom_words = regex("state triggers|state your triggers") var/static/regex/custom_words = regex("new trigger|listen to me") - var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|objective")//What a descriptive name! + var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|trance")//What a descriptive name! var/static/regex/objective_words = regex("new objective|obey this command|unable to resist|compulsed") var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die") var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") @@ -827,6 +827,8 @@ //enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words + //CALLBACKS ARE USED FOR MESSAGES BECAUSE SAY IS HANDLED AFTER THE PROCESSING. + //Tier 1 //ENTHRAL mixable if(findtext(message, enthral_words)) @@ -876,7 +878,7 @@ if((findtext(message, saymyname_words))) for(var/V in listeners) var/mob/living/carbon/C = V - C.remove_trait(TRAIT_MUTE, TRAUMA_TRAIT) + C.remove_trait(TRAIT_MUTE, "enthrall") addtimer(CALLBACK(C, /atom/movable/proc/say, "Master"), 5)//When I figure out how to do genedered names put them here //WAKE UP @@ -889,7 +891,7 @@ if(0) E.phase = 3 E.status = null - addtimer(CALLBACK(L, /atom/movable/proc/to_chat, "The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve."), 5) + addtimer(CALLBACK(L, /proc/to_chat, "The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve."), 5) //to_chat(L, ) @@ -900,7 +902,7 @@ var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, C)+1] if (E.phase == 3) //If target is fully enthralled, - C.add_trait(TRAIT_MUTE, TRAUMA_TRAIT) + C.add_trait(TRAIT_MUTE, "enthrall") else C.silent += ((10 * power_multiplier) * E.phase) E.cooldown += 3 @@ -933,11 +935,12 @@ else if((findtext(message, forget_words))) for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) - C.Sleeping(50) to_chat(C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!") + C.Sleeping(50) switch(E.phase) if(1 to 2) E.phase = -1 + to_chat(C, "You have no recollection of being enthralled by [E.master]") if(3) E.phase = 0 E.cooldown = 0 @@ -951,22 +954,6 @@ E.cooldown += 3 - //ORGASM - else if((findtext(message, orgasm_words))) - for(var/V in listeners) - var/mob/living/carbon/human/H = V - var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) - if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure - H.mob_climax(forced_climax=TRUE) - H.setArousalLoss(H.min_arousal) - E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). - E.enthrallTally += power_multiplier - else - E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). - E.enthrallTally += power_multiplier*1.1 - to_chat(H, "Your Masters command whites out your mind in bliss!") - E.cooldown += 6 - //teir 2 @@ -976,7 +963,7 @@ var/mob/living/carbon/human/H = V var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase > 1) - if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure + if(H.canbearoused) // probably a redundant check but for good measure H.mob_climax(forced_climax=TRUE) H.setArousalLoss(H.min_arousal) E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). @@ -1007,7 +994,7 @@ if(2 to INFINITY) var/mob/living/M = V playsound(get_turf(M), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) - H.emote(H,"lets out a nya!") + M.emote(M,"lets out a nya!") E.cooldown += 1 //SLEEP @@ -1072,10 +1059,10 @@ for(var/V in listeners) var/speaktrigger = "" var/mob/living/L = V - var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) - if (!E.customTriggers == list())//i.e. if it's not empty - for (var/trigger in E.customTriggers) - speaktrigger = "[trigger]\n" + var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)//i.e. if it's not empty + for (var/trigger in E.customTriggers) + speaktrigger = "[trigger]\n" + if(!speaktrigger == "") L.say(speaktrigger) //CUSTOM TRIGGERS @@ -1085,7 +1072,7 @@ var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase == 3) if (get_dist(user, H) > 1)//Requires user to be next to their pet. - to_chat(H, "You need to be next to your pet to give them a new trigger!") + to_chat(user, "You need to be next to your pet to give them a new trigger!") return else if (E.mental_capacity >= 10) @@ -1110,7 +1097,7 @@ var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase == 3) if (get_dist(user, H) > 1)//Requires user to be next to their pet. - to_chat(H, "You need to be next to your pet to give them a new objective!") + to_chat(user, "You need to be next to your pet to give them a new objective!") return else user.emote(user, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") @@ -1310,7 +1297,8 @@ addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i) i++ */ - + else + return if(message_admins) message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") log_game("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index 820537e32b..c709381299 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -346,6 +346,22 @@ em {font-style: normal; font-weight: bold;} .greentext {color: #00FF00; font-size: 3;} .redtext {color: #FF0000; font-size: 3;} .clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} +.hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;} +@keyframes hypnocolor { + 0% { color: #202020; } + 25% { color: #4b02ac; } + 50% { color: #9f41f1; } + 75% { color: #541c9c; } + 100% { color: #7adbf3; } +} + +.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;} +@keyframes phobia { + 0% { color: #f75a5a; } + 50% { color: #dd0000; } + 100% { color: #f75a5a; } +} + big img.icon {width: 32px; height: 32px;} @@ -359,4 +375,4 @@ big img.icon {width: 32px; height: 32px;} /* HELPER CLASSES */ .text-normal {font-weight: normal; font-style: normal;} -.hidden {display: none; visibility: hidden;} \ No newline at end of file +.hidden {display: none; visibility: hidden;} diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index cdf6df2dab..b7c8dbc19e 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -153,6 +153,21 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 3;} .clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.hypnophrase {color: #3bb5d3; font-weight: bold; animation: hypnocolor 1500ms infinite;} +@keyframes hypnocolor { + 0% { color: #0d0d0d; } + 25% { color: #410194; } + 50% { color: #7f17d8; } + 75% { color: #410194; } + 100% { color: #3bb5d3; } +} + +.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;} + @keyframes phobia { + 0% { color: #0d0d0d; } + 50% { color: #dd0000; } + 100% { color: #0d0d0d; } +} .icon {height: 1em; width: auto;} diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 01f09dda15..6127f82a03 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -172,7 +172,8 @@ //var/mental_cost //Current cost of custom triggers //var/mindbroken = FALSE //Not sure I use this, replaced with phase 4 var/datum/weakref/redirect_component //resistance - var/datum/weakref/redirect_component2 //say + //var/datum/weakref/redirect_component2 //say + //var/datum/weakref/redirect_component3 //hear var/distancelist = list(2,1.5,1,0.8,0.6,0.5,0.4,0.3,0.2) //Distance multipliers var/withdrawal = FALSE //withdrawl var/withdrawalTick = 0 //counts how long withdrawl is going on for @@ -194,6 +195,9 @@ owner.remove_status_effect(src)//This shouldn't happen, but just in case redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# //redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed + //redirect_component3 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_HEAR = CALLBACK(src, .proc/owner_hear)))) //Do resistance calc if resist is pressed + RegisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL, .proc/owner_say) + RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear) //Might need to add redirect component for listening too. var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! mental_capacity = 500 - B.get_brain_damage() @@ -221,7 +225,7 @@ //mindshield check if(M.has_trait(TRAIT_MINDSHIELD))//If you manage to enrapture a head, wow, GJ. - resistanceTally += 2 + resistanceTally += 5 if(prob(10)) to_chat(owner, "You feel lucidity returning to your mind as the mindshield buzzes, attempting to return your brain to normal function.") @@ -236,23 +240,26 @@ if (enthrallTally > 100) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. + resistanceTally /= 2 enthrallTally = 0 - to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") + to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") else if (resistanceTally > 100) enthrallTally *= 0.5 phase = -1 resistanceTally = 0 to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") + to_chat(owner, "You're now free of [master]'s influence, and fully independant oncemore.'") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) - to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") + to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") if (2) //partially enthralled if (enthrallTally > 150) phase += 1 mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 + resistanceTally /= 2 to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") - to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are much less likely to resort to violence, unless it is to defend your [enthrallGender]. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. + to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are much less likely to resort to violence, unless it is to defend your [enthrallGender]. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. else if (resistanceTally > 150) enthrallTally *= 0.5 phase -= 1 @@ -260,15 +267,15 @@ to_chat(owner, "You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [master].") //owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment, if(prob(10)) - to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") + to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (3)//fully entranced - if (resistanceTally >= 250 && withdrawalTick >= 150) + if (resistanceTally >= 200 && withdrawalTick >= 150) enthrallTally = 0 phase -= 1 resistanceTally = 0 to_chat(owner, "The separation from you [enthrallGender] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") - if(prob(2)) - to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] known's whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") + if(prob(3)) + to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !owner.reagents.has_reagent("MKUltra")) phase = 2 @@ -284,7 +291,8 @@ //distance calculations switch(get_dist(master, owner)) if(0 to 8)//If the enchanter is within range, increase enthrallTally, remove withdrawal subproc and undo withdrawal effects. - enthrallTally += distancelist[get_dist(master, owner)+1] + if(phase <= 2) + enthrallTally += distancelist[get_dist(master, owner)+1] withdrawal = FALSE if(withdrawalTick > 0) withdrawalTick -= 2 @@ -301,31 +309,31 @@ //Withdrawal subproc: if (withdrawal == TRUE)//Your minions are really REALLY needy. switch(withdrawalTick)//denial - if(20 to 40)//Gives wiggle room, so you're not SUPER needy + if(10 to 35)//Gives wiggle room, so you're not SUPER needy if(prob(5)) - to_chat(owner, "You're starting to miss your [enthrallGender].") + to_chat(owner, "You're starting to miss your [enthrallGender].") if(prob(5)) owner.adjustBrainLoss(0.5) - to_chat(owner, "Master will surely be back soon") //denial - if(41) + to_chat(owner, "Master will surely be back soon") //denial + if(36) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1) - if(42 to 65)//barganing - if(prob(5)) - to_chat(owner, "They are coming back, right...?") + if(37 to 65)//barganing + if(prob(10)) + to_chat(owner, "They are coming back, right...?") owner.adjustBrainLoss(1) - if(prob(5)) - to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.") + if(prob(10)) + to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.") owner.adjustBrainLoss(-1) if(66) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") //Why does this not work? SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2) - owner.stuttering += 20 - owner.jitteriness += 20 + owner.stuttering += 200 + owner.jitteriness += 200 if(67 to 90) //anger if(prob(10)) addtimer(CALLBACK(M, /mob/verb/a_intent_change, INTENT_HARM), 2) addtimer(CALLBACK(M, /mob/proc/click_random_mob), 2) - to_chat(owner, "You suddenly lash out at the station in anger for it keeping you away from your [enthrallGender].") + to_chat(owner, "You are overwhelmed with anger at the lack of [enthrallGender]'s presence and suddenly lash out!") owner.adjustBrainLoss(1) if(90) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") //Why does this not work? @@ -334,10 +342,10 @@ if(91 to 120)//depression if(prob(20)) owner.adjustBrainLoss(2.5) - owner.stuttering += 2 - owner.jitteriness += 2 + owner.stuttering += 20 + owner.jitteriness += 20 if(prob(25)) - M.hallucination += 2 + M.hallucination += 20 if(121) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4) @@ -348,34 +356,34 @@ owner.emote("cry")//does this exist? to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.") owner.adjustBrainLoss(5) - owner.stuttering += 2 - owner.jitteriness += 2 + owner.stuttering += 20 + owner.jitteriness += 20 if(prob(5)) deltaResist += 5 if(140 to INFINITY) //acceptance if(prob(15)) deltaResist += 5 if(prob(20)) - to_chat(owner, "Maybe you'll be okay without your [enthrallGender].") + to_chat(owner, "Maybe you'll be okay without your [enthrallGender].") if(prob(10)) owner.adjustBrainLoss(2) - M.hallucination += 5 + M.hallucination += 50 withdrawalTick += 0.5 //Status subproc - statuses given to you from your Master //currently 3 statuses; antiresist -if you press resist, increases your enthrallment instead, HEAL - which slowly heals the pet, CHARGE - which breifly increases speed, PACIFY - makes pet a pacifist. - if (!status == null) + if (status) - if(status = "Antiresist") - if (statusStrength == 0) + if(status == "Antiresist") + if (statusStrength < 0) status = null to_chat(owner, "You feel able to resist oncemore.") else statusStrength -= 1 - else if(status = "heal") - if (statusStrength == 0) + else if(status == "heal") + if (statusStrength < 0) status = null to_chat(owner, "You finish licking your wounds.") else @@ -383,13 +391,13 @@ owner.heal_overall_damage(1, 1, 0, FALSE, FALSE) cooldown += 1 //Cooldown doesn't process till status is done - else if(status = "charge") + else if(status == "charge") owner.add_trait(TRAIT_GOTTAGOFAST, "MKUltra") status = "charged" to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") - else if (status = "charged") - if (statusStrength == 0) + else if (status == "charged") + if (statusStrength < 0) status = null owner.remove_trait(TRAIT_GOTTAGOFAST, "MKUltra") owner.Knockdown(30) @@ -398,7 +406,7 @@ statusStrength -= 1 cooldown += 1 //Cooldown doesn't process till status is done - else if (status = "pacify") + else if (status == "pacify") owner.add_trait(TRAIT_PACIFISM, "MKUltra") status = null @@ -432,6 +440,10 @@ redirect_component = null //qdel(redirect_component2.resolve()) //redirect_component2 = null + UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) + UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) + //qdel(redirect_component3.resolve()) + //redirect_component3 = null /* /datum/status_effect/chem/enthrall/mob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) @@ -441,34 +453,37 @@ . = ..() */ //Doesn't work -/datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + +/datum/status_effect/chem/enthrall/proc/owner_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) var/mob/living/carbon/C = owner - message_admins("[C] heard something!") + //message_admins("[C] heard something!") for (var/trigger in customTriggers) - if (trigger == message)//if trigger1 is the message + //cached_trigger = lowertext(trigger) + message_admins("[C] heard something: [message] vs [trigger] vs [raw_message]") + if ("[trigger]" == raw_message)//if trigger1 is the message message_admins("[C] has been triggered with [trigger]!") //Speak (Forces player to talk) - if (customTriggers[trigger][1] == "speak")//trigger2 - C.visible_message("Your mouth moves on it's own, before you can even catch it. You find yourself fully believing in the validity of what you just said and don't think to question it.") + if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2 + to_chat(C, "Your mouth moves on it's own, before you can even catch it. You find yourself fully believing in the validity of what you just said and don't think to question it.") (C.say(customTriggers[trigger][2]))//trigger3 //Echo (repeats message!) - else if (customTriggers[trigger][1] == "echo")//trigger2 - (to_chat(owner, customTriggers[trigger][2]))//trigger3 + else if (lowertext(customTriggers[trigger][1]) == "echo")//trigger2 + (to_chat(owner, "[customTriggers[trigger][2]]"))//trigger3 //Shocking truth! - else if (customTriggers[trigger] == "shock") + else if (lowertext(customTriggers[trigger]) == "shock") if (C.canbearoused) C.electrocute_act(10, src, 1, FALSE, FALSE, FALSE, TRUE)//I've no idea how strong this is C.adjustArousalLoss(5) - to_chat(owner, "Your muscles seize up, then start spasming wildy!") + to_chat(owner, "Your muscles seize up, then start spasming wildy!") else C.electrocute_act(15, src, 1, FALSE, FALSE, FALSE, TRUE)//To make up for the lack of effect //wah intensifies - else if (customTriggers[trigger][1] == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa if (C.canbearoused) if (C.getArousalLoss() > 80) C.mob_climax(forced_climax=TRUE) @@ -478,17 +493,22 @@ C.throw_at(get_step_towards(speaker,C), 3, 1) //cut this if it's too hard to get working //kneel (knockdown) - else if (customTriggers[trigger][1] == "kneel")//as close to kneeling as you can get, I suppose. + else if (lowertext(customTriggers[trigger]) == "kneel")//as close to kneeling as you can get, I suppose. C.Knockdown(20) //strip (some) clothes - else if (customTriggers[trigger][1] == "strip")//This wasn't meant to just be a lewd thing oops + else if (customTriggers[trigger] == "strip")//This wasn't meant to just be a lewd thing oops var/mob/living/carbon/human/o = owner var/items = o.get_contents() for(var/obj/item/W in items) if(W == o.w_uniform || W == o.wear_suit) o.dropItemToGround(W, TRUE) - C.visible_message("You feel compelled to strip your clothes.") + C.visible_message("You feel compelled to strip your clothes.") + + //trance + else if (customTriggers[trigger] == "trance") + var/mob/living/carbon/human/o = owner + o.apply_status_effect(/datum/status_effect/trance, 200, TRUE) //add more fun stuff! @@ -505,14 +525,14 @@ if (status == "Sleeper" || phase == 0) return else if (phase == 4) - to_chat(owner, "Your mind is too far gone to even entertain the thought of resisting.") + to_chat(owner, "Your mind is too far gone to even entertain the thought of resisting.") return else if (phase == 3 && withdrawal == FALSE) - to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance.") + to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance.") return else if (status == "Antiresist")//If ordered to not resist; resisting while ordered to not makes it last longer, and increases the rate in which you are enthralled. if (statusStrength > 0) - to_chat(owner, "The order from your [enthrallGender] to give in is conflicting with your attempt to resist, drawing you deeper into trance.") + to_chat(owner, "The order from your [enthrallGender] to give in is conflicting with your attempt to resist, drawing you deeper into trance.") statusStrength += 1 enthrallTally += 1 return @@ -593,7 +613,8 @@ message_admins("[M] is trying to resist with a delta of [deltaResist]!") return -/datum/status_effect/chem/enthrall/proc/owner_say(message) //I can only hope this works +/datum/status_effect/chem/enthrall/proc/owner_say(mob/speaker, message) //I can only hope this works + //var/datum/status_effect/chem/enthrall/E = owner.has_status_effect(/datum/status_effect/chem/enthrall) //var/mob/living/master = E.master message_admins("[owner] said something") diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 7c6cc74392..2daaeb1502 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -273,7 +273,7 @@ //H.update_body() /datum/species/proc/handle_genitals(mob/living/carbon/human/H) - message_admins("attempting to update sprite") + //message_admins("attempting to update sprite") if(!H)//no args CRASH("H = null") if(!LAZYLEN(H.internal_organs))//if they have no organs, we're done diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index f68c31909e..bd7331337d 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -21,6 +21,10 @@ var/statuscheck = FALSE var/prev_size = 6 +/obj/item/organ/genital/penis/Initialize() + . = ..() + prev_size = length + cached_length = length /obj/item/organ/genital/penis/update_size() var/mob/living/carbon/human/o = owner @@ -33,32 +37,32 @@ length = cached_length size = 1 if(statuscheck == TRUE) - message_admins("Attempting to remove.") + //message_admins("Attempting to remove.") o.remove_status_effect(/datum/status_effect/chem/PElarger) statuscheck = FALSE if(5 to 8) //If modest size length = cached_length size = 2 if(statuscheck == TRUE) - message_admins("Attempting to remove.") + //message_admins("Attempting to remove.") o.remove_status_effect(/datum/status_effect/chem/PElarger) statuscheck = FALSE if(9 to INFINITY) //If massive length = cached_length size = 3 //no new sprites for anything larger yet if(statuscheck == FALSE) - message_admins("Attempting to apply.") + //message_admins("Attempting to apply.") o.remove_status_effect(/datum/status_effect/chem/PElarger) statuscheck = TRUE if(15 to INFINITY) length = cached_length size = 3 //no new sprites for anything larger yet if(statuscheck == FALSE) - message_admins("Attempting to apply.") + //message_admins("Attempting to apply.") o.apply_status_effect(/datum/status_effect/chem/PElarger) statuscheck = TRUE - message_admins("Pinas size: [size], [cached_length], [o]") - message_admins("2. size vs prev_size") + //message_admins("Pinas size: [size], [cached_length], [o]") + //message_admins("2. size vs prev_size") if (round(length) > round(prev_size)) to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(length)] inch penis.") else if (round(length) < round(prev_size)) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 8010179007..4444251243 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -14,8 +14,8 @@ id = "fermi" //It's meeee taste_description = "If affection had a taste, this would be it." var/ImpureChem = "toxin" // What chemical is metabolised with an inpure reaction - var/InverseChemVal = 0 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising - var/InverseChem = "Initropidril" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. + var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising + var/InverseChem = "toxin" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. var/DoNotSplit = FALSE // If impurity is handled within the main chem itself ///datum/reagent/fermi/on_mob_life(mob/living/carbon/M) @@ -34,7 +34,7 @@ //This should process fermichems to find out how pure they are and what effect to do. //TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE -/datum/reagent/fermi/on_mob_add(mob/living/carbon/M) +/datum/reagent/fermi/on_mob_add(mob/living/carbon/M, amount) . = ..() if(!M) return @@ -44,15 +44,15 @@ if (src.purity == 1 || src.DoNotSplit == TRUE) return else if (src.InverseChemVal > src.purity) - M.reagents.remove_reagent(src, volume, FALSE) - M.reagents.add_reagent(src.InverseChem, volume, FALSE, other_purity = 1) + M.reagents.remove_reagent(src.id, amount, FALSE) + M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1) message_admins("all convered to [src.InverseChem]") return else - //var/pureVol = volume * purity - var/impureVol = volume * (1 - (volume * purity)) - message_admins("splitting [src] [volume] into [src.ImpureChem] [impureVol]") - M.reagents.remove_reagent(src, (volume*impureVol), FALSE) + //var/pureVol = amount * purity + var/impureVol = amount * (1 - purity) + message_admins("splitting [src.id] [amount] into [src.ImpureChem] [impureVol]") + M.reagents.remove_reagent(src.id, (impureVol), FALSE) M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) return @@ -66,15 +66,15 @@ if (other_purity == 1 || src.DoNotSplit == TRUE) return else if (src.InverseChemVal > other_purity) - M.reagents.remove_reagent(src, amount, FALSE) + M.reagents.remove_reagent(src.id, amount, FALSE) M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1) message_admins("all convered to [src.InverseChem]") return else //var/pureVol = - var/impureVol = amount * (1 - (amount * other_purity)) - message_admins("splitting [src] [volume] into [src.ImpureChem] [impureVol]") - M.reagents.remove_reagent(src, impureVol, FALSE) + var/impureVol = amount * (1 - other_purity) + message_admins("splitting [src] [amount] into [src.ImpureChem] [impureVol]") + M.reagents.remove_reagent(src.id, impureVol, FALSE) M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) return @@ -111,7 +111,7 @@ taste_description = "wiggly cosmic dust." color = "#5020H4" // rgb: 50, 20, 255 overdose_threshold = 15 - addiction_threshold = 20 + addiction_threshold = 15 metabolization_rate = 0.5 * REAGENTS_METABOLISM addiction_stage2_end = 30 addiction_stage3_end = 40 @@ -525,7 +525,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/startHunger /datum/reagent/fermi/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. - message_admins("SGZF ingested") + //message_admins("SGZF ingested") switch(current_cycle)//Pretends to be normal if(20) to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") @@ -577,7 +577,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") if(87 to INFINITY)//purges chemical fast, producing a "slime" for each one. Said slime is weak to fire. TODO: turn tumour slime into real variant. M.adjustToxLoss(1, 0) - message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") + //message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 20") ..() //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -821,6 +821,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason var/mob/living/simple_animal/hostile/retaliate/ghost/G = null var/antiGenetics = 255 var/sleepytime = 0 + InverseChemVal = 0.25 //var/Svol = volume /datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment! @@ -1215,10 +1216,10 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") if(prob(10)) - owner.Stun(10) - owner.emote("whimper")//does this exist? - to_chat(owner, "You're overcome with a desire to see [love].") - owner.adjustBrainLoss(5) + M.Stun(10) + M.emote("whimper")//does this exist? + to_chat(M, "You're overcome with a desire to see [love].") + M.adjustBrainLoss(5) ..() /datum/reagent/fermi/enthrallExplo/on_mob_delete(mob/living/carbon/M) @@ -1446,9 +1447,36 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y name = "Fermis Test Reagent" id = "fermiTest" description = "You should be really careful with this...! Also, how did you get this?" - data = "Big bang" + data = list("Big bang" = 1, "please work" = 2) /datum/reagent/fermi/fermiTest/on_new() + ..() + message_admins("FermiTest addition!") + var/location = get_turf(holder.my_atom) + if(purity < 0.34 || purity == 1) + var/datum/effect_system/foam_spread/s = new() + s.set_up(volume*2, location, holder) + s.start() + if((purity < 0.67 && purity >= 0.34)|| purity == 1) + var/datum/effect_system/smoke_spread/chem/s = new() + s.set_up(holder, volume*2, location) + s.start() + if(purity >= 0.67) + for (var/datum/reagent/reagent in holder.reagent_list) + if (istype(reagent, /datum/reagent/fermi)) + var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id] + Ferm.FermiExplode(src, holder.my_atom, holder, holder.total_volume, holder.chem_temp, holder.pH) + else + var/datum/chemical_reaction/Ferm = GLOB.chemical_reagents_list[reagent.id] + Ferm.on_reaction(holder, reagent.volume) + for(var/mob/M in viewers(8, location)) + to_chat(M, "The solution reacts dramatically, with a meow!") + playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) + holder.clear_reagents() + +/datum/reagent/fermi/fermiTest/on_merge() + ..() + message_admins("FermiTest addition!") var/location = get_turf(holder.my_atom) if(purity < 0.34 || purity == 1) var/datum/effect_system/foam_spread/s = new() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 7015087fc6..cdc822179a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -10,7 +10,7 @@ //Called when temperature is above a certain threshold //....Is this too much? -/datum/chemical_reaction/fermi/proc/FermiExplode(src, var/atom/my_atom, datum/reagents/holder, volume, temp, pH, Reaction, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? +/datum/chemical_reaction/fermi/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? //var/Svol = volume if (Exploding == TRUE) return @@ -19,13 +19,13 @@ var/ImpureTot = 0 var/pHmod = 1 var/turf/T = get_turf(my_atom) - if(temp>600)//if hot, start a fire + if(temp>500)//if hot, start a fire switch(temp) - if (601 to 800) + if (500 to 750) for(var/turf/turf in range(1,T)) new /obj/effect/hotspot(turf) //volume /= 3 - if (801 to 1100) + if (751 to 1100) for(var/turf/turf in range(2,T)) new /obj/effect/hotspot(turf) //volume /= 4 @@ -48,8 +48,8 @@ pHmod = 1.5 for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) if (istype(reagent, /datum/reagent/fermi)) - var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id] - Ferm.FermiExplode(src, my_atom, holder, volume, temp, pH, Exploding = TRUE) + //var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id] + //Ferm.FermiExplode(src, my_atom, volume, temp, pH, Exploding = TRUE) continue //Don't allow fermichems into the mix (fermi explosions are handled elsewhere and it's a huge pain) R.add_reagent(reagent, reagent.volume) if (reagent.purity < 0.6) @@ -64,7 +64,7 @@ my_atom.reagents.clear_reagents() return -/datum/chemical_reaction/fermi/eigenstate +/datum/chemical_reaction/fermi/eigenstate//done name = "Eigenstasium" id = "eigenstate" results = list("eigenstate" = 1) @@ -81,7 +81,7 @@ CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value) CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value) ThermicConstant = -2.5 //Temperature change per 1u produced - HIonRelease = 0.01 //pH change per 1u reaction + HIonRelease = 0.08 //pH change per 1u reaction RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics FermiExplode = FALSE //If the chemical explodes in a special way @@ -98,8 +98,8 @@ name = "Synthetic-derived growth factor" id = "SDGF" results = list("SDGF" = 3) - required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) - //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) + //required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) + required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 500 // Upper end for above @@ -117,17 +117,17 @@ FermiExplode = TRUE // If the chemical explodes in a special way PurityMin = 0.25 -/datum/chemical_reaction/fermi/SDGF/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies - var/turf/T = get_turf(holder) +/datum/chemical_reaction/fermi/SDGF/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//Spawns an angery teratoma!! Spooky..! be careful!! TODO: Add teratoma slime subspecies + var/turf/T = get_turf(my_atom) var/mob/living/simple_animal/slime/S = new(T,"grey")//should work, in theory S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)//I dunno how slimes work cause fire is burny S.name = "Living teratoma" S.real_name = "Living teratoma"//horrifying!! S.rabid = 1//Make them an angery boi, grr grr to_chat("The cells clump up into a horrifying tumour!") - holder.clear_reagents() + my_atom.reagents.clear_reagents() -/datum/chemical_reaction/fermi/BElarger +/datum/chemical_reaction/fermi/BElarger //done name = "Sucubus milk" id = "BElarger" results = list("BElarger" = 6) @@ -136,29 +136,29 @@ OptimalTempMin = 200 OptimalTempMax = 800 ExplodeTemp = 900 - OptimalpHMin = 5 - OptimalpHMax = 10 + OptimalpHMin = 8 + OptimalpHMax = 12 ReactpHLim = 3 CatalystFact = 0 CurveSharpT = 2 CurveSharppH = 2 ThermicConstant = 1 - HIonRelease = 0.1 - RateUpLim = 10 + HIonRelease = 0.5 + RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.1 -/datum/chemical_reaction/fermi/BElarger/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) +/datum/chemical_reaction/fermi/BElarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) //var/obj/item/organ/genital/breasts/B = - new /obj/item/organ/genital/breasts(get_turf(holder)) - var/list/seen = viewers(5, get_turf(holder)) + new /obj/item/organ/genital/breasts(get_turf(my_atom)) + var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a pair of breasts!")//OwO - holder.clear_reagents() + my_atom.reagents.clear_reagents() ..() -/datum/chemical_reaction/fermi/PElarger //Vars needed +/datum/chemical_reaction/fermi/PElarger //done name = "Incubus draft" id = "PElarger" results = list("PElarger" = 3) @@ -168,53 +168,52 @@ OptimalTempMin = 200 OptimalTempMax = 800 ExplodeTemp = 900 - OptimalpHMin = 5 - OptimalpHMax = 10 + OptimalpHMin = 2 + OptimalpHMax = 6 ReactpHLim = 3 CatalystFact = 0 CurveSharpT = 2 CurveSharppH = 2 ThermicConstant = 1 - HIonRelease = 0.1 - RateUpLim = 10 + HIonRelease = -0.5 + RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE PurityMin = 0.1 -/datum/chemical_reaction/fermi/PElarger/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) +/datum/chemical_reaction/fermi/PElarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) //var/obj/item/organ/genital/penis/nP = - new /obj/item/organ/genital/penis(get_turf(holder)) - var/list/seen = viewers(5, get_turf(holder)) + new /obj/item/organ/genital/penis(get_turf(my_atom)) + var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) to_chat(M, "The reaction suddenly condenses, creating a penis!")//OwO - holder.clear_reagents() + my_atom.reagents.clear_reagents() ..() -/datum/chemical_reaction/fermi/astral //Vars needed +/datum/chemical_reaction/fermi/astral //done name = "Astrogen" id = "astral" results = list("astral" = 3) required_reagents = list("eigenstasium" = 1, "plasma" = 1, "synaptizine" = 1, "aluminium" = 5) - //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: OptimalTempMin = 200 OptimalTempMax = 800 ExplodeTemp = 900 - OptimalpHMin = 5 - OptimalpHMax = 10 - ReactpHLim = 3 + OptimalpHMin = 12 + OptimalpHMax = 13 + ReactpHLim = 2 CatalystFact = 0 - CurveSharpT = 2 + CurveSharpT = 4 CurveSharppH = 2 - ThermicConstant = 1 - HIonRelease = 0.1 + ThermicConstant = 10 + HIonRelease = 0.5 RateUpLim = 10 FermiChem = TRUE FermiExplode = TRUE - PurityMin = 0.25 + PurityMin = 0.25 // explode purity! -/datum/chemical_reaction/fermi/enthrall //Vars needed +/datum/chemical_reaction/fermi/enthrall//done name = "MKUltra" id = "enthrall" results = list("enthrall" = 3) @@ -275,21 +274,21 @@ //var/enthrallID = B.get_blood_data() */ -/datum/chemical_reaction/fermi/enthrall/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) - var/turf/T = get_turf(holder) +/datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) + var/turf/T = get_turf(my_atom) var/datum/reagents/R = new/datum/reagents(1000) var/datum/effect_system/smoke_spread/chem/s = new() R.add_reagent("enthrallExplo", volume) s.set_up(R, volume, T) s.start() - holder.clear_reagents() + my_atom.reagents.clear_reagents() //..() //Please don't kill everyone too. -/datum/chemical_reaction/fermi/hatmium +/datum/chemical_reaction/fermi/hatmium // done name = "Hat growth serum" id = "hatmium" results = list("hatmium" = 5) - required_reagents = list("whiskey" = 1, "nutriment" = 3, "cooking_oil" = 2, "iron" = 1, "blackpepper" = 3) + required_reagents = list("whiskey" = 1, "nutriment" = 3, "cooking_oil" = 2, "iron" = 1) //mix_message = "" //FermiChem vars: OptimalTempMin = 500 @@ -301,27 +300,27 @@ //CatalystFact = 0 //To do 1 CurveSharpT = 4 CurveSharppH = 0.5 - ThermicConstant = -2.5 - HIonRelease = 0.01 + ThermicConstant = -2 + HIonRelease = -0.05 RateUpLim = 5 FermiChem = TRUE //FermiExplode = FALSE //PurityMin = 0.15 -/datum/chemical_reaction/fermi/hatmium/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) - var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(holder.my_atom)) +/datum/chemical_reaction/fermi/hatmium/FermiExplode(src, var/atom/my_atom, volume, temp, pH) + var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom)) hat.animate_atom_living() - var/list/seen = viewers(5, get_turf(holder.my_atom)) + var/list/seen = viewers(8, get_turf(my_atom)) for(var/mob/M in seen) to_chat(M, "The makes an off sounding pop, as a hat suddenly climbs out of the beaker!") - holder.clear_reagents() + my_atom.reagents.clear_reagents() ..() -/datum/chemical_reaction/fermi/furranium //low temp and medium pH +/datum/chemical_reaction/fermi/furranium //low temp and medium pH - done name = "Furranium" id = "furranium" results = list("furranium" = 5) - required_reagents = list("aphro" = 1, "moonsugar" = 1, "silver" = 1, "salglu_solution" = 1) + required_reagents = list("aphro" = 1, "moonsugar" = 1, "silver" = 2, "salglu_solution" = 1) //mix_message = "" //FermiChem vars: OptimalTempMin = 350 @@ -341,7 +340,7 @@ //PurityMin = 0.15 //Nano-b-gone -/datum/chemical_reaction/fermi/naninte_b_gone +/datum/chemical_reaction/fermi/naninte_b_gone//done name = "Naninte bain" id = "naninte_b_gone" results = list("naninte_b_gone" = 5) @@ -357,9 +356,9 @@ //CatalystFact = 0 //To do 1 CurveSharpT = 4 CurveSharppH = 2 - ThermicConstant = -2.5 + ThermicConstant = 1 HIonRelease = 0.01 - RateUpLim = 5 + RateUpLim = 100 FermiChem = TRUE //FermiExplode = FALSE //PurityMin = 0.15 diff --git a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm b/modular_citadel/code/modules/reagents/objects/fermiclothes.dm index 3cd5c8e90c..908016d371 100644 --- a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm +++ b/modular_citadel/code/modules/reagents/objects/fermiclothes.dm @@ -9,6 +9,11 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) item_flags = NODROP //Tips their hat! +/* +/obj/item/clothing/head/hattip/equipped(mob/living/carbon/human/user, slot) + C = user //grumble grumble loc +*/ + /obj/item/clothing/head/hattip/attack_hand(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user @@ -19,10 +24,23 @@ user.emote("me",1,"admires such a spiffy hat.",TRUE) return ..() -/obj/item/clothing/head/hattip/speechModification(message) +/obj/item/clothing/head/hattip/speechModification(message, /mob/living/carbon/C) ..() + var/mob/living/carbon/C = get_wearer()//user + //if(istype(C, /mob/living/carbon/C)) + var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE) + if (T.name == "fluffy tongue") + if(prob(0.01)) + message += "\" and tips their hat. \"swpy's sappin' my swentwy uwu!!" + return message + message += "\" and tips their hat. \"[pick("weehaw!", "bwoy howdy.", "dawn tuutin'.", "weww don't that beat aww.", "whoooowee, wouwd ya wook at that!", "whoooowee! makin' bwacon!", "cweam gwavy!", "yippekeeyah-heeyapeeah-kwayoh!", "mwove 'em uut!", "gwiddy up!")]" + return message if(prob(0.01)) message += "\" and tips their hat. \"Spy's sappin' my Sentry!" return message message += "\" and tips their hat. \"[pick("Yeehaw!", "Boy howdy.", "Darn tootin'.", "Well don't that beat all.", "Whoooowee, would ya look at that!", "Whoooowee! Makin' bacon!", "Cream Gravy!", "Yippekeeyah-heeyapeeah-kayoh!", "Move 'em out!", "Giddy up!")]" return message + + +/obj/item/clothing/head/hattip/proc/get_wearer() + return loc diff --git a/tgstation.dme b/tgstation.dme index d45fc811c0..e8a0ec5c10 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -328,6 +328,7 @@ #include "code\datums\actions\beam_rifle.dm" #include "code\datums\actions\ninja.dm" #include "code\datums\brain_damage\brain_trauma.dm" +#include "code\datums\brain_damage\hypnosis.dm" #include "code\datums\brain_damage\imaginary_friend.dm" #include "code\datums\brain_damage\mild.dm" #include "code\datums\brain_damage\phobia.dm" From 71088eace977d8099b0d1e3225a772216abde43c Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 21 May 2019 05:05:32 +0100 Subject: [PATCH 133/608] More fixes --- code/modules/mob/living/say.dm | 5 ----- code/modules/reagents/chemistry/holder.dm | 2 ++ code/modules/surgery/organs/vocal_cords.dm | 5 +---- modular_citadel/code/datums/status_effects/chems.dm | 2 +- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 6 +++--- .../code/modules/reagents/chemistry/recipes/fermi.dm | 4 ++-- 6 files changed, 9 insertions(+), 15 deletions(-) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 161544578d..230b265fb8 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -205,11 +205,6 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(pressure < ONE_ATMOSPHERE*0.4) //Thin air, let's italicise the message spans |= SPAN_ITALICS - //global say component - //SEND_GLOBAL_SIGNAL(COMSIG_LIVING_SAY, src, message) - //if(SEND_SIGNAL(COMSIG_LIVING_SAY,src,message) == COMPONENT_NO_SAY) - // return - send_speech(message, message_range, src, bubble_type, spans, language, message_mode) if(succumbed) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 8a101f5873..3027d45554 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -616,6 +616,7 @@ im //go to explode proc //message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [cached_temp]") C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) + return if (pH > 14) pH = 14 @@ -628,6 +629,7 @@ im if ((purity < C.PurityMin) && (!C.PurityMin == 0))//If purity is below the min, blow it up. C.FermiExplode(src, my_atom, (reactedVol+targetVol), cached_temp, pH) + return //For now, purity is handled elsewhere diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 1fca8123c2..943b1d2921 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -706,9 +706,6 @@ if (E.cooldown > 0)//If they're on cooldown you can't give them more commands. continue listeners += L - if(debug == TRUE) - for(var/L in listeners) - to_chat(world, "[user] choses, and [L] obeys.") if(!listeners.len) cooldown = 0 @@ -994,7 +991,7 @@ if(2 to INFINITY) var/mob/living/M = V playsound(get_turf(M), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) - M.emote(M,"lets out a nya!") + M.emote(M, 1, "lets out a nya!") E.cooldown += 1 //SLEEP diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 6127f82a03..43664d1010 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -454,7 +454,7 @@ */ //Doesn't work -/datum/status_effect/chem/enthrall/proc/owner_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/datum/status_effect/chem/enthrall/proc/owner_hear(message = message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) var/mob/living/carbon/C = owner //message_admins("[C] heard something!") for (var/trigger in customTriggers) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 4444251243..366ca14302 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -114,8 +114,8 @@ addiction_threshold = 15 metabolization_rate = 0.5 * REAGENTS_METABOLISM addiction_stage2_end = 30 - addiction_stage3_end = 40 - addiction_stage4_end = 43 //Incase it's too long + addiction_stage3_end = 41 + addiction_stage4_end = 44 //Incase it's too long var/location_created var/turf/open/location_return = null var/addictCyc1 = 0 @@ -251,7 +251,7 @@ src.addictCyc4++ ..() - . = 1 + //. = 1 //TODO ///datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index cdc822179a..7a9d631496 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -190,7 +190,7 @@ my_atom.reagents.clear_reagents() ..() -/datum/chemical_reaction/fermi/astral //done +/datum/chemical_reaction/fermi/astral //done //BORKEN name = "Astrogen" id = "astral" results = list("astral" = 3) @@ -278,7 +278,7 @@ var/turf/T = get_turf(my_atom) var/datum/reagents/R = new/datum/reagents(1000) var/datum/effect_system/smoke_spread/chem/s = new() - R.add_reagent("enthrallExplo", volume) + R.add_reagent("enthrallExplo", volume/2) s.set_up(R, volume, T) s.start() my_atom.reagents.clear_reagents() From be4f188589308f6efc1f5b06f67f736af1dec6a7 Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 21 May 2019 20:08:46 +0100 Subject: [PATCH 134/608] FermiChem? More like, FermiFixes! --- code/game/say.dm | 3 +- code/modules/mob/living/carbon/say.dm | 2 +- .../chemistry/Fermi_Chemistry_notes.txt | 36 ++++++++++ code/modules/reagents/chemistry/holder.dm | 10 ++- code/modules/reagents/chemistry/reagents.dm | 1 + .../chemistry/reagents/toxin_reagents.dm | 20 ++++++ code/modules/surgery/organs/vocal_cords.dm | 36 +++++++--- .../code/datums/status_effects/chems.dm | 65 +++++++++++-------- .../code/modules/arousal/organs/breasts.dm | 6 +- .../chemistry/reagents/fermi_reagents.dm | 40 ++++++++---- .../reagents/chemistry/recipes/fermi.dm | 2 +- 11 files changed, 167 insertions(+), 54 deletions(-) diff --git a/code/game/say.dm b/code/game/say.dm index 0788310038..a6cf177140 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -29,6 +29,7 @@ GLOBAL_LIST_INIT(freqtospan, list( send_speech(message, 7, src, , spans, message_language=language) /atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + //message_admins("Pre: [message], [speaker], [message_language], [raw_message], [radio_freq], [spans], [message_mode]") SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, message, speaker, message_language, raw_message, radio_freq, spans, message_mode) /atom/movable/proc/can_speak() @@ -97,7 +98,7 @@ GLOBAL_LIST_INIT(freqtospan, list( var/spanned = attach_spans(input, spans) return "[say_mod(input, message_mode)][spanned ? ", \"[spanned]\"" : ""]" // Citadel edit [spanned ? ", \"[spanned]\"" : ""]" - + /atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode) if(has_language(language)) var/atom/movable/AM = speaker.GetSource() diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index 42fdb36933..c3f0750273 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -6,7 +6,7 @@ var/obj/item/organ/vocal_cords/Vc = getorganslot(ORGAN_SLOT_VOICE) if(Vc) if(Vc.name == "velvet chords" ) - ..() + //..() velvetspeech(message, src) var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) diff --git a/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt b/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt index efcd9b748f..3005b81640 100644 --- a/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt +++ b/code/modules/reagents/chemistry/Fermi_Chemistry_notes.txt @@ -56,3 +56,39 @@ Where what the reactions do, the code that sets what they do. ~\ss13\Citadel-Station-13\tgui\src\interfaces~ This contains the 4 scripts for generation of the UI for operation of the various chemical equipments. + +//Mixables +var/static/regex/enthral_words = regex("relax|obey|love|serve|docile|so easy|ara ara") //enthral_words works +var/static/regex/reward_words = regex("good boy|good girl|good pet") //reward_words works +var/static/regex/punish_words = regex("bad boy|bad girl|bad pet") ////punish_words works +//phase 0 +var/static/regex/saymyname_words = regex("say my name|who am i|whoami") //works I think +var/static/regex/wakeup_words = regex("revert|awaken|snap") //works +//phase1 +var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") //works +var/static/regex/antiresist_words = regex("unable to resist|give in")//useful if you think your target is resisting a lot +var/static/regex/resist_words = regex("resist|snap out of it|fight")//useful if two enthrallers are fighting +var/static/regex/forget_words = regex("forget|muddled|awake and forget") +var/static/regex/attract_words = regex("come here|come to me|get over here|attract") +//phase 2 +var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //wah, lewd +var/static/regex/awoo_words = regex("howl|awoo|bark") +var/static/regex/nya_words = regex("nya|meow|mewl") +var/static/regex/sleep_words = regex("sleep|slumber|rest") +var/static/regex/strip_words = regex("strip|derobe|nude") +var/static/regex/walk_words = regex("slow down") +var/static/regex/run_words = regex("run") +var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown|kneel") +//phase 3 +var/static/regex/statecustom_words = regex("state triggers|state your triggers") +var/static/regex/custom_words = regex("new trigger|listen to me") +var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|trance")//What a descriptive name! +var/static/regex/objective_words = regex("new objective|obey this command|unable to resist|compulsed") +var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die") +var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") +var/static/regex/hallucinate_words = regex("trip balls|hallucinate") +var/static/regex/hot_words = regex("heat|hot|hell") +var/static/regex/cold_words = regex("cold|cool down|chill|freeze") +var/static/regex/getup_words = regex("get up") +var/static/regex/pacify_words = regex("more and more docile|complaisant|friendly|pacifist") +var/static/regex/charge_words = regex("charge|oorah|attack") diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 3027d45554..67cccedff0 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -459,7 +459,7 @@ im var/datum/chemical_reaction/C = selected_reaction if (C.FermiChem == TRUE && !continue_reacting) - //message_admins("FermiChem Proc'd") + message_admins("FermiChem Proc'd") for(var/P in selected_reaction.results) targetVol = cached_results[P]*multiplier @@ -555,6 +555,8 @@ im //var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] C.FermiFinish(src, my_atom, multiplier) //C.on_reaction(src, multiplier, special_react_result) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] [selected_reaction.mix_message]") return for(var/P in cached_results) targetVol = cached_results[P]*multiplier @@ -580,6 +582,8 @@ im //var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] C.FermiFinish(src, my_atom, multiplier) //C.on_reaction(src, multiplier, special_react_result) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] [selected_reaction.mix_message]") return else STOP_PROCESSING(SSprocessing, src) @@ -592,6 +596,8 @@ im //var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] C.FermiFinish(src, my_atom, multiplier) //C.on_reaction(src, multiplier, special_react_result) + for(var/mob/M in seen) + to_chat(M, "[iconhtml] [selected_reaction.mix_message]") return //handle_reactions() @@ -901,6 +907,8 @@ im if(data) R.data = data R.on_new(data) + if(R.addProc == TRUE) + R.on_new() if(istype(D, /datum/reagent/fermi))//Is this a fermichem? var/datum/reagent/fermi/Ferm = D //It's Fermi time! Ferm.FermiNew(my_atom) //Seriously what is "data" ???? diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 289896ddac..3046649170 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -35,6 +35,7 @@ var/self_consuming = FALSE //Fermichem vars: var/purity = 1 + var/addProc = FALSE //When this reagent is added to a new beaker, it does something. //var/ImpureChem = "toxin" var/loc = null //Should be the creation location! var/pH = 7 diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 7286f01623..0c0b385958 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -23,6 +23,7 @@ color = "#792300" // rgb: 121, 35, 0 toxpwr = 2.5 taste_description = "mushroom" + pH = 13 /datum/reagent/toxin/mutagen name = "Unstable mutagen" @@ -32,6 +33,7 @@ toxpwr = 0 taste_description = "slime" taste_mult = 0.9 + pH = 2 /datum/reagent/toxin/mutagen/reaction_mob(mob/living/carbon/M, method=TOUCH, reac_volume) if(!..()) @@ -61,6 +63,7 @@ taste_mult = 1.5 color = "#8228A0" toxpwr = 3 + pH = 4 /datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C) if(holder.has_reagent("epinephrine")) @@ -93,6 +96,7 @@ color = "#7DC3A0" toxpwr = 0 taste_description = "acid" + pH = 1.2 /datum/reagent/toxin/lexorin/on_mob_life(mob/living/carbon/C) . = TRUE @@ -115,6 +119,7 @@ toxpwr = 0 taste_description = "slime" taste_mult = 1.3 + pH = 10 /datum/reagent/toxin/slimejelly/on_mob_life(mob/living/carbon/M) if(prob(10)) @@ -133,6 +138,7 @@ color = "#CF3600" // rgb: 207, 54, 0 toxpwr = 0 taste_description = "mint" + pH = 8 /datum/reagent/toxin/minttoxin/on_mob_life(mob/living/carbon/M) if(M.has_trait(TRAIT_FAT)) @@ -146,6 +152,7 @@ color = "#003333" // rgb: 0, 51, 51 toxpwr = 2 taste_description = "fish" + pH = 12 /datum/reagent/toxin/zombiepowder name = "Zombie Powder" @@ -155,6 +162,7 @@ color = "#669900" // rgb: 102, 153, 0 toxpwr = 0.5 taste_description = "death" + pH = 13 /datum/reagent/toxin/zombiepowder/on_mob_add(mob/living/L) ..() @@ -177,6 +185,7 @@ color = "#664700" // rgb: 102, 71, 0 toxpwr = 0.8 taste_description = "death" + pH = 14.5 /datum/reagent/toxin/ghoulpowder/on_mob_add(mob/living/L) ..() @@ -198,6 +207,7 @@ color = "#B31008" // rgb: 139, 166, 233 toxpwr = 0 taste_description = "sourness" + pH = 11 /datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/carbon/M) M.hallucination += 5 @@ -210,6 +220,7 @@ color = "#49002E" // rgb: 73, 0, 46 toxpwr = 1 taste_mult = 1 + pH = 2 /datum/reagent/toxin/plantbgone/reaction_obj(obj/O, reac_volume) if(istype(O, /obj/structure/alien/weeds)) @@ -234,6 +245,7 @@ id = "weedkiller" description = "A harmful toxic mixture to kill weeds. Do not ingest!" color = "#4B004B" // rgb: 75, 0, 75 + pH = 3 /datum/reagent/toxin/pestkiller name = "Pest Killer" @@ -241,6 +253,7 @@ description = "A harmful toxic mixture to kill pests. Do not ingest!" color = "#4B004B" // rgb: 75, 0, 75 toxpwr = 1 + pH = 3.2 /datum/reagent/toxin/pestkiller/reaction_mob(mob/living/M, method=TOUCH, reac_volume) ..() @@ -254,6 +267,7 @@ description = "A natural toxin produced by blob spores that inhibits vision when ingested." color = "#9ACD32" toxpwr = 1 + pH = 11 /datum/reagent/toxin/spore/on_mob_life(mob/living/carbon/C) C.damageoverlaytemp = 60 @@ -268,6 +282,7 @@ color = "#9ACD32" toxpwr = 0.5 taste_description = "burning" + pH = 13 /datum/reagent/toxin/spore_burning/on_mob_life(mob/living/carbon/M) M.adjust_fire_stacks(2) @@ -282,6 +297,7 @@ color = "#000067" // rgb: 0, 0, 103 toxpwr = 0 metabolization_rate = 1.5 * REAGENTS_METABOLISM + pH = 11 /datum/reagent/toxin/chloralhydrate/on_mob_life(mob/living/carbon/M) switch(current_cycle) @@ -325,6 +341,7 @@ glass_icon_state = "beerglass" glass_name = "glass of beer" glass_desc = "A freezing pint of beer." + pH = 2 /datum/reagent/toxin/fakebeer/on_mob_life(mob/living/carbon/M) switch(current_cycle) @@ -342,6 +359,7 @@ reagent_state = SOLID color = "#5B2E0D" // rgb: 91, 46, 13 toxpwr = 0.5 + pH = 4.2 /datum/reagent/toxin/teapowder name = "Ground Tea Leaves" @@ -350,6 +368,7 @@ reagent_state = SOLID color = "#7F8400" // rgb: 127, 132, 0 toxpwr = 0.5 + pH = 4.9 /datum/reagent/toxin/mutetoxin //the new zombie powder. name = "Mute Toxin" @@ -358,6 +377,7 @@ color = "#F0F8FF" // rgb: 240, 248, 255 toxpwr = 0 taste_description = "silence" + pH = 12.2 /datum/reagent/toxin/mutetoxin/on_mob_life(mob/living/carbon/M) M.silent = max(M.silent, 3) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 943b1d2921..5737d62910 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -827,7 +827,7 @@ //CALLBACKS ARE USED FOR MESSAGES BECAUSE SAY IS HANDLED AFTER THE PROCESSING. //Tier 1 - //ENTHRAL mixable + //ENTHRAL mixable (works I think) if(findtext(message, enthral_words)) for(var/V in listeners) var/mob/living/L = V @@ -838,9 +838,11 @@ E.enthrallTally += (power_multiplier*(((length(message))/200) + 1)) //encourage players to say more than one word. else E.enthrallTally += power_multiplier*1.25 + if(L.canbearoused) + addtimer(CALLBACK(L, .proc/to_chat, "[E.master] is so nice to listen to."), 5) E.cooldown += 1 - //REWARD mixable + //REWARD mixable works if(findtext(message, reward_words)) for(var/V in listeners) var/mob/living/L = V @@ -850,12 +852,14 @@ if (L.canbearoused) //E.resistanceTally -= 1 L.adjustArousalLoss(1*power_multiplier) + addtimer(CALLBACK(L, .proc/to_chat, "[E.enthrallGender] has praised me!!"), 5) else E.resistanceTally /= 2*power_multiplier + addtimer(CALLBACK(L, .proc/to_chat, "I've been praised for doing a good job!"), 5) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise) E.cooldown += 1 - //PUNISH mixable + //PUNISH mixable works else if(findtext(message, punish_words)) for(var/V in listeners) var/mob/living/L = V @@ -865,19 +869,24 @@ if (L.canbearoused) E.resistanceTally /= 1*power_multiplier L.adjustArousalLoss(-2*power_multiplier) + addtimer(CALLBACK(L, .proc/to_chat, "I've let [E.enthrallGender] down..."), 5) else E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold) + addtimer(CALLBACK(L, .proc/to_chat, "I've failed [E.master]..."), 5) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_tEVENT, "enthrallscold", /datum/mood_event/enthrallscold) E.cooldown += 1 //teir 0 - //SAY MY NAME + //SAY MY NAME works if((findtext(message, saymyname_words))) for(var/V in listeners) var/mob/living/carbon/C = V + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) C.remove_trait(TRAIT_MUTE, "enthrall") - addtimer(CALLBACK(C, /atom/movable/proc/say, "Master"), 5)//When I figure out how to do genedered names put them here - + if(C.canbearoused) + addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.enthrallGender]"), 5) + else + addtimer(CALLBACK(C, /atom/movable/proc/say, "My director."), 5) //WAKE UP else if((findtext(message, wakeup_words))) for(var/V in listeners) @@ -888,8 +897,11 @@ if(0) E.phase = 3 E.status = null - addtimer(CALLBACK(L, /proc/to_chat, "The snapping of your Master's fingers brings you back to your enthralled state, obedient and ready to serve."), 5) - //to_chat(L, ) + if(C.canbearoused) + addtimer(CALLBACK(L, .proc/to_chat, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) + else + addtimer(CALLBACK(L, .proc/to_chat, "The snapping of [E.master]'s fingers brings you back to being under their command."), 5) + //to_chat(L, ) //tier 1 @@ -941,6 +953,10 @@ if(3) E.phase = 0 E.cooldown = 0 + if(C.canbearoused) + addtimer(CALLBACK(L, .proc/to_chat, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) + else + addtimer(CALLBACK(L, .proc/to_chat, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) //ATTRACT else if((findtext(message, attract_words))) @@ -1052,7 +1068,7 @@ //tier3 //STATE TRIGGERS - else if((findtext(message, statecustom_words))) + else if((findtext(message, statecustom_words)))//doesn't work for(var/V in listeners) var/speaktrigger = "" var/mob/living/L = V diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 43664d1010..73f4b25016 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -31,7 +31,7 @@ //message_admins("SDGF ticking") if(owner.stat == DEAD) //message_admins("SGDF status swapping") - if(fermi_Clone && fermi_Clone.stat != DEAD) + if((fermi_Clone && fermi_Clone.stat != DEAD) || (fermi_Clone == null)) if(owner.mind) owner.mind.transfer_to(fermi_Clone) owner.visible_message("Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") @@ -44,6 +44,8 @@ /datum/status_effect/chem/BElarger id = "BElarger" alert_type = null + var/moveCalc = 1 + var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0) //var/list/items = list() //var/items = o.get_contents() @@ -68,7 +70,7 @@ var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") if(!B) o.remove_movespeed_modifier("megamilk") - o.next_move_modifier = 1 + o.next_move_modifier /= moveCalc owner.remove_status_effect(src) var/items = o.get_contents() for(var/obj/item/W in items) @@ -76,24 +78,28 @@ o.dropItemToGround(W, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) to_chat(owner, "Your enormous breasts are way too large to fit anything over them!") - switch(round(B.cached_size)) - if(9) - if (!(B.breast_sizes[B.prev_size] == B.size)) - to_chat(o, "Your expansive chest has become a more managable size, liberating your movements.") - o.remove_movespeed_modifier("megamilk") - o.next_move_modifier = 1 - if(10 to INFINITY) - if (!(B.breast_sizes[B.prev_size] == B.size)) - to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!") - o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = ((round(B.cached_size) - 8))/3) - o.next_move_modifier = (round(B.cached_size) - 8)/3 - if(prob(5)) - to_chat(H, "Your back is feeling a little sore.") - ..() + moveCalc = ((round(B.cached_size) - 9))/5) + if (breast_values[size] > breast_values[prev_size]) + o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) + o.next_move_modifier *= moveCalc + else if (breast_values[size] < breast_values[prev_size]) + o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) + o.next_move_modifier /= moveCalc + if(round(B.cached_size) < 16) + switch(round(B.cached_size)) + if(9) + if (!(B.breast_sizes[B.prev_size] == B.size)) + to_chat(o, "Your expansive chest has become a more managable size, liberating your movements.") + if(10 to INFINITY) + if (!(B.breast_sizes[B.prev_size] == B.size)) + to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!") + if(prob(5)) + to_chat(H, "Your back is feeling a little sore.") + ..() /datum/status_effect/chem/BElarger/on_remove(mob/living/carbon/M) owner.remove_movespeed_modifier("megamilk") - owner.next_move_modifier = 1 + owner.next_move_modifier /= moveCalc /datum/status_effect/chem/PElarger @@ -214,8 +220,8 @@ enthrallTally += phase else if (phase < 3 && phase != 0) - deltaResist += 2//If you've no chem, then you break out quickly - if(prob(20)) + deltaResist += 3//If you've no chem, then you break out quickly + if(prob(10)) to_chat(owner, "Your mind starts to restore some of it's clarity as you feel the effects of the drug wain.") if (mental_capacity <= 500 || phase == 4) if (owner.reagents.has_reagent("mannitol")) @@ -228,6 +234,8 @@ resistanceTally += 5 if(prob(10)) to_chat(owner, "You feel lucidity returning to your mind as the mindshield buzzes, attempting to return your brain to normal function.") + if(phase == 4) + mental_capacity += 5 //phase specific events switch(phase) @@ -251,7 +259,8 @@ to_chat(owner, "You're now free of [master]'s influence, and fully independant oncemore.'") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) - to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") + if(owner.canbearoused) + to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") if (2) //partially enthralled if (enthrallTally > 150) phase += 1 @@ -267,15 +276,17 @@ to_chat(owner, "You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [master].") //owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment, if(prob(10)) - to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") + if(owner.canbearoused) + to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (3)//fully entranced if (resistanceTally >= 200 && withdrawalTick >= 150) enthrallTally = 0 phase -= 1 resistanceTally = 0 to_chat(owner, "The separation from you [enthrallGender] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") - if(prob(3)) - to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") + if(prob(2)) + if(owner.canbearoused) + to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !owner.reagents.has_reagent("MKUltra")) phase = 2 @@ -454,9 +465,11 @@ */ //Doesn't work -/datum/status_effect/chem/enthrall/proc/owner_hear(message = message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) +/datum/status_effect/chem/enthrall/proc/owner_hear(var/hearer, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + //message_admins("post: hear:[hearer], msg:[message], spk:[speaker], lng:[message_language], raw:[raw_message], freq:[radio_freq], spen:[spans], mod:[message_mode]") var/mob/living/carbon/C = owner //message_admins("[C] heard something!") + raw_message = lowertext(raw_message) for (var/trigger in customTriggers) //cached_trigger = lowertext(trigger) message_admins("[C] heard something: [message] vs [trigger] vs [raw_message]") @@ -497,7 +510,7 @@ C.Knockdown(20) //strip (some) clothes - else if (customTriggers[trigger] == "strip")//This wasn't meant to just be a lewd thing oops + else if (lowertext(customTriggers[trigger]) == "strip")//This wasn't meant to just be a lewd thing oops var/mob/living/carbon/human/o = owner var/items = o.get_contents() for(var/obj/item/W in items) @@ -506,7 +519,7 @@ C.visible_message("You feel compelled to strip your clothes.") //trance - else if (customTriggers[trigger] == "trance") + else if (lowertext(customTriggers[trigger]) == "trance") var/mob/living/carbon/human/o = owner o.apply_status_effect(/datum/status_effect/trance, 200, TRUE) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 87d57f6452..5dfbaab64b 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -6,9 +6,9 @@ zone = "chest" slot = "breasts" w_class = 3 - size = BREASTS_SIZE_DEF - var/cached_size = null//for enlargement - var/prev_size //For flavour texts + size = BREASTS_SIZE_DEF //SHOULD BE A LETTER + var/cached_size = null//for enlargement SHOULD BE A NUMBER + var/prev_size //For flavour texts SHOULD BE A LETTER var/breast_sizes = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "flat") var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0) var/statuscheck = FALSE diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 366ca14302..4308ba345e 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -614,7 +614,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING overdose_threshold = 12 metabolization_rate = 0.5 ImpureChem = "BEsmaller" //If you make an inpure chem, it stalls growth - InverseChemVal = 0.25 + InverseChemVal = 0.3 InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse /datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M) @@ -622,6 +622,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/mob/living/carbon/human/H = M var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") if(!B) + message_admins("No breasts found on init!") return var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) B.prev_size = B.size @@ -721,7 +722,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING overdose_threshold = 12 //ODing makes you male and removes female genitals metabolization_rate = 0.5 ImpureChem = "PEsmaller" //If you make an inpure chem, it stalls growth - InverseChemVal = 0.25 + InverseChemVal = 0.3 InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse //var/mob/living/carbon/human/H @@ -1104,7 +1105,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) . = ..() if(!creatorID) - CRASH("Something went wrong in enthral creation") + message_admins("Something went wrong in enthral creation THIS SHOULD NOT APPEAR") + return message_admins("key: [M.ckey] vs [creatorID], ") if(purity < 0.5)//Impure chems don't function as you expect return @@ -1128,8 +1130,6 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) - if (M.ckey == creatorID && creatorName == M.real_name) - return if(purity < 0.5)//Placeholder for now. I'd like to get this done. if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. if(M.has_status_effect(STATUS_EFFECT_INLOVE)) @@ -1151,17 +1151,34 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y M.reagents.remove_reagent(src.id, src.volume) FallInLove(C, M) return - var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) + if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it does nothing. + return + var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)//If purity is over 5, works as intended if(!E) M.reagents.remove_reagent(src.id, 10) M.apply_status_effect(/datum/status_effect/chem/enthrall) - CRASH("No enthrall status found in [M]!") + message_admins("No enthrall status found in [M]!") E.enthrallTally += 1 - M.adjustBrainLoss(0.1) + if(prob(50)) + M.adjustBrainLoss(0.1)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it. ..() -/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I have no idea what happens if you OD yourself honestly. +/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I have no idea what happens if you OD yourself honestly. I made it so the creator is set to gain the status for someone random. . = ..() + if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 150u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.) + var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers + for(var/victim in seen) + if((victim != mob/living/carbon/M) || (victim == M))//as much as I want you to fall for beepsky, he doesn't have a ckey + if(!victim.ckey) + seen = seen - victim + var/chosen = pick(seen) + creatorID = chosen.ckey + if (chosen.gender == "female") + creatorGender = "Mistress" + else + creatorGender = "Master" + creatorName = chosen.real_name + creator = get_mob_by_key(creatorID) M.add_trait(TRAIT_PACIFISM, "MKUltra") var/datum/status_effect/chem/enthrall/E if (!M.has_status_effect(/datum/status_effect/chem/enthrall)) @@ -1180,7 +1197,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y E.customTriggers = list() /datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M) - M.adjustBrainLoss(0.2) + M.adjustBrainLoss(0.1)//should be 15 in total ..() //Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system. @@ -1447,7 +1464,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y name = "Fermis Test Reagent" id = "fermiTest" description = "You should be really careful with this...! Also, how did you get this?" - data = list("Big bang" = 1, "please work" = 2) + //data = list("Big bang" = 1, "please work" = 2) + addProc = TRUE /datum/reagent/fermi/fermiTest/on_new() ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 7a9d631496..84d1947a1a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -194,7 +194,7 @@ name = "Astrogen" id = "astral" results = list("astral" = 3) - required_reagents = list("eigenstasium" = 1, "plasma" = 1, "synaptizine" = 1, "aluminium" = 5) + required_reagents = list("eigenstate" = 1, "plasma" = 1, "synaptizine" = 1, "aluminium" = 5) //FermiChem vars: OptimalTempMin = 200 OptimalTempMax = 800 From ac3f0c790e51eea87ba2cd22c8a34a70f1c4afeb Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 21 May 2019 20:28:40 +0100 Subject: [PATCH 135/608] Fixed compling errors from last time. --- code/modules/reagents/chemistry/holder.dm | 18 +++++++++++++++--- code/modules/surgery/organs/vocal_cords.dm | 8 ++++---- .../code/datums/status_effects/chems.dm | 10 +++++----- .../chemistry/reagents/fermi_reagents.dm | 11 ++++++----- .../reagents/chemistry/recipes/fermi.dm | 3 +++ 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 67cccedff0..6566fd7e06 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -555,8 +555,12 @@ im //var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] C.FermiFinish(src, my_atom, multiplier) //C.on_reaction(src, multiplier, special_react_result) + //Reaction sounds and words + playsound(get_turf(my_atom), C.mix_sound, 80, 1) + var/list/seen = viewers(5, get_turf(my_atom))//Sound and sight checkers + var/iconhtml = icon2html(my_atom, seen) for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + to_chat(M, "[iconhtml] [C.mix_message]") return for(var/P in cached_results) targetVol = cached_results[P]*multiplier @@ -582,8 +586,12 @@ im //var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] C.FermiFinish(src, my_atom, multiplier) //C.on_reaction(src, multiplier, special_react_result) + //Reaction sounds and words + playsound(get_turf(my_atom), C.mix_sound, 80, 1) + var/list/seen = viewers(5, get_turf(my_atom))//Sound and sight checkers + var/iconhtml = icon2html(my_atom, seen) for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + to_chat(M, "[iconhtml] [C.mix_message]") return else STOP_PROCESSING(SSprocessing, src) @@ -596,8 +604,12 @@ im //var/datum/reagent/fermi/Ferm = GLOB.chemical_reagents_list[C.id] C.FermiFinish(src, my_atom, multiplier) //C.on_reaction(src, multiplier, special_react_result) + //Reaction sounds and words + playsound(get_turf(my_atom), C.mix_sound, 80, 1) + var/list/seen = viewers(5, get_turf(my_atom))//Sound and sight checkers + var/iconhtml = icon2html(my_atom, seen) for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + to_chat(M, "[iconhtml] [C.mix_message]") return //handle_reactions() diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 5737d62910..9e5c7a7445 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -873,7 +873,7 @@ else E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously) addtimer(CALLBACK(L, .proc/to_chat, "I've failed [E.master]..."), 5) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_tEVENT, "enthrallscold", /datum/mood_event/enthrallscold) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold) E.cooldown += 1 //teir 0 @@ -897,7 +897,7 @@ if(0) E.phase = 3 E.status = null - if(C.canbearoused) + if(L.canbearoused) addtimer(CALLBACK(L, .proc/to_chat, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) else addtimer(CALLBACK(L, .proc/to_chat, "The snapping of [E.master]'s fingers brings you back to being under their command."), 5) @@ -954,9 +954,9 @@ E.phase = 0 E.cooldown = 0 if(C.canbearoused) - addtimer(CALLBACK(L, .proc/to_chat, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) + addtimer(CALLBACK(C, .proc/to_chat, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) else - addtimer(CALLBACK(L, .proc/to_chat, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) + addtimer(CALLBACK(C, .proc/to_chat, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) //ATTRACT else if((findtext(message, attract_words))) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 73f4b25016..429c8f5ff6 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -45,7 +45,7 @@ id = "BElarger" alert_type = null var/moveCalc = 1 - var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0) + //var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0) //var/list/items = list() //var/items = o.get_contents() @@ -78,11 +78,11 @@ o.dropItemToGround(W, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) to_chat(owner, "Your enormous breasts are way too large to fit anything over them!") - moveCalc = ((round(B.cached_size) - 9))/5) - if (breast_values[size] > breast_values[prev_size]) + moveCalc = (round(B.cached_size) - 9)/5 + if (B.breast_values[B.size] > B.breast_values[B.prev_size]) o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) o.next_move_modifier *= moveCalc - else if (breast_values[size] < breast_values[prev_size]) + else if (B.breast_values[B.size] < B.breast_values[B.prev_size]) o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) o.next_move_modifier /= moveCalc if(round(B.cached_size) < 16) @@ -286,7 +286,7 @@ to_chat(owner, "The separation from you [enthrallGender] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") if(prob(2)) if(owner.canbearoused) - to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") + to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !owner.reagents.has_reagent("MKUltra")) phase = 2 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 4308ba345e..3c2aab4736 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1167,11 +1167,12 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y . = ..() if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 150u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.) var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers - for(var/victim in seen) - if((victim != mob/living/carbon/M) || (victim == M))//as much as I want you to fall for beepsky, he doesn't have a ckey - if(!victim.ckey) - seen = seen - victim - var/chosen = pick(seen) + for(var/mob/living/carbon/victim in seen) + if(victim == M)//as much as I want you to fall for beepsky, he doesn't have a ckey + seen = seen - victim + if(!victim.ckey) + seen = seen - victim + var/mob/living/carbon/chosen = pick(seen) creatorID = chosen.ckey if (chosen.gender == "female") creatorGender = "Mistress" diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 84d1947a1a..aecd0ba029 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -1,5 +1,8 @@ //TO TWEAK: +/datum/chemical_reaction/fermi + mix_sound = 'modular_citadel/sound/voice/merowr.ogg' + //Called for every reaction step /datum/chemical_reaction/fermi/proc/FermiCreate(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? return From 485def8d2808bf83940f9a51d15733ee6b1b3f1a Mon Sep 17 00:00:00 2001 From: Fermi Date: Tue, 21 May 2019 22:06:55 +0100 Subject: [PATCH 136/608] More fixed upon the last! --- code/modules/reagents/chemistry/holder.dm | 4 +- code/modules/surgery/organs/vocal_cords.dm | 46 +++++++++++++------ .../code/datums/status_effects/chems.dm | 23 +++++----- .../chemistry/reagents/fermi_reagents.dm | 23 ++++++---- 4 files changed, 61 insertions(+), 35 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6566fd7e06..0d7532d344 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -902,7 +902,7 @@ im my_atom.on_reagent_change(ADD_REAGENT) //if(R.FermiChem == TRUE) // R.on_mob_add(my_atom) - R.on_merge(data, amount) + R.on_merge(data, amount, my_atom, other_purity) if(!no_react) handle_reactions() @@ -920,7 +920,7 @@ im R.data = data R.on_new(data) if(R.addProc == TRUE) - R.on_new() + R.on_new(my_atom) if(istype(D, /datum/reagent/fermi))//Is this a fermichem? var/datum/reagent/fermi/Ferm = D //It's Fermi time! Ferm.FermiNew(my_atom) //Seriously what is "data" ???? diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 9e5c7a7445..7844ab860b 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -805,11 +805,13 @@ var/static/regex/strip_words = regex("strip|derobe|nude") var/static/regex/walk_words = regex("slow down") var/static/regex/run_words = regex("run") + var/static/regex/liedown_words = regex("lie down") //TO ADD var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown|kneel") //phase 3 var/static/regex/statecustom_words = regex("state triggers|state your triggers") var/static/regex/custom_words = regex("new trigger|listen to me") var/static/regex/custom_words_words = regex("speak|echo|shock|cum|kneel|strip|trance")//What a descriptive name! + var/static/regex/recognise_words = regex("recognise me|i'm back|did you miss me?") var/static/regex/objective_words = regex("new objective|obey this command|unable to resist|compulsed") var/static/regex/heal_words = regex("live|heal|survive|mend|life|pets never die") var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") @@ -839,7 +841,7 @@ else E.enthrallTally += power_multiplier*1.25 if(L.canbearoused) - addtimer(CALLBACK(L, .proc/to_chat, "[E.master] is so nice to listen to."), 5) + addtimer(CALLBACK(L, .proc.to_chat, "[E.master] is so nice to listen to."), 5) E.cooldown += 1 //REWARD mixable works @@ -852,10 +854,10 @@ if (L.canbearoused) //E.resistanceTally -= 1 L.adjustArousalLoss(1*power_multiplier) - addtimer(CALLBACK(L, .proc/to_chat, "[E.enthrallGender] has praised me!!"), 5) + addtimer(CALLBACK(L, .proc.to_chat, "[E.enthrallGender] has praised me!!"), 5) else E.resistanceTally /= 2*power_multiplier - addtimer(CALLBACK(L, .proc/to_chat, "I've been praised for doing a good job!"), 5) + addtimer(CALLBACK(L, .proc.to_chat, "I've been praised for doing a good job!"), 5) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise) E.cooldown += 1 @@ -869,10 +871,10 @@ if (L.canbearoused) E.resistanceTally /= 1*power_multiplier L.adjustArousalLoss(-2*power_multiplier) - addtimer(CALLBACK(L, .proc/to_chat, "I've let [E.enthrallGender] down..."), 5) + addtimer(CALLBACK(L, .proc.to_chat, "I've let [E.enthrallGender] down..."), 5) else E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously) - addtimer(CALLBACK(L, .proc/to_chat, "I've failed [E.master]..."), 5) + addtimer(CALLBACK(L, .proc.to_chat, "I've failed [E.master]..."), 5) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold) E.cooldown += 1 @@ -898,9 +900,9 @@ E.phase = 3 E.status = null if(L.canbearoused) - addtimer(CALLBACK(L, .proc/to_chat, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) + addtimer(CALLBACK(L, .proc.to_chat, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) else - addtimer(CALLBACK(L, .proc/to_chat, "The snapping of [E.master]'s fingers brings you back to being under their command."), 5) + addtimer(CALLBACK(L, .proc.to_chat, "The snapping of [E.master]'s fingers brings you back to being under their command."), 5) //to_chat(L, ) @@ -954,9 +956,9 @@ E.phase = 0 E.cooldown = 0 if(C.canbearoused) - addtimer(CALLBACK(C, .proc/to_chat, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) + addtimer(CALLBACK(C, .proc.to_chat, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) else - addtimer(CALLBACK(C, .proc/to_chat, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) + addtimer(CALLBACK(C, .proc.to_chat, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) //ATTRACT else if((findtext(message, attract_words))) @@ -1071,12 +1073,15 @@ else if((findtext(message, statecustom_words)))//doesn't work for(var/V in listeners) var/speaktrigger = "" - var/mob/living/L = V - var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)//i.e. if it's not empty + var/mob/living/carbon/C = V + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall)//i.e. if it's not empty for (var/trigger in E.customTriggers) - speaktrigger = "[trigger]\n" + speaktrigger += "[trigger], " if(!speaktrigger == "") - L.say(speaktrigger) + C.add_trait(TRAIT_DEAF, "Triggers") //So you don't trigger yourself! + addtimer(CALLBACK(C, /atom/movable/proc/say, "[speaktrigger]"), 5) + C.remove_trait(TRAIT_DEAF, "Triggers") + //CUSTOM TRIGGERS else if((findtext(message, custom_words))) @@ -1132,6 +1137,19 @@ to_chat(user, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") + //RECOGNISE + else if((findtext(message, recognise_words))) + for(var/V in listeners) + var/mob/living/carbon/human/H = V + var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) + if(E.phase > 1) + if(user.ckey == E.enthrallID && user.real_name == E.master.real_name) + E.master = user + if(H.canbearoused) + addtimer(CALLBACK(H, .proc.to_chat, "You hear the words of your [E.enthrallID] again!! They're back!!"), 5) + else + addtimer(CALLBACK(H, .proc.to_chat, "You recognise the words of [user], and comply with their orders oncemore."), 5)//It's a bit like a job, It's a living. + //I dunno how to do state objectives without them revealing they're an antag //HEAL (maybe make this nap instead?) @@ -1146,7 +1164,7 @@ E.cooldown += 5 //STUN - if(findtext(message, stun_words)) + else if(findtext(message, stun_words)) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 429c8f5ff6..50291ca20e 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -463,7 +463,7 @@ else . = ..() */ -//Doesn't work +//WORKS!! AAAAA /datum/status_effect/chem/enthrall/proc/owner_hear(var/hearer, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) //message_admins("post: hear:[hearer], msg:[message], spk:[speaker], lng:[message_language], raw:[raw_message], freq:[radio_freq], spen:[spans], mod:[message_mode]") @@ -471,22 +471,22 @@ //message_admins("[C] heard something!") raw_message = lowertext(raw_message) for (var/trigger in customTriggers) - //cached_trigger = lowertext(trigger) - message_admins("[C] heard something: [message] vs [trigger] vs [raw_message]") - if ("[trigger]" == raw_message)//if trigger1 is the message + var/cached_trigger = lowertext(trigger) + //message_admins("[C] heard something: [message] vs [trigger] vs [raw_message]") + if (findtext(raw_message, cached_trigger))//if trigger1 is the message message_admins("[C] has been triggered with [trigger]!") - //Speak (Forces player to talk) + //Speak (Forces player to talk) works if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2 - to_chat(C, "Your mouth moves on it's own, before you can even catch it. You find yourself fully believing in the validity of what you just said and don't think to question it.") + to_chat(C, "Your body moves on it's own before you can even catch it. You find yourself fully believing in the validity of what you just said and don't think to question it.") (C.say(customTriggers[trigger][2]))//trigger3 - //Echo (repeats message!) + //Echo (repeats message!) works else if (lowertext(customTriggers[trigger][1]) == "echo")//trigger2 (to_chat(owner, "[customTriggers[trigger][2]]"))//trigger3 - //Shocking truth! + //Shocking truth! works else if (lowertext(customTriggers[trigger]) == "shock") if (C.canbearoused) C.electrocute_act(10, src, 1, FALSE, FALSE, FALSE, TRUE)//I've no idea how strong this is @@ -495,7 +495,7 @@ else C.electrocute_act(15, src, 1, FALSE, FALSE, FALSE, TRUE)//To make up for the lack of effect - //wah intensifies + //wah intensifies wah-rks else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa if (C.canbearoused) if (C.getArousalLoss() > 80) @@ -507,7 +507,8 @@ //kneel (knockdown) else if (lowertext(customTriggers[trigger]) == "kneel")//as close to kneeling as you can get, I suppose. - C.Knockdown(20) + C.resting = 1 + C.lying = 1 //strip (some) clothes else if (lowertext(customTriggers[trigger]) == "strip")//This wasn't meant to just be a lewd thing oops @@ -516,7 +517,7 @@ for(var/obj/item/W in items) if(W == o.w_uniform || W == o.wear_suit) o.dropItemToGround(W, TRUE) - C.visible_message("You feel compelled to strip your clothes.") + to_chat(owner,"You feel compelled to strip your clothes.") //trance else if (lowertext(customTriggers[trigger]) == "trance") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 3c2aab4736..3842342f97 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -56,23 +56,25 @@ M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) return -/datum/reagent/fermi/on_merge(mob/living/carbon/M, amount, other_purity) +//When merging two fermichems +/datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity) . = ..() + message_admins("purity of chem is [purity]") if(!M) return message_admins("purity of chem is [purity]") - if(other_purity < 0) + if (purity < 0) CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") - if (other_purity == 1 || src.DoNotSplit == TRUE) + if (purity == 1 || src.DoNotSplit == TRUE) return - else if (src.InverseChemVal > other_purity) + else if (src.InverseChemVal > purity) M.reagents.remove_reagent(src.id, amount, FALSE) M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1) message_admins("all convered to [src.InverseChem]") return else //var/pureVol = - var/impureVol = amount * (1 - other_purity) + var/impureVol = amount * (1 - purity) message_admins("splitting [src] [amount] into [src.ImpureChem] [impureVol]") M.reagents.remove_reagent(src.id, impureVol, FALSE) M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) @@ -334,9 +336,9 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING pollStarted = TRUE candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you.") if(20 to INFINITY) - message_admins("Number of candidates [LAZYLEN(candies)]") + //message_admins("Number of candidates [LAZYLEN(candies)]") if(LAZYLEN(candies) && src.playerClone == FALSE) //If there's candidates, clone the person and put them in there! - message_admins("Candidate found!") + message_admins("Candidate found! [candies] is becomeing a clone of [M]! Hee~!! Exciting!!") to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") //var/typepath = owner.type //clone = new typepath(owner.loc) @@ -420,6 +422,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.adjustBruteLoss(-1, 0) M.adjustFireLoss(-1, 0) M.heal_bodypart_damage(1,1) + M.reagents.remove_reagent(src.id, 1)//faster rate of loss. else //If there's no ghosts, but they've made a large amount, then proceed to make flavourful clone, where you become fat and useless until you split. switch(current_cycle) if(21) @@ -448,7 +451,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(87 to INFINITY) M.reagents.remove_reagent(src.id, 1000)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. message_admins("Purging SGDF [volume]") - message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") + //message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77") ..() @@ -1470,6 +1473,10 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y /datum/reagent/fermi/fermiTest/on_new() ..() + if(LAZYLEN(holder.reagent_list) == 1) + return + else + holder.remove_reagent(src.id, 1000)//Avoiding recurrsion message_admins("FermiTest addition!") var/location = get_turf(holder.my_atom) if(purity < 0.34 || purity == 1) From e86585935f809c86c67294d358767cc2b902334c Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 22 May 2019 02:25:05 +0100 Subject: [PATCH 137/608] MidFix - compile unsafe. --- code/modules/surgery/organs/vocal_cords.dm | 38 +++++++++---------- .../code/datums/status_effects/chems.dm | 23 ++++++++--- .../code/modules/arousal/organs/breasts.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 13 +++++-- .../reagents/chemistry/recipes/fermi.dm | 5 +++ 5 files changed, 51 insertions(+), 30 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 7844ab860b..a668fdea6d 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -854,10 +854,10 @@ if (L.canbearoused) //E.resistanceTally -= 1 L.adjustArousalLoss(1*power_multiplier) - addtimer(CALLBACK(L, .proc.to_chat, "[E.enthrallGender] has praised me!!"), 5) + addtimer(CALLBACK(L, L.to_chat, "[E.enthrallGender] has praised me!!"), 5) else E.resistanceTally /= 2*power_multiplier - addtimer(CALLBACK(L, .proc.to_chat, "I've been praised for doing a good job!"), 5) + addtimer(CALLBACK(L, L.to_chat, "I've been praised for doing a good job!"), 5) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise) E.cooldown += 1 @@ -871,10 +871,10 @@ if (L.canbearoused) E.resistanceTally /= 1*power_multiplier L.adjustArousalLoss(-2*power_multiplier) - addtimer(CALLBACK(L, .proc.to_chat, "I've let [E.enthrallGender] down..."), 5) + addtimer(CALLBACK(L, L.to_chat, "I've let [E.enthrallGender] down..."), 5) else E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously) - addtimer(CALLBACK(L, .proc.to_chat, "I've failed [E.master]..."), 5) + addtimer(CALLBACK(L, L.to_chat, "I've failed [E.master]..."), 5) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold) E.cooldown += 1 @@ -900,9 +900,9 @@ E.phase = 3 E.status = null if(L.canbearoused) - addtimer(CALLBACK(L, .proc.to_chat, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) + addtimer(CALLBACK(L, L.to_chat, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) else - addtimer(CALLBACK(L, .proc.to_chat, "The snapping of [E.master]'s fingers brings you back to being under their command."), 5) + addtimer(CALLBACK(L, L.to_chat, "The snapping of [E.master]'s fingers brings you back to being under their command."), 5) //to_chat(L, ) @@ -956,9 +956,9 @@ E.phase = 0 E.cooldown = 0 if(C.canbearoused) - addtimer(CALLBACK(C, .proc.to_chat, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) + addtimer(CALLBACK(C, C.to_chat, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) else - addtimer(CALLBACK(C, .proc.to_chat, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) + addtimer(CALLBACK(C, C.to_chat, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) //ATTRACT else if((findtext(message, attract_words))) @@ -1093,6 +1093,7 @@ to_chat(user, "You need to be next to your pet to give them a new trigger!") return else + user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") if (E.mental_capacity >= 10) var/trigger = stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN) var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) @@ -1118,7 +1119,7 @@ to_chat(user, "You need to be next to your pet to give them a new objective!") return else - user.emote(user, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") + user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") if (E.mental_capacity >= 150 || message == "objective") var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", MAX_MESSAGE_LEN) if(!LAZYLEN(objective)) @@ -1145,15 +1146,12 @@ if(E.phase > 1) if(user.ckey == E.enthrallID && user.real_name == E.master.real_name) E.master = user - if(H.canbearoused) - addtimer(CALLBACK(H, .proc.to_chat, "You hear the words of your [E.enthrallID] again!! They're back!!"), 5) - else - addtimer(CALLBACK(H, .proc.to_chat, "You recognise the words of [user], and comply with their orders oncemore."), 5)//It's a bit like a job, It's a living. + addtimer(CALLBACK(C, C.to_chat, "You hear the words of your [E.enthrallGender] again!! They're back!!"), 5) //I dunno how to do state objectives without them revealing they're an antag //HEAL (maybe make this nap instead?) - else if((findtext(message, heal_words))) + else if(findtext(message, heal_words)) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) @@ -1174,7 +1172,7 @@ E.cooldown += 8 //HALLUCINATE - else if((findtext(message, hallucinate_words))) + else if(findtext(message, hallucinate_words)) for(var/V in listeners) var/mob/living/carbon/C = V var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) @@ -1183,7 +1181,7 @@ new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) //HOT - else if((findtext(message, hot_words))) + else if(findtext(message, hot_words)) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) @@ -1193,7 +1191,7 @@ to_chat(L, "You feel your metabolism speed up!") //COLD - else if((findtext(message, cold_words))) + else if(findtext(message, cold_words)) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) @@ -1204,7 +1202,7 @@ //GET UP - else if((findtext(message, getup_words))) + else if(findtext(message, getup_words)) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) @@ -1218,7 +1216,7 @@ E.cooldown += 10 //This could be really strong //PACIFY - else if((findtext(message, pacify_words))) + else if(findtext(message, pacify_words)) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) @@ -1228,7 +1226,7 @@ E.cooldown += 10 //CHARGE - else if((findtext(message, charge_words))) + else if(findtext(message, charge_words)) for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 50291ca20e..8e88cead93 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -158,6 +158,17 @@ /////////////////////////////////////////// */ +//Preamble +/datum/mob/living/carbon/ + var/lewd = TRUE //Maybe false? + +/mob/living/carbon/verb/toggle_lewd() + set category = "IC" + set name = "toggle lewdchem" + set desc = "Allows you to toggle if you'd like lewd flavour messages." + lewd = !(lewd) + to_chat(usr, "You [(lewd?"will":"no longer")] receive lewdchem messages.") + /datum/status_effect/chem/enthrall id = "enthrall" alert_type = null @@ -190,6 +201,8 @@ /datum/status_effect/chem/enthrall/on_apply() var/mob/living/carbon/M = owner var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list + if(!E.creatorID) + message_admins("WARNING: FermiChem No master found in thrall, this makes me max sad.") enthrallID = E.creatorID enthrallGender = E.creatorGender master = get_mob_by_key(enthrallID) @@ -259,7 +272,7 @@ to_chat(owner, "You're now free of [master]'s influence, and fully independant oncemore.'") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) - if(owner.canbearoused) + if(owner.lewd) to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") if (2) //partially enthralled if (enthrallTally > 150) @@ -276,16 +289,16 @@ to_chat(owner, "You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [master].") //owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment, if(prob(10)) - if(owner.canbearoused) + if(owner.lewd) to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (3)//fully entranced - if (resistanceTally >= 200 && withdrawalTick >= 150) + if ((resistanceTally >= 200 && withdrawalTick >= 150) || (M.has_trait(TRAIT_MINDSHIELD) && resistanceTally >= 100)) enthrallTally = 0 phase -= 1 resistanceTally = 0 to_chat(owner, "The separation from you [enthrallGender] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") if(prob(2)) - if(owner.canbearoused) + if(owner.lewd) to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !owner.reagents.has_reagent("MKUltra")) @@ -446,7 +459,7 @@ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing4") qdel(redirect_component.resolve()) redirect_component = null //qdel(redirect_component2.resolve()) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 5dfbaab64b..d8aaf3afab 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -84,7 +84,7 @@ prev_size = size return //message_admins("Breast size at start: [size], [cached_size], [owner]") - if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!! + if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!(Why does this runtime??) to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") src.Remove(owner) switch(round(cached_size)) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 3842342f97..4853b75f2e 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -57,10 +57,10 @@ return //When merging two fermichems -/datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity) +/datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity)//basically on_mob_add but for merging . = ..() message_admins("purity of chem is [purity]") - if(!M) + if(!istype(M, datum/mob/living/carbon/M)) return message_admins("purity of chem is [purity]") if (purity < 0) @@ -187,6 +187,8 @@ M.Stun(40) var/items = M.get_contents() + if(!LAZYLEN(items)) + return ..()//This'll work, right? var/obj/item/I = pick(items) M.dropItemToGround(I, TRUE) do_sparks(5,FALSE,I) @@ -1158,9 +1160,11 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y return var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)//If purity is over 5, works as intended if(!E) + E = null M.reagents.remove_reagent(src.id, 10) M.apply_status_effect(/datum/status_effect/chem/enthrall) message_admins("No enthrall status found in [M]!") + var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) E.enthrallTally += 1 if(prob(50)) M.adjustBrainLoss(0.1)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it. @@ -1476,7 +1480,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y if(LAZYLEN(holder.reagent_list) == 1) return else - holder.remove_reagent(src.id, 1000)//Avoiding recurrsion + holder.remove_reagent("fermiTest", 1000)//Avoiding recurrsion message_admins("FermiTest addition!") var/location = get_turf(holder.my_atom) if(purity < 0.34 || purity == 1) @@ -1499,7 +1503,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y to_chat(M, "The solution reacts dramatically, with a meow!") playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) holder.clear_reagents() - +/* /datum/reagent/fermi/fermiTest/on_merge() ..() message_admins("FermiTest addition!") @@ -1524,3 +1528,4 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y to_chat(M, "The solution reacts dramatically, with a meow!") playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) holder.clear_reagents() + */ diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index aecd0ba029..680a5018d2 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -247,6 +247,11 @@ message_admins("On finish for enthral proc'd") var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list + if(!B.data) + var/list/seen = viewers(5, get_turf(holder.my_atom)) + for(var/mob/M in seen) + to_chat(M, "The reaction splutters and fails to react.") + E.purity = 0 if (B.data.["gender"] == "female") E.data.["creatorGender"] = "Mistress" E.creatorGender = "Mistress" From 7cb7f5de7386e41387132ce12d2259d13e30f9fb Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 22 May 2019 16:50:53 +0100 Subject: [PATCH 138/608] Update of master required. --- code/modules/reagents/reagent_containers.dm | 4 +- code/modules/surgery/organs/lungs.dm | 9 +- code/modules/surgery/organs/vocal_cords.dm | 128 ++++++------ .../code/datums/mood_events/chem_events.dm | 56 +++-- .../code/datums/status_effects/chems.dm | 191 ++++++++++-------- .../code/modules/arousal/organs/breasts.dm | 2 + .../chemistry/reagents/fermi_reagents.dm | 16 +- 7 files changed, 225 insertions(+), 181 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 03bbd6f6a8..1fb1759865 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -44,7 +44,7 @@ /obj/item/reagent_containers/attack(mob/M, mob/user, def_zone) if(user.a_intent == INTENT_HARM) return ..() - +/*Checking to see if I can delete this /obj/item/reagent_containers/attack(obj/item/W, mob/user, params) ..() if(!istype(W, /obj/item/pHpaper)) @@ -85,7 +85,7 @@ if(-INFINITY to 1) P.color = "#ef1d26" P.used = TRUE - +*/ /obj/item/reagent_containers/proc/canconsume(mob/eater, mob/user) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index cc33188a26..f93e1d8236 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -88,6 +88,7 @@ /obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) //TODO: add lung damage = less oxygen gains + var/breathModifier = (5-(5*(damage/maxHealth)/2)) //range 2.5 - 5 if((H.status_flags & GODMODE)) return if(H.has_trait(TRAIT_NOBREATH)) @@ -158,7 +159,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5) //More damaged lungs = slower oxy rate up to a factor of half + H.adjustOxyLoss(breathModifier) //More damaged lungs = slower oxy rate up to a factor of half gas_breathed = breath_gases[/datum/gas/oxygen][MOLES] H.clear_alert("not_enough_oxy") @@ -187,7 +188,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5) + H.adjustOxyLoss(breathModifier) gas_breathed = breath_gases[/datum/gas/nitrogen][MOLES] H.clear_alert("nitro") @@ -224,7 +225,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5) + H.adjustOxyLoss(breathModifier) gas_breathed = breath_gases[/datum/gas/carbon_dioxide][MOLES] H.clear_alert("not_enough_co2") @@ -254,7 +255,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-5) + H.adjustOxyLoss(breathModifier) gas_breathed = breath_gases[/datum/gas/plasma][MOLES] H.clear_alert("not_enough_tox") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index a668fdea6d..30ccf16c7e 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -671,8 +671,7 @@ ////////////////////////////////////// //Removed span_list from input arguments. //mob/living/user /proc/velvetspeech(message, mob/living/user, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE, debug = FALSE) - message_admins("Velvet speech proc'd on [user]") - var/cooldown = 0 + //message_admins("Velvet speech proc'd on [user]") if(!user || !user.can_speak() || user.stat) return 0 //no cooldown @@ -708,8 +707,7 @@ listeners += L if(!listeners.len) - cooldown = 0 - return cooldown + return 0 //POWER CALCULATIONS @@ -768,7 +766,7 @@ if(specific_listeners.len) listeners = specific_listeners //power_multiplier *= (1 + (1/specific_listeners.len)) //Put this is if it becomes OP, power is judged internally on a thrall, so shouldn't be nessicary. - message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1) + message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1)//I have no idea what this does var/obj/item/organ/tongue/T = user.getorganslot(ORGAN_SLOT_TONGUE) if (T.name == "fluffy tongue") //If you sound hillarious, it's hard to take you seriously. This is a way for other players to combat/reduce their effectiveness. @@ -841,7 +839,8 @@ else E.enthrallTally += power_multiplier*1.25 if(L.canbearoused) - addtimer(CALLBACK(L, .proc.to_chat, "[E.master] is so nice to listen to."), 5) + if(L.lewd) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.master] is so nice to listen to."), 5) E.cooldown += 1 //REWARD mixable works @@ -851,14 +850,16 @@ var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, V)+1] //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values - if (L.canbearoused) - //E.resistanceTally -= 1 - L.adjustArousalLoss(1*power_multiplier) - addtimer(CALLBACK(L, L.to_chat, "[E.enthrallGender] has praised me!!"), 5) + if (L.lewd) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] has praised me!!"), 5) + if(L.has_trait(TRAIT_NYMPHO)) + L.adjustArousalLoss(2*power_multiplier) else - E.resistanceTally /= 2*power_multiplier - addtimer(CALLBACK(L, L.to_chat, "I've been praised for doing a good job!"), 5) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've been praised for doing a good job!"), 5) + E.resistanceTally -= power_multiplier + E.enthrallTally += 1 + var/descmessage = "[(L.lewd?"I feel so happy! I'm a good pet who [E.enthrallGender] loves!":"I did a good job!")]" + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise, descmessage) E.cooldown += 1 //PUNISH mixable works @@ -868,14 +869,16 @@ var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, V)+1] //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values - if (L.canbearoused) + if (L.lewd) E.resistanceTally /= 1*power_multiplier - L.adjustArousalLoss(-2*power_multiplier) - addtimer(CALLBACK(L, L.to_chat, "I've let [E.enthrallGender] down..."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've let [E.enthrallGender] down..."), 5) else - E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously) - addtimer(CALLBACK(L, L.to_chat, "I've failed [E.master]..."), 5) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've failed [E.master]..."), 5) + + var/descmessage = "[(L.lewd?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]" + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallscold", /datum/mood_event/enthrallscold, descmessage) + E.resistanceTally += 1 + E.enthrallTally += power_multiplier E.cooldown += 1 //teir 0 @@ -885,10 +888,11 @@ var/mob/living/carbon/C = V var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) C.remove_trait(TRAIT_MUTE, "enthrall") - if(C.canbearoused) + if(C.lewd) addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.enthrallGender]"), 5) else - addtimer(CALLBACK(C, /atom/movable/proc/say, "My director."), 5) + addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.master]"), 5)//The least lewdest I could think of + //WAKE UP else if((findtext(message, wakeup_words))) for(var/V in listeners) @@ -899,10 +903,11 @@ if(0) E.phase = 3 E.status = null - if(L.canbearoused) - addtimer(CALLBACK(L, L.to_chat, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) + user.emote("snap") + if(L.lewd) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5) else - addtimer(CALLBACK(L, L.to_chat, "The snapping of [E.master]'s fingers brings you back to being under their command."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of [E.master]'s fingers brings you back to being under their command."), 5) //to_chat(L, ) @@ -922,9 +927,10 @@ else if((findtext(message, silence_words))) for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) - C.remove_trait(TRAIT_MUTE, TRAUMA_TRAIT) + C.remove_trait(TRAIT_MUTE, "enthrall") E.cooldown += 3 + //Antiresist else if((findtext(message, antiresist_words))) for(var/V in listeners) @@ -940,25 +946,27 @@ var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) power_multiplier *= distancelist[get_dist(user, C)+1] E.deltaResist += (power_multiplier) + E.owner_resist() E.cooldown += 2 + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You are spurred into resisting from [user]'s words!'"), 5) //FORGET (A way to cancel the process) else if((findtext(message, forget_words))) for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) - to_chat(C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!") + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!"), 5) C.Sleeping(50) switch(E.phase) if(1 to 2) E.phase = -1 - to_chat(C, "You have no recollection of being enthralled by [E.master]") + to_chat(C, "You have no recollection of being enthralled by [E.master]!") if(3) E.phase = 0 E.cooldown = 0 - if(C.canbearoused) - addtimer(CALLBACK(C, C.to_chat, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) + if(C.lewd) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) else - addtimer(CALLBACK(C, C.to_chat, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) //ATTRACT else if((findtext(message, attract_words))) @@ -967,6 +975,7 @@ var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) L.throw_at(get_step_towards(user,L), 3 * power_multiplier, 1 * power_multiplier) E.cooldown += 3 + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You are drawn towards [user]!"), 5) //teir 2 @@ -978,16 +987,12 @@ var/mob/living/carbon/human/H = V var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase > 1) - if(H.canbearoused) // probably a redundant check but for good measure + if(H.has_trait(TRAIT_NYMPHO) && H.canbearoused) // probably a redundant check but for good measure H.mob_climax(forced_climax=TRUE) H.setArousalLoss(H.min_arousal) E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). E.enthrallTally += power_multiplier - else - E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so). - E.enthrallTally += power_multiplier*1.1 - to_chat(H, "Your Masters command whites out your mind in bliss!") - E.cooldown += 6 + E.cooldown += 6 //awoo @@ -1007,9 +1012,8 @@ var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) - var/mob/living/M = V - playsound(get_turf(M), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) - M.emote(M, 1, "lets out a nya!") + playsound(get_turf(H), pick('sound/effects/meow1.ogg', 'modular_citadel/sound/voice/nya.ogg'), 50, 1, -1) + H.emote("me", 1, "lets out a nya!") E.cooldown += 1 //SLEEP @@ -1018,7 +1022,7 @@ var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(2 to INFINITY) - C.Sleeping(20 * power_multiplier) + C.Sleeping(30 * power_multiplier) E.cooldown += 10 //STRIP @@ -1030,9 +1034,10 @@ if(2 to INFINITY)//Tier 2 only E.phase = 1 var/items = H.get_contents() - for(var/I in items) - H.dropItemToGround(I, TRUE) - to_chat(H, "Before you can even think about it, you quickly remove your clothes in response to your Master's command.") + for(var/obj/item/W in items) + if(W == H.w_uniform || W == H.wear_suit) + H.dropItemToGround(W, TRUE) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Before you can even think about it, you quickly remove your clothes in response to [(H.lewd?"your [E.enthrallGender]'s command'":"[E.master]'s directive'")]."), 5) E.cooldown += 10 //WALK doesn't work? @@ -1066,6 +1071,7 @@ if(3 to INFINITY)//Tier 2 only L.Knockdown(30 * power_multiplier * E.phase) E.cooldown += 8 + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You suddenly drop to the ground!'"), 5) //tier3 @@ -1074,13 +1080,13 @@ for(var/V in listeners) var/speaktrigger = "" var/mob/living/carbon/C = V - var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall)//i.e. if it's not empty - for (var/trigger in E.customTriggers) - speaktrigger += "[trigger], " - if(!speaktrigger == "") - C.add_trait(TRAIT_DEAF, "Triggers") //So you don't trigger yourself! - addtimer(CALLBACK(C, /atom/movable/proc/say, "[speaktrigger]"), 5) - C.remove_trait(TRAIT_DEAF, "Triggers") + var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) + if (E.phase > 3) + for (var/trigger in E.customTriggers) + speaktrigger += "[trigger], " + C.add_trait(TRAIT_DEAF, "Triggers") //So you don't trigger yourself! + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, /atom/movable/proc/say, "[speaktrigger]"), 5) + C.remove_trait(TRAIT_DEAF, "Triggers") //CUSTOM TRIGGERS @@ -1097,6 +1103,7 @@ if (E.mental_capacity >= 10) var/trigger = stripped_input(user, "Enter the trigger phrase", MAX_MESSAGE_LEN) var/trigger2 = stripped_input(user, "Enter the effect.", MAX_MESSAGE_LEN) + trigger2 = lowertext(trigger2) if ((findtext(trigger2, custom_words_words))) if (trigger2 == "speak" || trigger2 == "echo") var/trigger3 = stripped_input(user, "Enter the phrase spoken.", MAX_MESSAGE_LEN) @@ -1104,6 +1111,7 @@ else E.customTriggers[trigger] = trigger2 E.mental_capacity -= 10 + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.lewd?"your [E.enthrallGender]":"[E.master]")] whispers you a new trigger."), 5) else to_chat(user, "Your pet looks at you confused, it seems they don't understand that effect!") else @@ -1120,7 +1128,7 @@ return else user.emote(user, 1, "puts their hands upon [H.name]'s head and looks deep into their eyes, whispering something to them.'") - if (E.mental_capacity >= 150 || message == "objective") + if (E.mental_capacity >= 250 || message == "objective") var/datum/objective/brainwashing/objective = stripped_input(user, "Add an objective to give your pet.", MAX_MESSAGE_LEN) if(!LAZYLEN(objective)) return @@ -1130,9 +1138,9 @@ objective = replacetext(lowertext(objective), "harm", "snuggle") objective = replacetext(lowertext(objective), "decapitate", "headpat") objective = replacetext(lowertext(objective), "strangle", "meow at") - to_chat(H, "Your master whispers you a new objective.") + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.lewd?"your [E.enthrallGender]":"[E.master]")] whispers you a new objective."), 5) brainwash(H, objective) - E.mental_capacity -= 150 + E.mental_capacity -= 250 //else if (E.mental_capacity >= 150) else to_chat(user, "Your pet looks at you with a vacant blasé expression, you don't think you can program anything else into them") @@ -1146,7 +1154,7 @@ if(E.phase > 1) if(user.ckey == E.enthrallID && user.real_name == E.master.real_name) E.master = user - addtimer(CALLBACK(C, C.to_chat, "You hear the words of your [E.enthrallGender] again!! They're back!!"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.lewd?"You hear the words of your [E.enthrallGender] again!! They're back!!":"You recognise the voice of [E.master].")]"), 5) //I dunno how to do state objectives without them revealing they're an antag @@ -1160,6 +1168,8 @@ E.status = "heal" E.statusStrength = (5 * power_multiplier) E.cooldown += 5 + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You begin to lick your wounds."), 5) + L.Stun(40) //STUN else if(findtext(message, stun_words)) @@ -1168,8 +1178,9 @@ var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) switch(E.phase) if(3 to INFINITY)//Tier 3 only - L.Stun(30 * power_multiplier) + L.Stun(40 * power_multiplier) E.cooldown += 8 + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You freeze up!"), 5) //HALLUCINATE else if(findtext(message, hallucinate_words)) @@ -1188,7 +1199,7 @@ switch(E.phase) if(3 to INFINITY)//Tier 3 only L.adjust_bodytemperature(10 * power_multiplier)//This seems nuts, reduced it - to_chat(L, "You feel your metabolism speed up!") + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You feel your metabolism speed up!"), 5) //COLD else if(findtext(message, cold_words)) @@ -1198,7 +1209,7 @@ switch(E.phase) if(3 to INFINITY)//Tier 3 only L.adjust_bodytemperature(-10 * power_multiplier)//This - to_chat(L, "You feel your metabolism slow down!") + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You feel your metabolism slow down!"), 5) //GET UP @@ -1214,6 +1225,7 @@ L.SetKnockdown(0) L.SetUnconscious(0) //i said get up i don't care if you're being tased E.cooldown += 10 //This could be really strong + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You jump to your feel from sheer willpower!"), 5) //PACIFY else if(findtext(message, pacify_words)) @@ -1331,7 +1343,7 @@ if(message_admins) message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") log_game("[key_name(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") - SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) + //SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) If this is on, it fills the thing up and OOFs the server return diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm index c194605e9f..4e1be8d67f 100644 --- a/modular_citadel/code/datums/mood_events/chem_events.dm +++ b/modular_citadel/code/datums/mood_events/chem_events.dm @@ -1,41 +1,55 @@ /datum/mood_event/eigenstate - mood_change = -1 + mood_change = -3 description = "Where the hell am I? Is this an alternative dimension ?\n" /datum/mood_event/enthrall - mood_change = 5 - description = "I am a good pet for Master.\n" + mood_change = 5 + +/datum/mood_event/enthrall/add_effects(message) + description = "[message]\n" /datum/mood_event/enthrallpraise - mood_change = 12 - description = "I feel so happy! I'm a good pet who Master loves!\n" - timeout = 600 + mood_change = 10 + timeout = 600 + +/datum/mood_event/enthrallpraise/add_effects(message) + description = "[message]\n" /datum/mood_event/enthrallscold - mood_change = -12 - description = "I've failed Master... What a bad, bad pet!\n"//aaa I'm not kinky enough for this - timeout = 600 + mood_change = -10 + timeout = 600 + +/datum/mood_event/enthrallscold/add_effects(message) + description = "[message]\n"//aaa I'm not kinky enough for this /datum/mood_event/enthrallmissing1 - mood_change = -5 - description = "I feel empty when Master's not around..\n" + mood_change = -5 + +/datum/mood_event/enthrallmissing1/add_effects(message) + description = "[message]\n" /datum/mood_event/enthrallmissing2 - mood_change = -10 - description = "I feel so lost in this complicated world without Master, where are they?!\n" + mood_change = -10 + +/datum/mood_event/enthrallmissing2/add_effects(message) + description = "[message]\n" /datum/mood_event/enthrallmissing3 - mood_change = -15 - description = "Where are you Master??!\n" + mood_change = -15 + +/datum/mood_event/enthrallmissing3/add_effects(message) + description = "[message]\n" /datum/mood_event/enthrallmissing4 - mood_change = -25 - description = "I'm all alone, It's so hard to continute without Master...\n" + mood_change = -25 + +/datum/mood_event/enthrallmissing4/add_effects(message) + description = "[message]\n" /datum/mood_event/InLove - mood_change = 10 - description = "I'm in love!!\n" + mood_change = 10 + description = "I'm in love!!\n" /datum/mood_event/MissingLove - mood_change = -20 - description = "I can't keep my crush off my mind, I need to see them again!\n" + mood_change = -20 + description = "I can't keep my crush off my mind, I need to see them again!\n" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 8e88cead93..3a0a11ddf5 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -159,10 +159,10 @@ */ //Preamble -/datum/mob/living/carbon/ +/mob/living var/lewd = TRUE //Maybe false? -/mob/living/carbon/verb/toggle_lewd() +/mob/living/verb/toggle_lewd() set category = "IC" set name = "toggle lewdchem" set desc = "Allows you to toggle if you'd like lewd flavour messages." @@ -197,6 +197,7 @@ var/list/customTriggers = list() //the list of custom triggers (maybe have to split into two) var/cooldown = 0 var/cooldownMsg = TRUE + var/cTriggered = FALSE /datum/status_effect/chem/enthrall/on_apply() var/mob/living/carbon/M = owner @@ -215,12 +216,14 @@ redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# //redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed //redirect_component3 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_HEAR = CALLBACK(src, .proc/owner_hear)))) //Do resistance calc if resist is pressed - RegisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL, .proc/owner_say) + //RegisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL, .proc/owner_say) RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear) //Might need to add redirect component for listening too. var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! mental_capacity = 500 - B.get_brain_damage() - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall) + var/message = "[(owner.lewd?"I am a good pet for [enthrallGender].":"I find enjoyment in fulfilling the requests of [master] and I am appreciative of being in this position currently with no desire for this to change.")]" + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) + to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can still repeatedly resist their effects! (Mash resist to fight back!!)") return ..() /datum/status_effect/chem/enthrall/tick() @@ -263,7 +266,10 @@ mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. resistanceTally /= 2 enthrallTally = 0 - to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") + if(owner.lewd) + to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") + else + else if (resistanceTally > 100) enthrallTally *= 0.5 phase = -1 @@ -280,13 +286,17 @@ mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 resistanceTally /= 2 - to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") - to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are much less likely to resort to violence, unless it is to defend your [enthrallGender]. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. + if(owner.lewd) + to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") + to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. + else + to_chat(owner, "You are unable to put up a resistance any longer, and now are under the control of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [master] in death. ") + owner.add_trait(TRAIT_PACIFISM, "MKUltra") else if (resistanceTally > 150) enthrallTally *= 0.5 phase -= 1 resistanceTally = 0 - to_chat(owner, "You manage to shake some of the entrancement from your addled mind, however you can still feel yourself drawn towards [master].") + to_chat(owner, "You manage to shake some of the effects from your addled mind, however you can still feel yourself drawn towards [master].") //owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment, if(prob(10)) if(owner.lewd) @@ -296,12 +306,13 @@ enthrallTally = 0 phase -= 1 resistanceTally = 0 - to_chat(owner, "The separation from you [enthrallGender] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") + to_chat(owner, "The separation from [(owner.lewd?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") + owner.remove_trait(TRAIT_PACIFISM, "MKUltra") if(prob(2)) if(owner.lewd) to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken - if (mental_capacity >= 499 || owner.getBrainLoss() >=20 || !owner.reagents.has_reagent("MKUltra")) + if (mental_capacity >= 499 && (owner.getBrainLoss() >=20 || M.has_trait(TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra")) phase = 2 mental_capacity = 500 customTriggers = list() @@ -333,36 +344,48 @@ //Withdrawal subproc: if (withdrawal == TRUE)//Your minions are really REALLY needy. switch(withdrawalTick)//denial + if(5)//To reduce spam + to_chat(owner, "You are unable to complete your [master]'s orders without their presence, and any commands given to you prior are not in effect until you are back with them.") if(10 to 35)//Gives wiggle room, so you're not SUPER needy if(prob(5)) - to_chat(owner, "You're starting to miss your [enthrallGender].") + to_chat(owner, "You're starting to miss [(owner.lewd?"your [enthrallGender]":"[master]")].") if(prob(5)) owner.adjustBrainLoss(0.5) - to_chat(owner, "Master will surely be back soon") //denial + to_chat(owner, "[(owner.lewd?"[enthrallGender]":"[master]")] will surely be back soon") //denial if(36) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1) + var/message = "[(owner.lewd?"I feel empty when [enthrallGender]'s not around..":"I miss [master]'s presence")]" + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1, message) if(37 to 65)//barganing if(prob(10)) to_chat(owner, "They are coming back, right...?") owner.adjustBrainLoss(1) if(prob(10)) - to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.") + if(owner.lewd) + to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.") owner.adjustBrainLoss(-1) if(66) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") //Why does this not work? - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") + var/message = "[(owner.lewd?"I feel so lost in this complicated world without [enthrallGender]..":"I have to return to [master]!")]" + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2, message) owner.stuttering += 200 owner.jitteriness += 200 if(67 to 90) //anger if(prob(10)) addtimer(CALLBACK(M, /mob/verb/a_intent_change, INTENT_HARM), 2) addtimer(CALLBACK(M, /mob/proc/click_random_mob), 2) - to_chat(owner, "You are overwhelmed with anger at the lack of [enthrallGender]'s presence and suddenly lash out!") + if(owner.lewd) + to_chat(owner, "You are overwhelmed with anger at the lack of [enthrallGender]'s presence and suddenly lash out!") + else + to_chat(owner, "You are overwhelmed with anger and suddenly lash out!") owner.adjustBrainLoss(1) if(90) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") //Why does this not work? - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing3", /datum/mood_event/enthrallmissing3) - to_chat(owner, "You need to find your [enthrallGender] at all costs, you can't hold yourself back anymore.") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") + var/message = "[(owner.lewd?"Where are you [enthrallGender]??!":"I need to find [master]!")]" + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing3", /datum/mood_event/enthrallmissing3, message) + if(owner.lewd) + to_chat(owner, "You need to find your [enthrallGender] at all costs, you can't hold yourself back anymore!") + else + to_chat(owner, "You need to find [master] at all costs, you can't hold yourself back anymore!") if(91 to 120)//depression if(prob(20)) owner.adjustBrainLoss(2.5) @@ -372,13 +395,17 @@ M.hallucination += 20 if(121) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4) + var/message = "[(owner.lewd?"I'm all alone, It's so hard to continute without [enthrallGender]...":"I really need to find [master]!!!")]" + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4, message) to_chat(owner, "You can hardly find the strength to continue without your [enthrallGender].") if(120 to 140) //depression if(prob(15)) owner.Stun(50) owner.emote("cry")//does this exist? - to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.") + if(owner.lewd) + to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.") + else + to_chat(owner, "You are overwheled with withdrawl from [master].") owner.adjustBrainLoss(5) owner.stuttering += 20 owner.jitteriness += 20 @@ -388,7 +415,10 @@ if(prob(15)) deltaResist += 5 if(prob(20)) - to_chat(owner, "Maybe you'll be okay without your [enthrallGender].") + if(owner.lewd) + to_chat(owner, "Maybe you'll be okay without your [enthrallGender].") + else + to_chat(owner, "You feel your mental functions slowly begin to return.") if(prob(10)) owner.adjustBrainLoss(2) M.hallucination += 50 @@ -402,7 +432,7 @@ if(status == "Antiresist") if (statusStrength < 0) status = null - to_chat(owner, "You feel able to resist oncemore.") + to_chat(owner, "Your mind feels able to resist oncemore.") else statusStrength -= 1 @@ -418,20 +448,23 @@ else if(status == "charge") owner.add_trait(TRAIT_GOTTAGOFAST, "MKUltra") status = "charged" - to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") + if(master.lewd) + to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") + else + to_chat(owner, "[master]'s command fills you with a burst of speed!") else if (status == "charged") if (statusStrength < 0) status = null owner.remove_trait(TRAIT_GOTTAGOFAST, "MKUltra") - owner.Knockdown(30) + owner.Knockdown(50) to_chat(owner, "Your body gives out as the adrenaline in your system runs out.") else statusStrength -= 1 cooldown += 1 //Cooldown doesn't process till status is done else if (status == "pacify") - owner.add_trait(TRAIT_PACIFISM, "MKUltra") + owner.add_trait(TRAIT_PACIFISM, "MKUltraStatus") status = null //Truth serum? @@ -443,14 +476,18 @@ resistanceTally += deltaResist deltaResist = 0 if (cooldown > 0) - cooldown -= (1 + (mental_capacity/1000 )) + cooldown -= (1 + (mental_capacity/1000)) cooldownMsg = FALSE else if (cooldownMsg == FALSE) - to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") + if(master.lewd) + to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") + else + to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") cooldownMsg = TRUE cooldown = 0 //..() +//Remove all stuff /datum/status_effect/chem/enthrall/on_remove() var/mob/living/carbon/M = owner SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall") @@ -462,12 +499,9 @@ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing4") qdel(redirect_component.resolve()) redirect_component = null - //qdel(redirect_component2.resolve()) - //redirect_component2 = null UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) - UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) - //qdel(redirect_component3.resolve()) - //redirect_component3 = null + owner.remove_trait(TRAIT_PACIFISM, "MKUltra") + //UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) /* /datum/status_effect/chem/enthrall/mob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) @@ -479,7 +513,8 @@ //WORKS!! AAAAA /datum/status_effect/chem/enthrall/proc/owner_hear(var/hearer, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - //message_admins("post: hear:[hearer], msg:[message], spk:[speaker], lng:[message_language], raw:[raw_message], freq:[radio_freq], spen:[spans], mod:[message_mode]") + if (cTriggered == TRUE) + return var/mob/living/carbon/C = owner //message_admins("[C] heard something!") raw_message = lowertext(raw_message) @@ -488,10 +523,14 @@ //message_admins("[C] heard something: [message] vs [trigger] vs [raw_message]") if (findtext(raw_message, cached_trigger))//if trigger1 is the message message_admins("[C] has been triggered with [trigger]!") + cTriggered = TRUE //Speak (Forces player to talk) works if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2 - to_chat(C, "Your body moves on it's own before you can even catch it. You find yourself fully believing in the validity of what you just said and don't think to question it.") + var/saytext = "Your mouth moves on it's own before you can even catch it." + if(M.has_trait(TRAIT_NYMPHO)) + saytext += " You find yourself fully believing in the validity of what you just said and don't think to question it." + to_chat(C, "[saytext]") (C.say(customTriggers[trigger][2]))//trigger3 @@ -510,7 +549,7 @@ //wah intensifies wah-rks else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - if (C.canbearoused) + if (M.has_trait(TRAIT_NYMPHO)) if (C.getArousalLoss() > 80) C.mob_climax(forced_climax=TRUE) else @@ -520,11 +559,12 @@ //kneel (knockdown) else if (lowertext(customTriggers[trigger]) == "kneel")//as close to kneeling as you can get, I suppose. + to_chat(owner, "You drop to the ground unsurreptitiously.") C.resting = 1 C.lying = 1 //strip (some) clothes - else if (lowertext(customTriggers[trigger]) == "strip")//This wasn't meant to just be a lewd thing oops + else if (lowertext(customTriggers[trigger]) == "strip")//This wasn't meant to just be a lewd thing oops, is this pref breaking? var/mob/living/carbon/human/o = owner var/items = o.get_contents() for(var/obj/item/W in items) @@ -533,13 +573,13 @@ to_chat(owner,"You feel compelled to strip your clothes.") //trance - else if (lowertext(customTriggers[trigger]) == "trance") + else if (lowertext(customTriggers[trigger]) == "trance")//Maaaybe too strong. var/mob/living/carbon/human/o = owner o.apply_status_effect(/datum/status_effect/trance, 200, TRUE) //add more fun stuff! - + cTriggered = FALSE return /* /datum/status_effect/chem/enthrall/proc/owner_withdrawal(mob/living/carbon/M) @@ -547,19 +587,29 @@ */ /datum/status_effect/chem/enthrall/proc/owner_resist() var/mob/living/carbon/M = owner + to_chat(owner, "You attempt to fight against against [(owner.lewd?"[enthrallGender]":"[master]")]'s influence!'") message_admins("Enthrall processing for [M]: enthrallTally: [enthrallTally], resistanceTally: [resistanceTally]") - message_admins("[M] is trying to resist!") + //message_admins("[M] is trying to resist!") if (status == "Sleeper" || phase == 0) return else if (phase == 4) - to_chat(owner, "Your mind is too far gone to even entertain the thought of resisting.") + if(owner.lewd) + to_chat(owner, "Your mind is too far gone to even entertain the thought of resisting. Unless you can fix the brain damage, you won't be able to break free of your [enthrallGender]'s control.") + else + to_chat(owner, "Your brain is too overwhelmed with from the high volume of chemicals in your system, rendering you unable to resist, unless you can fix the brain damage.") return else if (phase == 3 && withdrawal == FALSE) - to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance.") + if(owner.lewd) + to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance. Try getting away from them.") + else + to_chat(owner, "You are unable to resist [master] in your current state. Try getting away from them.") return else if (status == "Antiresist")//If ordered to not resist; resisting while ordered to not makes it last longer, and increases the rate in which you are enthralled. if (statusStrength > 0) - to_chat(owner, "The order from your [enthrallGender] to give in is conflicting with your attempt to resist, drawing you deeper into trance.") + if(owner.lewd) + to_chat(owner, "The order from your [enthrallGender] to give in is conflicting with your attempt to resist, drawing you deeper into trance! You'll have to wait a bit before attemping again, lest your attempts become frustrated again.") + else + to_chat(owner, "The order from your [master] to give in is conflicting with your attempt to resist. You'll have to wait a bit before attemping again, lest your attempts become frustrated again.") statusStrength += 1 enthrallTally += 1 return @@ -576,10 +626,10 @@ deltaResist *= 1.5 to_chat(owner, "You attempt to shake the mental cobwebs from your mind!") //base resistance - if (M.canbearoused) + if (M.canbearoused && M.has_trait(TRAIT_NYMPHO))//I'm okay with this being removed. deltaResist*= ((100 - M.arousalloss/100)/100)//more aroused you are, the weaker resistance you can give - else - deltaResist *= 0.5 + //else + // deltaResist *= 0.5 //chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist. if (owner.reagents.has_reagent("mannitol")) deltaResist *= 1.25 @@ -598,12 +648,12 @@ //Antag resistance //cultists are already brainwashed by their god if(iscultist(owner)) - deltaResist *= 2 + deltaResist *= 1.5 else if (is_servant_of_ratvar(owner)) - deltaResist *= 2 + deltaResist *= 1.5 //antags should be able to resist, so they can do their other objectives. This chem does frustrate them, but they've all the tools to break free when an oportunity presents itself. else if (owner.mind.assigned_role in GLOB.antagonists) - deltaResist *= 1.8 + deltaResist *= 1.4 //role resistance //Chaplains are already brainwashed by their god @@ -623,23 +673,23 @@ deltaResist += (250-owner.nutrition)/100 if(owner.health < 100)//Harming your thrall will make them rebel harder. deltaResist *= ((120-owner.health)/100)+1 + //if() //Add cold/hot, oxygen, sanity, happiness? (happiness might be moot, since the mood effects are so strong) //Mental health could play a role too in the other direction - //If master gives you a collar, you get a sense of pride + //If you've a collar, you get a sense of pride if(istype(M.wear_neck, /obj/item/clothing/neck/petcollar)) deltaResist *= 0.5 if(M.has_trait(TRAIT_MINDSHIELD)) - deltaResist += 1 - - if(owner.has_trait(TRAIT_CROCRIN_IMMUNE) || !owner.canbearoused) - deltaResist *= 0.75//Immune/asexual players are immune to the arousal based multiplier, this is to offset that so they can still be affected. Their unfamiliarty with desire makes it more on them. + deltaResist += 5//even faster! if (deltaResist>0)//just in case deltaResist /= phase//later phases require more resistance message_admins("[M] is trying to resist with a delta of [deltaResist]!") return +//I think this can be left out, but I'll leave the code incase anyone wants to add to it. +/* /datum/status_effect/chem/enthrall/proc/owner_say(mob/speaker, message) //I can only hope this works //var/datum/status_effect/chem/enthrall/E = owner.has_status_effect(/datum/status_effect/chem/enthrall) @@ -649,35 +699,4 @@ if(findtext(message, owner_words)) message = replacetext(lowertext(message), lowertext(master), "[enthrallGender]") return message - -/* -/datum/status_effect/chem/OwO - id = "OwO" - -/datum/status_effect/chem/PElarger/tick(message) - if(copytext(message, 1, 2) != "*") - message = replacetext(message, "ne", "nye") - message = replacetext(message, "nu", "nyu") - message = replacetext(message, "na", "nya") - message = replacetext(message, "no", "nyo") - message = replacetext(message, "ove", "uv") - message = replacetext(message, "ove", "uv") - message = replacetext(message, "th", "ff") - message = replacetext(message, "l", "w") - message = replacetext(message, "r", "w") - if(prob(20)) - message = replacetext(message, ".", "OwO.") - else if(prob(30)) - message = replacetext(message, ".", "uwu.") - message = lowertext(message) -*/ -/*Doesn't work -/datum/status_effect/chem/SDGF/candidates - id = "SGDFCandi" - var/mob/living/fermi_Clone - var/list/candies = list() - -/datum/status_effect/chem/SDGF/candidates/on_apply() - candies = pollGhostCandidates("Do you want to play as a clone and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies - return ..() */ diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index d8aaf3afab..90c59ec749 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -26,6 +26,8 @@ reagents.add_reagent(fluid_id, fluid_max_volume) prev_size = size cached_size = breast_values[size] + if (cached_size == "c")//fix for a weird bug that has something to do with how they're set up on the character create screen. + cached_size = 3 /obj/item/organ/genital/breasts/on_life() if(QDELETED(src)) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 4853b75f2e..4b762ef253 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -12,7 +12,7 @@ /datum/reagent/fermi name = "Fermi" //Why did I putthis here? id = "fermi" //It's meeee - taste_description = "If affection had a taste, this would be it." + taste_description = "affection and love!" var/ImpureChem = "toxin" // What chemical is metabolised with an inpure reaction var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising var/InverseChem = "toxin" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. @@ -24,10 +24,7 @@ //return ..() //Called when reaction stops. #STOP_PROCESSING -/* -/datum/reagent/fermi/proc/FermiFinish(datum/reagents/holder, multipler) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? - return -*/ + //Called when added to a beaker without any of the reagent present. #add_reagent /datum/reagent/fermi/proc/FermiNew(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW??? return @@ -60,7 +57,7 @@ /datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity)//basically on_mob_add but for merging . = ..() message_admins("purity of chem is [purity]") - if(!istype(M, datum/mob/living/carbon/M)) + if(M.istype(/mob/living/carbon/M)) return message_admins("purity of chem is [purity]") if (purity < 0) @@ -253,7 +250,7 @@ if(prob(20)) do_sparks(5,FALSE,M) src.addictCyc4++ - + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[src.id]_overdose")//holdover until above fix works ..() //. = 1 @@ -1160,12 +1157,11 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y return var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)//If purity is over 5, works as intended if(!E) - E = null M.reagents.remove_reagent(src.id, 10) M.apply_status_effect(/datum/status_effect/chem/enthrall) message_admins("No enthrall status found in [M]!") - var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall) - E.enthrallTally += 1 + else + E.enthrallTally += 1 if(prob(50)) M.adjustBrainLoss(0.1)//Honestly this could be removed, in testing it made everyone brain damaged, but on the other hand, we were chugging tons of it. ..() From fc3482ec90376e445673a871c9a5447373a07b17 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 22 May 2019 16:51:52 +0100 Subject: [PATCH 139/608] Squeak! --- .../modules/reagents/chemistry/reagents/fermi_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 4b762ef253..1782601257 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -1229,8 +1229,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y to_chat(M, "You develop deep feelings for [love], your heart beginning to race as you look upon them with new eyes.") else if(get_dist(M, love) < 8) - //if(M.has_trait(TRAIT_NYMPHO)) //Add this back when merged/updated. - M.adjustArousalLoss(5) + if(M.has_trait(TRAIT_NYMPHO)) //Add this back when merged/updated. + M.adjustArousalLoss(5) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") else From 41d991e81c1a9270e7a8efd1f72470c743c5d6b4 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 22 May 2019 18:13:12 +0100 Subject: [PATCH 140/608] Pre blood commit --- code/__DEFINES/traits.dm | 1 + code/modules/surgery/organs/vocal_cords.dm | 2 +- .../code/datums/status_effects/chems.dm | 4 ++-- .../reagents/chemistry/reagents/fermi_reagents.dm | 15 +++++++++++++-- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index fee7ba3cb6..fb721e9fcb 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -72,6 +72,7 @@ #define TRAIT_PHOTOGRAPHER "photographer" #define TRAIT_MUSICIAN "musician" #define TRAIT_CROCRIN_IMMUNE "crocin_immune" +#define TRAIT_NYMPHO "nymphomania" // common trait sources #define TRAIT_GENERIC "generic" diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 30ccf16c7e..e3225291bd 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -575,7 +575,7 @@ cooldown = COOLDOWN_MEME for(var/V in listeners) var/mob/living/carbon/human/H = V - if(H.canbearoused && H.has_dna()) // probably a redundant check but for good measure + if(H.canbearoused && H.has_dna() && H.has_trait(TRAIT_NYMPHO)) // probably a redundant check but for good measure H.mob_climax(forced_climax=TRUE) //DAB diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 3a0a11ddf5..6598904afb 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -528,7 +528,7 @@ //Speak (Forces player to talk) works if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2 var/saytext = "Your mouth moves on it's own before you can even catch it." - if(M.has_trait(TRAIT_NYMPHO)) + if(C.has_trait(TRAIT_NYMPHO)) saytext += " You find yourself fully believing in the validity of what you just said and don't think to question it." to_chat(C, "[saytext]") (C.say(customTriggers[trigger][2]))//trigger3 @@ -549,7 +549,7 @@ //wah intensifies wah-rks else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - if (M.has_trait(TRAIT_NYMPHO)) + if (C.has_trait(TRAIT_NYMPHO)) if (C.getArousalLoss() > 80) C.mob_climax(forced_climax=TRUE) else diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 1782601257..30abe29074 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -57,7 +57,7 @@ /datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity)//basically on_mob_add but for merging . = ..() message_admins("purity of chem is [purity]") - if(M.istype(/mob/living/carbon/M)) + if(istype(M, /mob/living/carbon)) return message_admins("purity of chem is [purity]") if (purity < 0) @@ -728,6 +728,17 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse //var/mob/living/carbon/human/H +/datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M) + . = ..() + var/mob/living/carbon/human/H = M + var/obj/item/organ/genital/penis/P = H.getorganslot("penis") + if(!P) + message_admins("No penis found on init!") + return + P.prev_size = P.length + P.cached_length = P.length + message_admins("init P len: [P.length], prev: [P.prev_size], cache = [P.cached_length]") + /datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch. var/mob/living/carbon/human/H = M var/obj/item/organ/genital/penis/P = M.getorganslot("penis") @@ -762,7 +773,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING message_admins("PE Breast status: [B]") if(M.gender == FEMALE) M.gender = MALE - M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine as your !") + M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!") if(B) B.cached_size = B.cached_size - 0.1 From f932fadfc65a26e3f42ecb8feba2bbc2d08802b9 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 22 May 2019 18:46:46 +0100 Subject: [PATCH 141/608] Blood commit. --- .../diseases/advance/symptoms/oxygen.dm | 2 +- code/game/machinery/iv_drip.dm | 4 +-- code/game/objects/items/devices/scanners.dm | 6 ++--- code/modules/antagonists/cult/blood_magic.dm | 10 +++---- .../antagonists/cult/cult_structures.dm | 2 +- code/modules/mob/living/blood.dm | 26 +++++++++---------- code/modules/mob/living/carbon/carbon.dm | 1 + .../mob/living/carbon/human/examine.dm | 2 +- .../carbon/human/species_types/jellypeople.dm | 16 ++++++------ .../carbon/human/species_types/vampire.dm | 2 +- code/modules/mob/living/living.dm | 2 +- code/modules/mob/living/living_defines.dm | 1 + .../chemistry/reagents/alcohol_reagents.dm | 4 +-- .../chemistry/reagents/medicine_reagents.dm | 4 +-- .../chemistry/reagents/other_reagents.dm | 4 +-- .../nanites/nanite_programs/healing.dm | 3 +-- .../chemistry/reagents/fermi_reagents.dm | 4 +-- 17 files changed, 47 insertions(+), 46 deletions(-) diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index 7bb6934707..cb7d1a6d6d 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -44,7 +44,7 @@ Bonus if(4, 5) M.adjustOxyLoss(-7, 0) M.losebreath = max(0, M.losebreath - 4) - if(regenerate_blood && M.blood_volume < BLOOD_VOLUME_NORMAL) + if(regenerate_blood && M.blood_volume < (BLOOD_VOLUME_NORMAL * M.blood_ratio)) M.blood_volume += 1 else if(prob(base_message_chance)) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 7284b3c738..aa88a6beb1 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -151,7 +151,7 @@ return // If the human is losing too much blood, beep. - if(attached.blood_volume < BLOOD_VOLUME_SAFE && prob(5)) + if(attached.blood_volume < ( (BLOOD_VOLUME_SAFE*attached.blood_ratio) && prob(5) ) ) visible_message("[src] beeps loudly.") playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) attached.transfer_blood_to(beaker, amount) @@ -224,4 +224,4 @@ to_chat(user, "[attached ? attached : "No one"] is attached.") #undef IV_TAKING -#undef IV_INJECTING \ No newline at end of file +#undef IV_INJECTING diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 79b04c771b..a613e9c518 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -310,7 +310,7 @@ SLIME SCANNER var/mob/living/carbon/human/H = C if(H.bleed_rate) msg += "Subject is bleeding!\n" - var/blood_percent = round((C.blood_volume / BLOOD_VOLUME_NORMAL)*100) + var/blood_percent = round((C.blood_volume / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100) var/blood_type = C.dna.blood_type if(blood_id != "blood")//special blood substance var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] @@ -318,9 +318,9 @@ SLIME SCANNER blood_type = R.name else blood_type = blood_id - if(C.blood_volume <= BLOOD_VOLUME_SAFE && C.blood_volume > BLOOD_VOLUME_OKAY) + if(C.blood_volume <= (BLOOD_VOLUME_SAFE*C.blood_ratio) && C.blood_volume > (BLOOD_VOLUME_OKAY*C.blood_ratio)) msg += "LOW blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n" - else if(C.blood_volume <= BLOOD_VOLUME_OKAY) + else if(C.blood_volume <= (BLOOD_VOLUME_OKAY*C.blood_ratio)) msg += "CRITICAL blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n" else msg += "Blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n" diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 845c66fb33..dae1066cf9 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -652,15 +652,15 @@ if(H.stat == DEAD) to_chat(user,"Only a revive rune can bring back the dead!") return - if(H.blood_volume < BLOOD_VOLUME_SAFE) - var/restore_blood = BLOOD_VOLUME_SAFE - H.blood_volume + if(H.blood_volume < (BLOOD_VOLUME_SAFE*H.blood_ratio)) + var/restore_blood = (BLOOD_VOLUME_SAFE*H.blood_ratio) - H.blood_volume if(uses*2 < restore_blood) H.blood_volume += uses*2 to_chat(user,"You use the last of your blood rites to restore what blood you could!") uses = 0 return ..() else - H.blood_volume = BLOOD_VOLUME_SAFE + H.blood_volume = (BLOOD_VOLUME_SAFE*H.blood_ratio) uses -= round(restore_blood/2) to_chat(user,"Your blood rites have restored [H == user ? "your" : "[H.p_their()]"] blood to safe levels!") var/overall_damage = H.getBruteLoss() + H.getFireLoss() + H.getToxLoss() + H.getOxyLoss() @@ -695,7 +695,7 @@ if(H.cultslurring) to_chat(user,"[H.p_their(TRUE)] blood has been tainted by an even stronger form of blood magic, it's no use to us like this!") return - if(H.blood_volume > BLOOD_VOLUME_SAFE) + if(H.blood_volume > (BLOOD_VOLUME_SAFE*H.blood_ratio)) H.blood_volume -= 100 uses += 50 user.Beam(H,icon_state="drainbeam",time=10) @@ -796,4 +796,4 @@ to_chat(user, "Your hands glow with POWER OVERWHELMING!!!") else to_chat(user, "You need a free hand for this rite!") - qdel(rite) \ No newline at end of file + qdel(rite) diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 64d57c2f94..499d7a861e 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -188,7 +188,7 @@ var/mob/living/simple_animal/M = L if(M.health < M.maxHealth) M.adjustHealth(-3) - if(ishuman(L) && L.blood_volume < BLOOD_VOLUME_NORMAL) + if(ishuman(L) && L.blood_volume < (BLOOD_VOLUME_NORMAL * L.blood_ratio)) L.blood_volume += 1.0 CHECK_TICK if(last_corrupt <= world.time) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 71a12e9ff4..dcdbeb13ad 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -18,10 +18,10 @@ /mob/living/carbon/monkey/handle_blood() if(bodytemperature >= TCRYO && !(has_trait(TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood. //Blood regeneration if there is some space - if(blood_volume < BLOOD_VOLUME_NORMAL) + if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio)) blood_volume += 0.1 // regenerate blood VERY slowly - if(blood_volume < BLOOD_VOLUME_OKAY) - adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1)) + if(blood_volume < (BLOOD_VOLUME_OKAY * blood_ratio)) + adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1)) // Takes care blood loss and regeneration /mob/living/carbon/human/handle_blood() @@ -33,7 +33,7 @@ if(bodytemperature >= TCRYO && !(has_trait(TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood. //Blood regeneration if there is some space - if(blood_volume < BLOOD_VOLUME_NORMAL && !has_trait(TRAIT_NOHUNGER)) + if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio) && !has_trait(TRAIT_NOHUNGER)) var/nutrition_ratio = 0 switch(nutrition) if(0 to NUTRITION_LEVEL_STARVING) @@ -49,26 +49,26 @@ if(satiety > 80) nutrition_ratio *= 1.25 nutrition = max(0, nutrition - nutrition_ratio * HUNGER_FACTOR) - blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * nutrition_ratio) + blood_volume = min((BLOOD_VOLUME_NORMAL * blood_ratio), blood_volume + 0.5 * nutrition_ratio) //Effects of bloodloss var/word = pick("dizzy","woozy","faint") switch(blood_volume) - if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) + if((BLOOD_VOLUME_OKAY * blood_ratio) to (BLOOD_VOLUME_SAFE * blood_ratio)) if(prob(5)) to_chat(src, "You feel [word].") - adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1)) - if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) - adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1)) + adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.01, 1)) + if((BLOOD_VOLUME_BAD * blood_ratio) to (BLOOD_VOLUME_OKAY*blood_ratio)) + adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1)) if(prob(5)) blur_eyes(6) to_chat(src, "You feel very [word].") - if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) + if((BLOOD_VOLUME_SURVIVE * blood_ratio) to (BLOOD_VOLUME_BAD * blood_ratio)) adjustOxyLoss(5) if(prob(15)) Unconscious(rand(20,60)) to_chat(src, "You feel extremely [word].") - if(-INFINITY to BLOOD_VOLUME_SURVIVE) + if(-INFINITY to (BLOOD_VOLUME_SURVIVE * blood_ratio)) if(!has_trait(TRAIT_NODEATH)) death() @@ -111,7 +111,7 @@ blood_volume = initial(blood_volume) /mob/living/carbon/human/restore_blood() - blood_volume = BLOOD_VOLUME_NORMAL + blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio) bleed_rate = 0 /**************************************************** @@ -122,7 +122,7 @@ /mob/living/proc/transfer_blood_to(atom/movable/AM, amount, forced) if(!blood_volume || !AM.reagents) return 0 - if(blood_volume < BLOOD_VOLUME_BAD && !forced) + if(blood_volume < (BLOOD_VOLUME_BAD * blood_ratio) && !forced) return 0 if(blood_volume < amount) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 1ce3420155..d0c9dae019 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -6,6 +6,7 @@ create_reagents(1000) update_body_parts() //to update the carbon's new bodyparts appearance GLOB.carbon_list += src + blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio) /mob/living/carbon/Destroy() //This must be done first, so the mob ghosts correctly before DNA etc is nulled diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 26e19ff376..78534bdf60 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -247,7 +247,7 @@ if(DISGUST_LEVEL_DISGUSTED to INFINITY) msg += "[t_He] look[p_s()] extremely disgusted.\n" - if(blood_volume < BLOOD_VOLUME_SAFE) + if(blood_volume < (BLOOD_VOLUME_SAFE*blood_ratio)) msg += "[t_He] [t_has] pale skin.\n" if(bleedsuppress) diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 0461fb9b79..57acdf0aca 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -46,14 +46,14 @@ H.adjustBruteLoss(5) to_chat(H, "You feel empty!") - if(H.blood_volume < BLOOD_VOLUME_NORMAL) + if(H.blood_volume < (BLOOD_VOLUME_NORMAL * H.blood_ratio)) if(H.nutrition >= NUTRITION_LEVEL_STARVING) H.blood_volume += 3 H.nutrition -= 2.5 - if(H.blood_volume < BLOOD_VOLUME_OKAY) + if(H.blood_volume < (BLOOD_VOLUME_OKAY*H.blood_ratio)) if(prob(5)) to_chat(H, "You feel drained!") - if(H.blood_volume < BLOOD_VOLUME_BAD) + if(H.blood_volume < (BLOOD_VOLUME_BAD*H.blood_ratio)) Cannibalize_Body(H) if(regenerate_limbs) regenerate_limbs.UpdateButtonIcon() @@ -85,7 +85,7 @@ var/list/limbs_to_heal = H.get_missing_limbs() if(limbs_to_heal.len < 1) return 0 - if(H.blood_volume >= BLOOD_VOLUME_OKAY+40) + if(H.blood_volume >= (BLOOD_VOLUME_OKAY*H.blood_ratio)+40) return 1 return 0 @@ -96,13 +96,13 @@ to_chat(H, "You feel intact enough as it is.") return to_chat(H, "You focus intently on your missing [limbs_to_heal.len >= 2 ? "limbs" : "limb"]...") - if(H.blood_volume >= 40*limbs_to_heal.len+BLOOD_VOLUME_OKAY) + if(H.blood_volume >= 40*limbs_to_heal.len+(BLOOD_VOLUME_OKAY*H.blood_ratio)) H.regenerate_limbs() H.blood_volume -= 40*limbs_to_heal.len to_chat(H, "...and after a moment you finish reforming!") return else if(H.blood_volume >= 40)//We can partially heal some limbs - while(H.blood_volume >= BLOOD_VOLUME_OKAY+40) + while(H.blood_volume >= (BLOOD_VOLUME_OKAY*H.blood_ratio)+40) var/healed_limb = pick(limbs_to_heal) H.regenerate_limb(healed_limb) limbs_to_heal -= healed_limb @@ -136,7 +136,7 @@ bodies -= C // This means that the other bodies maintain a link // so if someone mindswapped into them, they'd still be shared. bodies = null - C.blood_volume = min(C.blood_volume, BLOOD_VOLUME_NORMAL) + C.blood_volume = min(C.blood_volume, (BLOOD_VOLUME_NORMAL*C.blood_ratio)) ..() /datum/species/jelly/slime/on_species_gain(mob/living/carbon/C, datum/species/old_species) @@ -727,4 +727,4 @@ to_chat(H, "You connect [target]'s mind to your slime link!") else to_chat(H, "You can't seem to link [target]'s mind...") - to_chat(target, "The foreign presence leaves your mind.") \ No newline at end of file + to_chat(target, "The foreign presence leaves your mind.") diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 4bc3d622ac..53c6f1bd0f 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -46,7 +46,7 @@ C.adjustCloneLoss(-4) return C.blood_volume -= 0.75 - if(C.blood_volume <= BLOOD_VOLUME_SURVIVE) + if(C.blood_volume <= (BLOOD_VOLUME_SURVIVE*C.blood_ratio)) to_chat(C, "You ran out of blood!") C.dust() var/area/A = get_area(C) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b9b6424092..a862c0cf22 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -525,7 +525,7 @@ var/trail_type = getTrail() if(trail_type) var/brute_ratio = round(getBruteLoss() / maxHealth, 0.1) - if(blood_volume && blood_volume > max(BLOOD_VOLUME_NORMAL*(1 - brute_ratio * 0.25), 0))//don't leave trail if blood volume below a threshold + if(blood_volume && blood_volume > max((BLOOD_VOLUME_NORMAL*blood_ratio)*(1 - brute_ratio * 0.25), 0))//don't leave trail if blood volume below a threshold blood_volume = max(blood_volume - max(1, brute_ratio * 2), 0) //that depends on our brute damage. var/newdir = get_dir(target_turf, start) if(newdir != direction) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 0ba5b4c56d..4a2c70b5c6 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -79,6 +79,7 @@ var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added var/blood_volume = 0 //how much blood the mob has + var/blood_ratio = 1 //How much blood the mob needs, in terms of ratio (i.e 1.2 will require BLOOD_VOLUME_NORMAL of 672) DO NOT GO ABOVE 3.55 Well, actually you can but, then they can't get enough blood. var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override var/see_override = 0 //0 for no override, sets see_invisible = see_override in silicon & carbon life process via update_sight() diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index d011b1a8cb..087f6828af 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -576,8 +576,8 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." /datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C) - if(C.blood_volume < BLOOD_VOLUME_NORMAL) - C.blood_volume = min(BLOOD_VOLUME_NORMAL, C.blood_volume + 3) //Bloody Mary quickly restores blood loss. + if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) + C.blood_volume = min((BLOOD_VOLUME_NORMAL*C.blood_ratio), C.blood_volume + 3) //Bloody Mary quickly restores blood loss. ..() /datum/reagent/consumable/ethanol/brave_bull diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 13668dc1b7..cb21e353dd 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -61,8 +61,8 @@ M.SetSleeping(0, 0) M.jitteriness = 0 M.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) - if(M.blood_volume < BLOOD_VOLUME_NORMAL) - M.blood_volume = BLOOD_VOLUME_NORMAL + if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) + M.blood_volume = (BLOOD_VOLUME_NORMAL*M.blood_ratio) for(var/thing in M.diseases) var/datum/disease/D = thing diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 1c8fefcfae..e77dd42a38 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -288,7 +288,7 @@ M.adjustOxyLoss(-2, 0) M.adjustBruteLoss(-2, 0) M.adjustFireLoss(-2, 0) - if(ishuman(M) && M.blood_volume < BLOOD_VOLUME_NORMAL) + if(ishuman(M) && M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) M.blood_volume += 3 else // Will deal about 90 damage when 50 units are thrown M.adjustBrainLoss(3, 150) @@ -906,7 +906,7 @@ color = "#C8A5DC" // rgb: 200, 165, 220 /datum/reagent/iron/on_mob_life(mob/living/carbon/C) - if(C.blood_volume < BLOOD_VOLUME_NORMAL) + if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) C.blood_volume += 0.5 ..() diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index df32a5d127..ee1241c5e3 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -89,7 +89,7 @@ /datum/nanite_program/blood_restoring/check_conditions() if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob - if(C.blood_volume >= BLOOD_VOLUME_SAFE) + if(C.blood_volume >= (BLOOD_VOLUME_SAFE*C.blood_ratio)) return FALSE else return FALSE @@ -248,4 +248,3 @@ log_game("[C] has been successfully defibrillated by nanites.") else playsound(C, 'sound/machines/defib_failed.ogg', 50, 0) - diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 30abe29074..7194e15752 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -372,7 +372,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.nutrition -= 500 //reaction_mob(SM, )I forget what this is for //Damage the clone - SM.blood_volume = BLOOD_VOLUME_NORMAL/2 + SM.blood_volume = (BLOOD_VOLUME_NORMAL*SM.blood_ratio)/2 SM.adjustCloneLoss(60, 0) SM.setBrainLoss(40) SM.nutrition = startHunger/2 @@ -498,7 +498,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING metabolization_rate = 1 /datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) - if(M.blood_volume < BLOOD_VOLUME_NORMAL) + if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) M.blood_volume += 10 M.adjustCloneLoss(-2, 0) M.setBrainLoss(-1) From 435ca89134fe31ef85f1626369b86ab5cdf3bff3 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 22 May 2019 19:24:25 +0100 Subject: [PATCH 142/608] New traits. --- .../code/datums/status_effects/chems.dm | 2 +- .../code/datums/traits/negative.dm | 22 +++++++++++++++++++ .../code/datums/traits/positive.dm | 12 ++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 modular_citadel/code/datums/traits/negative.dm create mode 100644 modular_citadel/code/datums/traits/positive.dm diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 6598904afb..7753fd9eab 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -221,7 +221,7 @@ //Might need to add redirect component for listening too. var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! mental_capacity = 500 - B.get_brain_damage() - var/message = "[(owner.lewd?"I am a good pet for [enthrallGender].":"I find enjoyment in fulfilling the requests of [master] and I am appreciative of being in this position currently with no desire for this to change.")]" + var/message = "[(owner.lewd?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can still repeatedly resist their effects! (Mash resist to fight back!!)") return ..() diff --git a/modular_citadel/code/datums/traits/negative.dm b/modular_citadel/code/datums/traits/negative.dm new file mode 100644 index 0000000000..5faea82318 --- /dev/null +++ b/modular_citadel/code/datums/traits/negative.dm @@ -0,0 +1,22 @@ +// Citadel-specific Negative Traits + +/datum/quirk/Hypno + name = "Hypnotherapy user" + desc = "You had hypnotherapy right before your shift, you're not sure it had any effects, though." + value = -1 //I mean, it can be a really bad trait to have, but on the other hand, some people want it? + gain_text = "You really think the hypnotherapy helped you out." + //lose_text = "You forget about the hypnotherapy you had, or did you even have it?" + +/datum/quirk/Hypno/add() + //You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic! + addtimer(CALLBACK(quirk_holder, datum/quirk/Hypno, quirk_holder), rand(12000, 36000)) + +datum/quirk/Hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. + var/mob/living/carbon/human/H = quirk_holder + var/list/seen = viewers(8, get_turf(H)) + if(LAZYLEN(seen) == 0) + H.to_chat("That object accidentally sets off your implanted trigger, sending you into a hypnotic daze!") + else + H.to_chat("[pick(seen)] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") + H.apply_status_effect(/datum/status_effect/trance, 200, TRUE) + qdel(src) diff --git a/modular_citadel/code/datums/traits/positive.dm b/modular_citadel/code/datums/traits/positive.dm new file mode 100644 index 0000000000..fc86e91b68 --- /dev/null +++ b/modular_citadel/code/datums/traits/positive.dm @@ -0,0 +1,12 @@ +// Citadel-specific Positive Traits + +/datum/quirk/BloodPressure + name = "Synthetic blood" + desc = "You've got a new form of synthetic blood that increases the total blood volume inside of you!" + value = 1 + gain_text = "You feel full of blood!" + lose_text = "You feel like your blood pressure went down." + +/datum/quirk/BloodPressure/add() + var/mob/living/M = quirk_holder + M.blood_ratio = 1.2 From 9da13f231c2dd3b5c8c5b7e9b43147e936df7559 Mon Sep 17 00:00:00 2001 From: Fermi Date: Wed, 22 May 2019 20:23:45 +0100 Subject: [PATCH 143/608] OOPS BROKE LUNGS --- code/modules/surgery/organs/lungs.dm | 8 +-- .../code/datums/status_effects/chems.dm | 23 ++++---- modular_citadel/code/datums/traits/neutral.dm | 1 + .../chemistry/reagents/fermi_reagents.dm | 53 ++++++++++++++++++- .../modules/reagents/objects/fermiclothes.dm | 1 + 5 files changed, 71 insertions(+), 15 deletions(-) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index f93e1d8236..65507043bb 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -159,7 +159,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(breathModifier) //More damaged lungs = slower oxy rate up to a factor of half + H.adjustOxyLoss(-breathModifier) //More damaged lungs = slower oxy rate up to a factor of half gas_breathed = breath_gases[/datum/gas/oxygen][MOLES] H.clear_alert("not_enough_oxy") @@ -188,7 +188,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(breathModifier) + H.adjustOxyLoss(-breathModifier) gas_breathed = breath_gases[/datum/gas/nitrogen][MOLES] H.clear_alert("nitro") @@ -225,7 +225,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(breathModifier) + H.adjustOxyLoss(-breathModifier) gas_breathed = breath_gases[/datum/gas/carbon_dioxide][MOLES] H.clear_alert("not_enough_co2") @@ -255,7 +255,7 @@ else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) - H.adjustOxyLoss(breathModifier) + H.adjustOxyLoss(-breathModifier) gas_breathed = breath_gases[/datum/gas/plasma][MOLES] H.clear_alert("not_enough_tox") diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 7753fd9eab..90c8dc774a 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -68,6 +68,7 @@ /datum/status_effect/chem/BElarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts") + moveCalc = 1+((round(B.cached_size) - 9)/10) //Afffects how fast you move, and how often you can click. if(!B) o.remove_movespeed_modifier("megamilk") o.next_move_modifier /= moveCalc @@ -78,7 +79,6 @@ o.dropItemToGround(W, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) to_chat(owner, "Your enormous breasts are way too large to fit anything over them!") - moveCalc = (round(B.cached_size) - 9)/5 if (B.breast_values[B.size] > B.breast_values[B.prev_size]) o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) o.next_move_modifier *= moveCalc @@ -105,6 +105,8 @@ /datum/status_effect/chem/PElarger id = "PElarger" alert_type = null + var/bloodCalc + var/moveCalc /datum/status_effect/chem/PElarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now. message_admins("PElarge started!") @@ -125,9 +127,11 @@ /datum/status_effect/chem/PElarger/tick(mob/living/carbon/M) var/mob/living/carbon/human/o = owner var/obj/item/organ/genital/penis/P = o.getorganslot("penis") + moveCalc = 1+((round(P.length) - 21)/10) //effects how fast you can move + bloodCalc = 1+((round(P.length) - 21)/10) //effects how much blood you need (I didn' bother adding an arousal check because I'm spending too much time on this organ already.) if(!P) o.remove_movespeed_modifier("hugedick") - o.next_move_modifier = 1 + o.blood_ratio /= bloodCalc //If someone else uses blood_ratio, turn this into a multiplier(I should make a handler huh) owner.remove_status_effect(src) message_admins("PElarge tick!") var/items = o.get_contents() @@ -138,20 +142,21 @@ to_chat(owner, "Your enormous package is way to large to fit anything over!") switch(round(P.cached_length)) if(21) - if (!(P.prev_size == P.size)) + if (P.prev_size > P.size) to_chat(o, "Your rascally willy has become a more managable size, liberating your movements.") o.remove_movespeed_modifier("hugedick") - o.next_move_modifier = 1 + o.blood_ratio /= bloodCalc if(22 to INFINITY) if (!(P.prev_size == P.size)) - to_chat(o, "Your indulgent johnson is so substantial, it's affecting your movements!") - o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = (P.length - 21.1)) - o.next_move_modifier = (round(P.length) - 21) + to_chat(o, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!") + o.add_movespeed_modifier("hugedick", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) + o.blood_ratio *= bloodCalc ..() -/datum/status_effect/chem/PElarger/on_remove(mob/living/carbon/M) +/datum/status_effect/chem/PElarger/on_remove(mob/living/carbon/human/o) owner.remove_movespeed_modifier("hugedick") - owner.next_move_modifier = 1 + o.blood_ratio /= bloodCalc + /*////////////////////////////////////////// Mind control functions diff --git a/modular_citadel/code/datums/traits/neutral.dm b/modular_citadel/code/datums/traits/neutral.dm index 264dbfef0a..fd713660c3 100644 --- a/modular_citadel/code/datums/traits/neutral.dm +++ b/modular_citadel/code/datums/traits/neutral.dm @@ -1,5 +1,6 @@ // Citadel-specific Neutral Traits +//For reviewers: If you think it's a bad idea, feel free to remove it. I won't be upset :blobcat: /datum/quirk/libido name = "Nymphomania" desc = "You're always feeling a bit in heat. Also, you get aroused faster than usual." diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 7194e15752..ea95d125a5 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -13,9 +13,9 @@ name = "Fermi" //Why did I putthis here? id = "fermi" //It's meeee taste_description = "affection and love!" - var/ImpureChem = "toxin" // What chemical is metabolised with an inpure reaction + var/ImpureChem = "fermiTox" // What chemical is metabolised with an inpure reaction var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising - var/InverseChem = "toxin" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. + var/InverseChem = "fermiTox" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it. var/DoNotSplit = FALSE // If impurity is handled within the main chem itself ///datum/reagent/fermi/on_mob_life(mob/living/carbon/M) @@ -67,6 +67,9 @@ else if (src.InverseChemVal > purity) M.reagents.remove_reagent(src.id, amount, FALSE) M.reagents.add_reagent(src.InverseChem, amount, FALSE, other_purity = 1) + for(var/datum/reagent/fermi/R in M.reagents.reagent_list) + if(R.name == "") + R.name = src.name//Negative effects are hidden message_admins("all convered to [src.InverseChem]") return else @@ -75,6 +78,9 @@ message_admins("splitting [src] [amount] into [src.ImpureChem] [impureVol]") M.reagents.remove_reagent(src.id, impureVol, FALSE) M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE, other_purity = 1) + for(var/datum/reagent/fermi/R in M.reagents.reagent_list) + if(R.name == "") + R.name = src.name//Negative effects are hidden return @@ -1510,6 +1516,49 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y to_chat(M, "The solution reacts dramatically, with a meow!") playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) holder.clear_reagents() + +/datum/reagent/fermi/fermiTox + name = ""//defined on setup + id = "fermiTox" + description = "You should be really careful with this...! Also, how did you get this?" + +/datum/reagent/fermi/fermiTox/on_mob_life(mob/living/carbon/C, method) + if(C.dna && istype(C.dna.species, /datum/species/jelly)) + C.adjustToxLoss(-1) + else + C.adjustToxLoss(1) + ..() + +/datum/reagent/fermi/fermiABuffer + name = "Acidic buffer"//defined on setup + id = "fermiABuffer" + description = "This reagent will consume itself and move the pH of a beaker towards 3 when added to another." + addProc = TRUE + +/datum/reagent/fermi/fermiABuffer/on_new() + if(LAZYLEN(holder.reagent_list) == 1) + return + if(holder.pH < 3) + return + pH = ((holder.pH * holder.total_volume)+(3 * src.volume))/(holder.total_volume + src.volume) + holder.remove_reagent(src.id, 1000) + ..() + +/datum/reagent/fermi/fermiBBuffer + name = "Basic buffer"//defined on setup + id = "fermiBBuffer" + description = "This reagent will consume itself and move the pH of a beaker towards 11 when added to another." + addProc = TRUE + +/datum/reagent/fermi/fermiBBuffer/on_new() + if(LAZYLEN(holder.reagent_list) == 1) + return + if(holder.pH > 11) + return + pH = ((holder.pH * holder.total_volume)+(11 * src.volume))/(holder.total_volume + src.volume) + holder.remove_reagent(src.id, 1000) + ..() + /* /datum/reagent/fermi/fermiTest/on_merge() ..() diff --git a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm b/modular_citadel/code/modules/reagents/objects/fermiclothes.dm index 908016d371..2c0df581c4 100644 --- a/modular_citadel/code/modules/reagents/objects/fermiclothes.dm +++ b/modular_citadel/code/modules/reagents/objects/fermiclothes.dm @@ -37,6 +37,7 @@ return message if(prob(0.01)) message += "\" and tips their hat. \"Spy's sappin' my Sentry!" + message_admins("I really appreciate all the hard work you put into adminning citadel, I hope you're all having a good day and I hope this hidden and rare message admins brightens up your day.") return message message += "\" and tips their hat. \"[pick("Yeehaw!", "Boy howdy.", "Darn tootin'.", "Well don't that beat all.", "Whoooowee, would ya look at that!", "Whoooowee! Makin' bacon!", "Cream Gravy!", "Yippekeeyah-heeyapeeah-kayoh!", "Move 'em out!", "Giddy up!")]" return message From a480ccb9fa400e9e20d7175419395ed9d4e88639 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 23 May 2019 05:26:38 +0100 Subject: [PATCH 144/608] Changes --- code/__DEFINES/traits.dm | 1 + code/modules/reagents/chemistry/holder.dm | 4 +- .../chemistry/reagents/toxin_reagents.dm | 1 + code/modules/surgery/organs/vocal_cords.dm | 4 +- .../code/datums/status_effects/chems.dm | 2 +- .../code/datums/traits/negative.dm | 9 +++-- .../code/datums/traits/positive.dm | 1 + .../chemistry/reagents/fermi_reagents.dm | 19 ++++------ .../reagents/chemistry/recipes/fermi.dm | 37 ++++++++++--------- tgstation.dme | 2 + 10 files changed, 42 insertions(+), 38 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index fb721e9fcb..4fad011772 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -73,6 +73,7 @@ #define TRAIT_MUSICIAN "musician" #define TRAIT_CROCRIN_IMMUNE "crocin_immune" #define TRAIT_NYMPHO "nymphomania" +#define TRAIT_HIGH_BLOOD "high_blood" // common trait sources #define TRAIT_GENERIC "generic" diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 0d7532d344..db0d79c71b 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -449,8 +449,8 @@ im var/list/multiplier = INFINITY //Wat for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) - + //multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) + multiplier = min(multiplier, (get_reagent_amount(B) / cached_required_reagents[B]))//a simple one over the other? (Is this for multiplying end product? Useful for toxinsludge buildup) //Splits reactions into two types; FermiChem is advanced reaction mechanics, Other is default reaction. //FermiChem relies on two additional properties; pH and impurity //Temperature plays into a larger role too. diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 0c0b385958..12b382918c 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -835,6 +835,7 @@ var/acidpwr = 10 //the amount of protection removed from the armour taste_description = "acid" self_consuming = TRUE + pH = 2.75 /datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume) if(!istype(C)) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index e3225291bd..302113c4fb 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -840,7 +840,7 @@ E.enthrallTally += power_multiplier*1.25 if(L.canbearoused) if(L.lewd) - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.master] is so nice to listen to."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] is so nice to listen to."), 5) E.cooldown += 1 //REWARD mixable works @@ -855,7 +855,7 @@ if(L.has_trait(TRAIT_NYMPHO)) L.adjustArousalLoss(2*power_multiplier) else - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've been praised for doing a good job!"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've been praised for doing a good job!"), 5) E.resistanceTally -= power_multiplier E.enthrallTally += 1 var/descmessage = "[(L.lewd?"I feel so happy! I'm a good pet who [E.enthrallGender] loves!":"I did a good job!")]" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 90c8dc774a..f81c8173e6 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -169,7 +169,7 @@ /mob/living/verb/toggle_lewd() set category = "IC" - set name = "toggle lewdchem" + set name = "Toggle Lewdchem" set desc = "Allows you to toggle if you'd like lewd flavour messages." lewd = !(lewd) to_chat(usr, "You [(lewd?"will":"no longer")] receive lewdchem messages.") diff --git a/modular_citadel/code/datums/traits/negative.dm b/modular_citadel/code/datums/traits/negative.dm index 5faea82318..5a224ffa84 100644 --- a/modular_citadel/code/datums/traits/negative.dm +++ b/modular_citadel/code/datums/traits/negative.dm @@ -3,20 +3,21 @@ /datum/quirk/Hypno name = "Hypnotherapy user" desc = "You had hypnotherapy right before your shift, you're not sure it had any effects, though." + mob_trait = "hypnotherapy" value = -1 //I mean, it can be a really bad trait to have, but on the other hand, some people want it? gain_text = "You really think the hypnotherapy helped you out." //lose_text = "You forget about the hypnotherapy you had, or did you even have it?" /datum/quirk/Hypno/add() //You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic! - addtimer(CALLBACK(quirk_holder, datum/quirk/Hypno, quirk_holder), rand(12000, 36000)) + addtimer(CALLBACK(quirk_holder, /datum/quirk/Hypno/proc/triggered, quirk_holder), rand(12000, 36000)) -datum/quirk/Hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. +/datum/quirk/Hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. var/mob/living/carbon/human/H = quirk_holder var/list/seen = viewers(8, get_turf(H)) if(LAZYLEN(seen) == 0) - H.to_chat("That object accidentally sets off your implanted trigger, sending you into a hypnotic daze!") + to_chat(H, "That object accidentally sets off your implanted trigger, sending you into a hypnotic daze!") else - H.to_chat("[pick(seen)] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") + to_chat(H, "[pick(seen)] accidentally sets off your implanted trigger, sending you into a hypnotic daze!") H.apply_status_effect(/datum/status_effect/trance, 200, TRUE) qdel(src) diff --git a/modular_citadel/code/datums/traits/positive.dm b/modular_citadel/code/datums/traits/positive.dm index fc86e91b68..a48a4a82bf 100644 --- a/modular_citadel/code/datums/traits/positive.dm +++ b/modular_citadel/code/datums/traits/positive.dm @@ -4,6 +4,7 @@ name = "Synthetic blood" desc = "You've got a new form of synthetic blood that increases the total blood volume inside of you!" value = 1 + mob_trait = TRAIT_HIGH_BLOOD gain_text = "You feel full of blood!" lose_text = "You feel like your blood pressure went down." diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index ea95d125a5..5ad46bd334 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -35,7 +35,7 @@ . = ..() if(!M) return - message_admins("purity of chem is [purity]") + message_admins("adding to human [purity]") if(src.purity < 0) CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") if (src.purity == 1 || src.DoNotSplit == TRUE) @@ -46,7 +46,7 @@ message_admins("all convered to [src.InverseChem]") return else - //var/pureVol = amount * purity + //var/pureVol = amount * puritys var/impureVol = amount * (1 - purity) message_admins("splitting [src.id] [amount] into [src.ImpureChem] [impureVol]") M.reagents.remove_reagent(src.id, (impureVol), FALSE) @@ -56,10 +56,9 @@ //When merging two fermichems /datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity)//basically on_mob_add but for merging . = ..() - message_admins("purity of chem is [purity]") - if(istype(M, /mob/living/carbon)) + if(!ishuman(M)) return - message_admins("purity of chem is [purity]") + message_admins("merging to human [purity]") if (purity < 0) CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!") if (purity == 1 || src.DoNotSplit == TRUE) @@ -848,7 +847,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason //M.alpha = 255//Reset addiction //antiGenetics = 255// DOesn't work for some reason? switch(current_cycle) - if(0)//Require a minimum + if(1)//Require a minimum origin = M if (G == null) G = new(get_turf(M.loc)) @@ -870,7 +869,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason if(prob(50)) to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!") do_teleport(G, M.loc) - M.reagents.remove_reagent(src.id, current_cycle, FALSE) + M.reagents.remove_reagent(src.id, current_cycle-1, FALSE) ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) @@ -1534,12 +1533,11 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y id = "fermiABuffer" description = "This reagent will consume itself and move the pH of a beaker towards 3 when added to another." addProc = TRUE + pH = 3 /datum/reagent/fermi/fermiABuffer/on_new() if(LAZYLEN(holder.reagent_list) == 1) return - if(holder.pH < 3) - return pH = ((holder.pH * holder.total_volume)+(3 * src.volume))/(holder.total_volume + src.volume) holder.remove_reagent(src.id, 1000) ..() @@ -1549,12 +1547,11 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y id = "fermiBBuffer" description = "This reagent will consume itself and move the pH of a beaker towards 11 when added to another." addProc = TRUE + pH = 11 /datum/reagent/fermi/fermiBBuffer/on_new() if(LAZYLEN(holder.reagent_list) == 1) return - if(holder.pH > 11) - return pH = ((holder.pH * holder.total_volume)+(11 * src.volume))/(holder.total_volume + src.volume) holder.remove_reagent(src.id, 1000) ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 680a5018d2..a55198ff56 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -70,8 +70,8 @@ /datum/chemical_reaction/fermi/eigenstate//done name = "Eigenstasium" id = "eigenstate" - results = list("eigenstate" = 1) - required_reagents = list("bluespace" = 1, "stable_plasma" = 1, "sugar" = 1) + results = list("eigenstate" = 0.1) + required_reagents = list("bluespace" = 0.1, "stable_plasma" = 0.1, "sugar" = 0.1) mix_message = "zaps brightly into existance, diffusing the energy from the localised gravity well as light" //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions @@ -100,9 +100,9 @@ /datum/chemical_reaction/fermi/SDGF name = "Synthetic-derived growth factor" id = "SDGF" - results = list("SDGF" = 3) + results = list("SDGF" = 0.3) //required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) - required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) + required_reagents = list("stable_plasma" = 0.5, "slimejelly" = 0.5, "synthflesh" = 1, "blood" = 1) //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 500 // Upper end for above @@ -127,6 +127,7 @@ S.name = "Living teratoma" S.real_name = "Living teratoma"//horrifying!! S.rabid = 1//Make them an angery boi, grr grr + S.color = "#810010" to_chat("The cells clump up into a horrifying tumour!") my_atom.reagents.clear_reagents() @@ -134,7 +135,7 @@ name = "Sucubus milk" id = "BElarger" results = list("BElarger" = 6) - required_reagents = list("salglu_solution" = 1, "milk" = 5, "synthflesh" = 2, "silicon" = 2, "aphro" = 2) + required_reagents = list("salglu_solution" = 0.1, "milk" = 0.5, "synthflesh" = 0.2, "silicon" = 0.2, "aphro" = 0.2) //FermiChem vars: OptimalTempMin = 200 OptimalTempMax = 800 @@ -164,8 +165,8 @@ /datum/chemical_reaction/fermi/PElarger //done name = "Incubus draft" id = "PElarger" - results = list("PElarger" = 3) - required_reagents = list("plasma" = 1, "stable_plasma" = 1, "sugar" = 1) + results = list("PElarger" = 0.3) + required_reagents = list("plasma" = 0.1, "stable_plasma" = 0.1, "sugar" = 0.1) //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: OptimalTempMin = 200 @@ -196,8 +197,8 @@ /datum/chemical_reaction/fermi/astral //done //BORKEN name = "Astrogen" id = "astral" - results = list("astral" = 3) - required_reagents = list("eigenstate" = 1, "plasma" = 1, "synaptizine" = 1, "aluminium" = 5) + results = list("astral" = 0.3) + required_reagents = list("eigenstate" = 0.1, "plasma" = 0.1, "synaptizine" = 0.1, "aluminium" = 0.5) //FermiChem vars: OptimalTempMin = 200 OptimalTempMax = 800 @@ -219,10 +220,10 @@ /datum/chemical_reaction/fermi/enthrall//done name = "MKUltra" id = "enthrall" - results = list("enthrall" = 3) - required_reagents = list("iron" = 1, "iodine" = 1) + results = list("enthrall" = 0.3) + required_reagents = list("iron" = 0.1, "iodine" = 0.1) //required_reagents = list("cocoa" = 1, "astral" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1) - required_catalysts = list("blood" = 1) + required_catalysts = list("blood" = 0.1) //required_reagents = list("stable_plasma" = 5, "slimejelly" = 5, "synthflesh" = 10, "blood" = 10) //FermiChem vars: OptimalTempMin = 780 @@ -295,8 +296,8 @@ /datum/chemical_reaction/fermi/hatmium // done name = "Hat growth serum" id = "hatmium" - results = list("hatmium" = 5) - required_reagents = list("whiskey" = 1, "nutriment" = 3, "cooking_oil" = 2, "iron" = 1) + results = list("hatmium" = 0.5) + required_reagents = list("whiskey" = 0.1, "nutriment" = 0.3, "cooking_oil" = 0.2, "iron" = 0.1) //mix_message = "" //FermiChem vars: OptimalTempMin = 500 @@ -327,8 +328,8 @@ /datum/chemical_reaction/fermi/furranium //low temp and medium pH - done name = "Furranium" id = "furranium" - results = list("furranium" = 5) - required_reagents = list("aphro" = 1, "moonsugar" = 1, "silver" = 2, "salglu_solution" = 1) + results = list("furranium" = 0.5) + required_reagents = list("aphro" = 0.1, "moonsugar" = 0.1, "silver" = 0.2, "salglu_solution" = 0.1) //mix_message = "" //FermiChem vars: OptimalTempMin = 350 @@ -351,8 +352,8 @@ /datum/chemical_reaction/fermi/naninte_b_gone//done name = "Naninte bain" id = "naninte_b_gone" - results = list("naninte_b_gone" = 5) - required_reagents = list("synthflesh" = 5, "uranium" = 1, "iron" = 1, "salglu_solution" = 3) + results = list("naninte_b_gone" = 0.5) + required_reagents = list("synthflesh" = 0.5, "uranium" = 0.1, "iron" = 0.1, "salglu_solution" = 0.3) mix_message = "the reaction gurgles, encapsulating the reagents in flesh." //FermiChem vars: OptimalTempMin = 450 diff --git a/tgstation.dme b/tgstation.dme index e8a0ec5c10..039765acee 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2807,7 +2807,9 @@ #include "modular_citadel\code\datums\mutations\hulk.dm" #include "modular_citadel\code\datums\status_effects\chems.dm" #include "modular_citadel\code\datums\status_effects\debuffs.dm" +#include "modular_citadel\code\datums\traits\negative.dm" #include "modular_citadel\code\datums\traits\neutral.dm" +#include "modular_citadel\code\datums\traits\positive.dm" #include "modular_citadel\code\datums\wires\airlock.dm" #include "modular_citadel\code\datums\wires\autoylathe.dm" #include "modular_citadel\code\game\area\cit_areas.dm" From 310344e828bb191ed2d9786086a22e906aaaa16f Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 23 May 2019 20:21:52 +0100 Subject: [PATCH 145/608] EVERYTHING BROKE AAAAAAAAAAAAAAAAAA --- .../mob/living/carbon/human/human_defines.dm | 1 + .../code/datums/traits/negative.dm | 2 +- .../code/modules/arousal/organs/breasts.dm | 9 +++++- .../code/modules/arousal/organs/genitals.dm | 31 ++++++++++++------- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index d1ec7f3e4b..d94b2a8b6e 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -44,6 +44,7 @@ var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding var/name_override //For temporary visible name changes + var/genital_override = FALSE //Force genitals on things incase of chems var/nameless = FALSE //For drones of both the insectoid and robotic kind. And other types of nameless critters. diff --git a/modular_citadel/code/datums/traits/negative.dm b/modular_citadel/code/datums/traits/negative.dm index 5a224ffa84..d999f719a0 100644 --- a/modular_citadel/code/datums/traits/negative.dm +++ b/modular_citadel/code/datums/traits/negative.dm @@ -10,7 +10,7 @@ /datum/quirk/Hypno/add() //You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic! - addtimer(CALLBACK(quirk_holder, /datum/quirk/Hypno/proc/triggered, quirk_holder), rand(12000, 36000)) + addtimer(CALLBACK(src, /datum/quirk/Hypno.proc/triggered, quirk_holder), rand(1200, 3600))//increase by 10, it's lower so I can test it. /datum/quirk/Hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added. var/mob/living/carbon/human/H = quirk_holder diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 90c59ec749..8d940897d2 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -19,7 +19,7 @@ can_masturbate_with = TRUE masturbation_verb = "massage" can_climax = TRUE - fluid_transfer_factor =0.5 + fluid_transfer_factor = 0.5 /obj/item/organ/genital/breasts/Initialize() . = ..() @@ -60,6 +60,7 @@ desc += " They're very small and flatchested, however." else desc += " You estimate that they're [uppertext(size)]-cups." + string = "breasts_[lowertext(shape)]_[size]-s" if(producing && aroused_state) desc += " They're leaking [fluid_id]." @@ -70,6 +71,12 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["breasts_color"]]" + string = "breasts_[lowertext(shape)]_[size]" + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.update_genitals() + + icon_state = sanitize_text(string) //Allows breasts to grow and change size, with sprite changes too. diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 2daaeb1502..e3e35d4d23 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -130,7 +130,7 @@ //proc to give a player their genitals and stuff when they log in /mob/living/carbon/human/proc/give_genitals(clean=0)//clean will remove all pre-existing genitals. proc will then give them any genitals that are enabled in their DNA - if (NOGENITALS in dna.species.species_traits) + if ((NOGENITALS in dna.species.species_traits) && (genital_override = FALSE)) return if(clean) var/obj/item/organ/genital/GtoClean @@ -155,7 +155,7 @@ /mob/living/carbon/human/proc/give_penis() if(!dna) return FALSE - if(NOGENITALS in dna.species.species_traits) + if((NOGENITALS in dna.species.species_traits) && (genital_override = FALSE)) return FALSE if(!getorganslot("penis")) var/obj/item/organ/genital/penis/P = new @@ -173,7 +173,7 @@ /mob/living/carbon/human/proc/give_balls() if(!dna) return FALSE - if(NOGENITALS in dna.species.species_traits) + if((NOGENITALS in dna.species.species_traits) && (genital_override = FALSE)) return FALSE if(!getorganslot("testicles")) var/obj/item/organ/genital/testicles/T = new @@ -194,7 +194,7 @@ /mob/living/carbon/human/proc/give_breasts() if(!dna) return FALSE - if(NOGENITALS in dna.species.species_traits) + if((NOGENITALS in dna.species.species_traits) && (genital_override = FALSE)) return FALSE if(!getorganslot("breasts")) var/obj/item/organ/genital/breasts/B = new @@ -211,11 +211,13 @@ /mob/living/carbon/human/proc/give_ovipositor() + return /mob/living/carbon/human/proc/give_eggsack() + return /mob/living/carbon/human/proc/give_vagina() if(!dna) return FALSE - if(NOGENITALS in dna.species.species_traits) + if((NOGENITALS in dna.species.species_traits) && (genital_override = FALSE)) return FALSE if(!getorganslot("vagina")) var/obj/item/organ/genital/vagina/V = new @@ -231,7 +233,7 @@ /mob/living/carbon/human/proc/give_womb() if(!dna) return FALSE - if(NOGENITALS in dna.species.species_traits) + if((NOGENITALS in dna.species.species_traits) && (genital_override = FALSE)) return FALSE if(!getorganslot("womb")) var/obj/item/organ/genital/womb/W = new @@ -267,10 +269,12 @@ if(src && !QDELETED(src)) dna.species.handle_genitals(src) -/mob/living/carbon/human/proc/Force_update_genitals(mob/living/carbon/human/H) - dna.species.handle_genitals(src) +/mob/living/carbon/human/proc/Force_update_genitals(mob/living/carbon/human/H) //called in fermiChem + dna.species.handle_genitals(src, ignoreGenitalFlags = TRUE) //dna.species.handle_breasts(src) //H.update_body() +//species_traits = list(NOTRANSSTING,NOGENITALS) + /datum/species/proc/handle_genitals(mob/living/carbon/human/H) //message_admins("attempting to update sprite") @@ -278,14 +282,15 @@ CRASH("H = null") if(!LAZYLEN(H.internal_organs))//if they have no organs, we're done return - if(NOGENITALS in species_traits)//golems and such + if((NOGENITALS in species_traits) && (H.genital_override = FALSE))//golems and such - things that shouldn't return if(H.has_trait(TRAIT_HUSK)) return var/list/genitals_to_add = list() var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER) var/list/standing = list() - var/size = null + var/size + var/aroused_state for(var/L in relevant_layers) //Less hardcode H.remove_overlay(L) //start scanning for genitals @@ -302,6 +307,7 @@ for(var/obj/item/organ/genital/G in genitals_to_add) var/datum/sprite_accessory/S size = G.size + aroused_state = G.aroused_state switch(G.type) if(/obj/item/organ/genital/penis) S = GLOB.cock_shapes_list[G.shape] @@ -313,13 +319,14 @@ if(!S || S.icon_state == "none") continue var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer) - genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[G.aroused_state]_[layertext]" + genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[aroused_state]_[layertext]" if(S.center) genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y) if(use_skintones && H.dna.features["genitals_use_skintone"]) genital_overlay.color = "#[skintone2hex(H.skin_tone)]" + genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]-s_[aroused_state]_[layertext]" else switch(S.color_src) if("cock_color") @@ -328,6 +335,7 @@ genital_overlay.color = "#[H.dna.features["breasts_color"]]" if("vag_color") genital_overlay.color = "#[H.dna.features["vag_color"]]" + /* This was removed for some reason? if(MUTCOLORS) if(fixed_mut_color) genital_overlay.color = "#[fixed_mut_color]" @@ -343,6 +351,7 @@ genital_overlay.color = "#[fixed_mut_color3]" else genital_overlay.color = "#[H.dna.features["mcolor3"]]" + */ standing += genital_overlay if(LAZYLEN(standing)) H.overlays_standing[layer] = standing.Copy() From 8a8178a0b1ab9f8d7dffdfc77b2ea3ce383b8c4b Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 23 May 2019 20:52:20 +0100 Subject: [PATCH 146/608] I uh, I'm worried this won't compile for some reason. --- .../code/datums/status_effects/chems.dm | 2 +- .../code/modules/arousal/organs/genitals.dm | 5 +++++ .../code/modules/arousal/organs/penis.dm | 4 ++-- .../chemistry/reagents/fermi_reagents.dm | 17 ++++++++++------- .../modules/reagents/chemistry/recipes/fermi.dm | 6 +++--- 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index f81c8173e6..c8ba8b622c 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -85,7 +85,7 @@ else if (B.breast_values[B.size] < B.breast_values[B.prev_size]) o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) o.next_move_modifier /= moveCalc - if(round(B.cached_size) < 16) + if((B.size) < 16) switch(round(B.cached_size)) if(9) if (!(B.breast_sizes[B.prev_size] == B.size)) diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index e3e35d4d23..89251950ce 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -315,6 +315,11 @@ S = GLOB.vagina_shapes_list[G.shape] if(/obj/item/organ/genital/breasts) S = GLOB.breasts_shapes_list[G.shape] + aroused_state = 0//Breasts don't have aroused_states, there's literally no difference in the spite. + if ((G.cached_size > 5) && (layertext == "BEHIND")) + size = "e" //I don't understand the BEHIND sprite honestly, so this is a way to just use the largest. + + if(!S || S.icon_state == "none") continue diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index bd7331337d..7da4b0c3db 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -19,7 +19,7 @@ var/list/dickflags = list() var/list/knotted_types = list("knotted", "barbed, knotted") var/statuscheck = FALSE - var/prev_size = 6 + var/prev_size = 6 //really should be renamed to prev_length /obj/item/organ/genital/penis/Initialize() . = ..() @@ -61,7 +61,7 @@ //message_admins("Attempting to apply.") o.apply_status_effect(/datum/status_effect/chem/PElarger) statuscheck = TRUE - //message_admins("Pinas size: [size], [cached_length], [o]") + //message_admins("Pinas size: [length], [cached_length], [o]") //message_admins("2. size vs prev_size") if (round(length) > round(prev_size)) to_chat(o, "Your [pick("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(length)] inch penis.") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 5ad46bd334..1997df9955 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -142,10 +142,11 @@ if(0) location_return = get_turf(M) //sets up return point to_chat(M, "You feel your wavefunction split!") - do_sparks(5,FALSE,M) - do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg') - //M.forceMove(location_created) //Teleports to creation location - do_sparks(5,FALSE,M) + if(purity > 0.75) //Teleports you home if it's pure enough + do_sparks(5,FALSE,M) + do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg') + //M.forceMove(location_created) //Teleports to creation location + do_sparks(5,FALSE,M) if(prob(20)) do_sparks(5,FALSE,M) //message_admins("eigenstate state: [current_cycle]") @@ -219,7 +220,7 @@ C.emote("spin") M.emote("spin") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) - C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! O� suis-je?!", "Yee haw!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "Ciekawe co na obiad?", "You fool! You took too much eigenstasium! You've doomed us all!", "Watashi no nihon'noanime no yona monodesu!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Detta �r sista g�ngen jag dricker beepsky smash.", "Now neither of us will be virgins!")]\"") + C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! O� suis-je?!", "Yee haw!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "Ciekawe co na obiad?", "You fool! You took too much eigenstasium! You've doomed us all!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Fermichem was a mistake", "This is one hell of a strong beepsky smash.", "Now neither of us will be virgins!")]\"") message_admins("Fermi T Clone: [fermi_Tclone] teleport attempt") if(2) var/mob/living/carbon/C = fermi_Tclone @@ -627,6 +628,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M) . = ..() var/mob/living/carbon/human/H = M + H.genital_override = TRUE var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts") if(!B) message_admins("No breasts found on init!") @@ -736,6 +738,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M) . = ..() var/mob/living/carbon/human/H = M + H.genital_override = TRUE var/obj/item/organ/genital/penis/P = H.getorganslot("penis") if(!P) message_admins("No penis found on init!") @@ -754,8 +757,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(nP) nP.length = 0.2 to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.")//OwO - nP.cached_length = 0.1 - nP.prev_size = 0.1 + nP.cached_length = 0.2 + nP.prev_size = 0.2 M.reagents.remove_reagent(src.id, 5) P = nP diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index a55198ff56..c16cd0e4cb 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -90,9 +90,9 @@ FermiExplode = FALSE //If the chemical explodes in a special way -/datum/chemical_reaction/fermi/eigenstate/FermiCreate(datum/reagents/holder) +/datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does. var/location = get_turf(holder.my_atom) - var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in holder.reagent_list + var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list E.location_created = location //add on_new() handling of vars @@ -249,7 +249,7 @@ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list if(!B.data) - var/list/seen = viewers(5, get_turf(holder.my_atom)) + var/list/seen = viewers(5, get_turf(my_atom)) for(var/mob/M in seen) to_chat(M, "The reaction splutters and fails to react.") E.purity = 0 From 2f7a4082ab5ada396e8818203b22b198873cfc09 Mon Sep 17 00:00:00 2001 From: Fermi Date: Thu, 23 May 2019 23:09:32 +0100 Subject: [PATCH 147/608] woooah. --- code/modules/reagents/chemistry/holder.dm | 2 +- code/modules/surgery/organs/lungs.dm | 4 +-- .../code/datums/status_effects/chems.dm | 27 +++++++++++------- .../code/modules/arousal/organs/breasts.dm | 6 ++-- .../code/modules/arousal/organs/genitals.dm | 5 ++-- .../chemistry/reagents/fermi_reagents.dm | 11 +++++-- .../reagents/chemistry/recipes/fermi.dm | 10 +++---- .../code/modules/reagents/objects/items.dm | 2 ++ modular_citadel/icons/obj/FermiChem.dmi | Bin 1877 -> 3898 bytes .../icons/obj/genitals/breasts.dmi | Bin 703 -> 593 bytes .../icons/obj/genitals/breasts_onmob.dmi | Bin 1605 -> 3543 bytes modular_citadel/icons/obj/genitals/penis.dmi | Bin 1526 -> 1580 bytes 12 files changed, 42 insertions(+), 25 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index db0d79c71b..78bfe1fc9d 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -920,7 +920,7 @@ im R.data = data R.on_new(data) if(R.addProc == TRUE) - R.on_new(my_atom) + R.on_new(src) if(istype(D, /datum/reagent/fermi))//Is this a fermichem? var/datum/reagent/fermi/Ferm = D //It's Fermi time! Ferm.FermiNew(my_atom) //Seriously what is "data" ???? diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 65507043bb..12e763fafd 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -1,4 +1,4 @@ -#define LUNGS_MAX_HEALTH 500 +#define LUNGS_MAX_HEALTH 450 /obj/item/organ/lungs name = "lungs" @@ -410,8 +410,8 @@ H.apply_damage_type(cold_level_2_damage*cold_modifier, cold_damage_type) adjustLungLoss(cold_level_2_damage*cold_modifier) if(breath_temperature > cold_level_2_threshold && breath_temperature < cold_level_1_threshold) - adjustLungLoss(cold_level_1_damage*cold_modifier) H.apply_damage_type(cold_level_1_damage*cold_modifier, cold_damage_type) + adjustLungLoss(cold_level_1_damage*cold_modifier) if(breath_temperature < cold_level_1_threshold) if(prob(20)) to_chat(H, "You feel [cold_message] in your [name]!") diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index c8ba8b622c..c4ea994650 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -34,8 +34,8 @@ if((fermi_Clone && fermi_Clone.stat != DEAD) || (fermi_Clone == null)) if(owner.mind) owner.mind.transfer_to(fermi_Clone) - owner.visible_message("Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") - fermi_Clone.visible_message("Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") + to_chat(owner, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") + to_chat(fermi_Clone, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.") fermi_Clone = null owner.remove_status_effect(src) // to_chat(owner, "[linked_extract] desperately tries to move your soul to a living body, but can't find one!") @@ -79,7 +79,16 @@ o.dropItemToGround(W, TRUE) playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1) to_chat(owner, "Your enormous breasts are way too large to fit anything over them!") - if (B.breast_values[B.size] > B.breast_values[B.prev_size]) + if (B.size == "huge") + if(prob(2)) + to_chat(H, "Your back is feeling a little sore.") + var/target = o.get_bodypart(BODY_ZONE_CHEST) + o.apply_damage(0.1, BRUTE, target) + if(!B.cached_size == B.breast_values[B.prev_size]) + o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) + o.next_move_modifier *= moveCalc + return ..() + else if (B.breast_values[B.size] > B.breast_values[B.prev_size]) o.add_movespeed_modifier("megamilk", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) o.next_move_modifier *= moveCalc else if (B.breast_values[B.size] < B.breast_values[B.prev_size]) @@ -207,21 +216,19 @@ /datum/status_effect/chem/enthrall/on_apply() var/mob/living/carbon/M = owner var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list - if(!E.creatorID) - message_admins("WARNING: FermiChem No master found in thrall, this makes me max sad.") + if(!E) + message_admins("WARNING: FermiChem: No chem found in thrall, did you bus in the chem? Someone set up the reaction incorrectly if not. Console them with a fermiplush please.") enthrallID = E.creatorID enthrallGender = E.creatorGender master = get_mob_by_key(enthrallID) - if(!E) - message_admins("WARNING: No chem found in thrall!!!!") if(!master) - message_admins("WARNING: No master! found in thrall!!!!") + message_admins("WARNING: FermiChem: No master found in thrall, did you bus in the chem? Someone set up the reaction incorrectly if not. Console them with a fermiplush please.") if(M.ckey == enthrallID) owner.remove_status_effect(src)//This shouldn't happen, but just in case redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed# //redirect_component2 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_SAY = CALLBACK(src, .proc/owner_say)))) //Do resistance calc if resist is pressed //redirect_component3 = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_HEAR = CALLBACK(src, .proc/owner_hear)))) //Do resistance calc if resist is pressed - //RegisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL, .proc/owner_say) + //RegisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL, .proc/owner_say) //to add, maybe. RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear) //Might need to add redirect component for listening too. var/obj/item/organ/brain/B = M.getorganslot(ORGAN_SLOT_BRAIN) //It's their brain! @@ -506,7 +513,7 @@ redirect_component = null UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) owner.remove_trait(TRAIT_PACIFISM, "MKUltra") - //UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) + //UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) //Should still make custom commands work after freedom, need to check. /* /datum/status_effect/chem/enthrall/mob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 8d940897d2..820b9cde66 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -139,5 +139,7 @@ H.Force_update_genitals() prev_size = size - else if (cached_size == 16.2) - to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom.")// taking both of your hands to hold!.") + else if (cached_size >= 16) + if(size != "huge") + to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a hefty [uppertext(size)]cm diameter bosom.")// taking both of your hands to hold!.") + size = "huge" diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 89251950ce..e0b56e3f8d 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -270,7 +270,7 @@ dna.species.handle_genitals(src) /mob/living/carbon/human/proc/Force_update_genitals(mob/living/carbon/human/H) //called in fermiChem - dna.species.handle_genitals(src, ignoreGenitalFlags = TRUE) + dna.species.handle_genitals(src) //dna.species.handle_breasts(src) //H.update_body() //species_traits = list(NOTRANSSTING,NOGENITALS) @@ -316,8 +316,7 @@ if(/obj/item/organ/genital/breasts) S = GLOB.breasts_shapes_list[G.shape] aroused_state = 0//Breasts don't have aroused_states, there's literally no difference in the spite. - if ((G.cached_size > 5) && (layertext == "BEHIND")) - size = "e" //I don't understand the BEHIND sprite honestly, so this is a way to just use the largest. + if(size == "huge") diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 1997df9955..b8b5be48f5 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -850,7 +850,7 @@ Buginess level: works as intended - except teleport makes sparks for some reason //M.alpha = 255//Reset addiction //antiGenetics = 255// DOesn't work for some reason? switch(current_cycle) - if(1)//Require a minimum + if(0)//Require a minimum origin = M if (G == null) G = new(get_turf(M.loc)) @@ -1072,6 +1072,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y (thats not written yet but thats the idea.) */ +//TODO rewrite code so that the low purity stuff is a seperate chem for clarity. + /datum/reagent/fermi/enthrall name = "MKUltra" id = "enthrall" @@ -1085,6 +1087,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y var/creatorGender var/creatorName var/mob/living/creator + pH = 10 /datum/reagent/fermi/enthrall/test name = "MKUltraTest" @@ -1305,6 +1308,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y overdose_threshold = 25 var/obj/item/clothing/head/hattip/hat DoNotSplit = TRUE + pH = 4 /datum/reagent/fermi/hatmium/on_mob_add(mob/living/carbon/human/M) @@ -1347,6 +1351,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y InverseChemVal = 0 var/obj/item/organ/tongue/nT DoNotSplit = TRUE + pH = 5 /datum/reagent/fermi/furranium/on_mob_life(mob/living/carbon/M) @@ -1404,6 +1409,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y ImpureChem = "naninte_b_goneTox" //If you make an inpure chem, it stalls growth InverseChemVal = 0.25 InverseChem = "naninte_b_goneTox" //At really impure vols, it just becomes 100% inverse + pH = 9 /datum/reagent/fermi/naninte_b_gone/on_mob_life(mob/living/carbon/C) //var/component/nanites/N = M.GetComponent(/datum/component/nanites) @@ -1453,6 +1459,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y name = "Acid vapour" id = "fermiAcid" description = "Someone didn't do like an otter, and add acid to water." + pH = 0 /datum/reagent/fermi/fermiAcid/on_mob_life(mob/living/carbon/C, method) var/target = C.get_bodypart(BODY_ZONE_CHEST) @@ -1490,7 +1497,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y //data = list("Big bang" = 1, "please work" = 2) addProc = TRUE -/datum/reagent/fermi/fermiTest/on_new() +/datum/reagent/fermi/fermiTest/on_new(datum/reagents/holder) ..() if(LAZYLEN(holder.reagent_list) == 1) return diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index c16cd0e4cb..4f5c986707 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -72,7 +72,7 @@ id = "eigenstate" results = list("eigenstate" = 0.1) required_reagents = list("bluespace" = 0.1, "stable_plasma" = 0.1, "sugar" = 0.1) - mix_message = "zaps brightly into existance, diffusing the energy from the localised gravity well as light" + mix_message = "the reaction zaps suddenly!" //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions OptimalTempMax = 500 // Upper end for above @@ -229,14 +229,14 @@ OptimalTempMin = 780 OptimalTempMax = 800 ExplodeTemp = 820 - OptimalpHMin = 1 - OptimalpHMax = 2 + OptimalpHMin = 12 + OptimalpHMax = 13 ReactpHLim = 2 //CatalystFact = 0 CurveSharpT = 0.5 CurveSharppH = 4 ThermicConstant = 20 - HIonRelease = 0.1 + HIonRelease = -0.1 RateUpLim = 5 FermiChem = TRUE FermiExplode = TRUE @@ -248,7 +248,7 @@ message_admins("On finish for enthral proc'd") var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list - if(!B.data) + if(!B) var/list/seen = viewers(5, get_turf(my_atom)) for(var/mob/M in seen) to_chat(M, "The reaction splutters and fails to react.") diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 1319048bc8..d07edaa9e1 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -20,6 +20,8 @@ numberOfPages-- playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1) add_fingerprint(user) + if(numberOfPages == 0) + icon_state = "pHbookletEmpty" return else to_chat(user, "[src] is empty!") diff --git a/modular_citadel/icons/obj/FermiChem.dmi b/modular_citadel/icons/obj/FermiChem.dmi index 37da7f6aca27ec3b1983b161475e11aeb878c922..b11bf83f68cd5e22695c566f66f89427f4c606c4 100644 GIT binary patch literal 3898 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 IM6N<$f@JG9F8}}l literal 1877 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 JPDHLkV1ijS^Q!;= diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi index b2496f1fc1c3b9181ef7866ec23dedbd10c29ce1..c5bbbe3808eeb79cb02e3b24526697fcb11d0ffc 100644 GIT binary patch literal 3543 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